Skip to content

Commit 8bff9fa

Browse files
committed
Add descriptive XML docs for TechnicalData public API
1 parent a99d976 commit 8bff9fa

5 files changed

Lines changed: 196 additions & 2 deletions

File tree

FluentAAS/FluentAAS.Templates/TechnicalData/TechnicalDataBuilder.cs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33

44
namespace FluentAAS.Templates.TechnicalData;
55

6+
/// <summary>
7+
/// Fluent builder for composing an IDTA Technical Data submodel with typed groups,
8+
/// ECLASS semantic mapping and IEC 61360-oriented validation.
9+
/// The builder fails fast so invalid technical parameter sets are rejected during composition.
10+
/// </summary>
611
public sealed class TechnicalDataBuilder
712
{
813
private readonly IShellBuilder _shellBuilder;
@@ -29,6 +34,13 @@ internal TechnicalDataBuilder(IShellBuilder shellBuilder, string id, string idSh
2934
_idShort = idShort;
3035
}
3136

37+
/// <summary>
38+
/// Overrides the submodel identifiers used for the generated Technical Data submodel.
39+
/// This allows callers to align the template with project-specific naming and ID strategies.
40+
/// </summary>
41+
/// <param name="id">Globally unique submodel identifier.</param>
42+
/// <param name="idShort">Human-readable short identifier.</param>
43+
/// <returns>The current builder for fluent chaining.</returns>
3244
public TechnicalDataBuilder WithIds(string id, string idShort)
3345
{
3446
if (string.IsNullOrWhiteSpace(id))
@@ -46,6 +58,12 @@ public TechnicalDataBuilder WithIds(string id, string idShort)
4658
return this;
4759
}
4860

61+
/// <summary>
62+
/// Configures the strongly typed motor performance group.
63+
/// Using this method guarantees that only motor-performance properties are assigned in this group.
64+
/// </summary>
65+
/// <param name="configure">Callback that fills the motor performance properties.</param>
66+
/// <returns>The current builder for fluent chaining.</returns>
4967
public TechnicalDataBuilder WithMotorPerformance(Action<MotorPerformanceGroupBuilder> configure)
5068
{
5169
ArgumentNullException.ThrowIfNull(configure);
@@ -56,6 +74,12 @@ public TechnicalDataBuilder WithMotorPerformance(Action<MotorPerformanceGroupBui
5674
return this;
5775
}
5876

77+
/// <summary>
78+
/// Configures the strongly typed bearing characteristics group.
79+
/// This prevents accidental mixing of unrelated technical parameters.
80+
/// </summary>
81+
/// <param name="configure">Callback that fills the bearing characteristic properties.</param>
82+
/// <returns>The current builder for fluent chaining.</returns>
5983
public TechnicalDataBuilder WithBearingCharacteristics(Action<BearingCharacteristicsGroupBuilder> configure)
6084
{
6185
ArgumentNullException.ThrowIfNull(configure);
@@ -66,6 +90,14 @@ public TechnicalDataBuilder WithBearingCharacteristics(Action<BearingCharacteris
6690
return this;
6791
}
6892

93+
/// <summary>
94+
/// Validates and builds the Technical Data submodel, then attaches it to the parent shell.
95+
/// This central build step ensures required parameters, units and semantics are validated before persistence.
96+
/// </summary>
97+
/// <returns>The parent shell builder to continue composing the AAS.</returns>
98+
/// <exception cref="InvalidOperationException">
99+
/// Thrown when required properties are missing or semantic mappings are invalid.
100+
/// </exception>
69101
public IShellBuilder BuildTechnicalData()
70102
{
71103
ValidateRequiredParameters();
@@ -193,53 +225,117 @@ private sealed record PropertyAssignment(
193225
string Value,
194226
string Unit);
195227

228+
/// <summary>
229+
/// Group builder for motor performance properties.
230+
/// The API is deliberately constrained to valid motor fields for safer, more predictable template usage.
231+
/// </summary>
196232
public sealed class MotorPerformanceGroupBuilder(TechnicalDataBuilder parent)
197233
{
234+
/// <summary>
235+
/// Sets rated voltage with IEC 61360-conform unit and optional explicit semantic check.
236+
/// </summary>
237+
/// <param name="value">Numeric rated voltage value.</param>
238+
/// <param name="unit">Unit symbol (default: V).</param>
239+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
240+
/// <returns>The current motor performance builder.</returns>
198241
public MotorPerformanceGroupBuilder WithRatedVoltage(decimal value, string unit = "V", string? semanticId = null)
199242
{
200243
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.MotorPerformance, TechnicalDataIdentifiers.RatedVoltage, value, unit, semanticId);
201244
return this;
202245
}
203246

247+
/// <summary>
248+
/// Sets rated current with IEC 61360-conform unit and optional explicit semantic check.
249+
/// </summary>
250+
/// <param name="value">Numeric rated current value.</param>
251+
/// <param name="unit">Unit symbol (default: A).</param>
252+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
253+
/// <returns>The current motor performance builder.</returns>
204254
public MotorPerformanceGroupBuilder WithRatedCurrent(decimal value, string unit = "A", string? semanticId = null)
205255
{
206256
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.MotorPerformance, TechnicalDataIdentifiers.RatedCurrent, value, unit, semanticId);
207257
return this;
208258
}
209259

260+
/// <summary>
261+
/// Sets rated power with IEC 61360-conform unit and optional explicit semantic check.
262+
/// </summary>
263+
/// <param name="value">Numeric rated power value.</param>
264+
/// <param name="unit">Unit symbol (default: kW).</param>
265+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
266+
/// <returns>The current motor performance builder.</returns>
210267
public MotorPerformanceGroupBuilder WithRatedPower(decimal value, string unit = "kW", string? semanticId = null)
211268
{
212269
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.MotorPerformance, TechnicalDataIdentifiers.RatedPower, value, unit, semanticId);
213270
return this;
214271
}
215272

273+
/// <summary>
274+
/// Sets rated speed with IEC 61360-conform unit and optional explicit semantic check.
275+
/// </summary>
276+
/// <param name="value">Numeric rated speed value.</param>
277+
/// <param name="unit">Unit symbol (default: 1/min).</param>
278+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
279+
/// <returns>The current motor performance builder.</returns>
216280
public MotorPerformanceGroupBuilder WithRatedSpeed(decimal value, string unit = "1/min", string? semanticId = null)
217281
{
218282
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.MotorPerformance, TechnicalDataIdentifiers.RatedSpeed, value, unit, semanticId);
219283
return this;
220284
}
221285
}
222286

287+
/// <summary>
288+
/// Group builder for bearing characteristics.
289+
/// The focused API helps callers provide structurally valid bearing data with consistent semantics.
290+
/// </summary>
223291
public sealed class BearingCharacteristicsGroupBuilder(TechnicalDataBuilder parent)
224292
{
293+
/// <summary>
294+
/// Sets bearing inner diameter with IEC 61360-conform unit and optional explicit semantic check.
295+
/// </summary>
296+
/// <param name="value">Numeric inner diameter value.</param>
297+
/// <param name="unit">Unit symbol (default: mm).</param>
298+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
299+
/// <returns>The current bearing characteristics builder.</returns>
225300
public BearingCharacteristicsGroupBuilder WithInnerDiameter(decimal value, string unit = "mm", string? semanticId = null)
226301
{
227302
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.BearingCharacteristics, TechnicalDataIdentifiers.InnerDiameter, value, unit, semanticId);
228303
return this;
229304
}
230305

306+
/// <summary>
307+
/// Sets bearing outer diameter with IEC 61360-conform unit and optional explicit semantic check.
308+
/// </summary>
309+
/// <param name="value">Numeric outer diameter value.</param>
310+
/// <param name="unit">Unit symbol (default: mm).</param>
311+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
312+
/// <returns>The current bearing characteristics builder.</returns>
231313
public BearingCharacteristicsGroupBuilder WithOuterDiameter(decimal value, string unit = "mm", string? semanticId = null)
232314
{
233315
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.BearingCharacteristics, TechnicalDataIdentifiers.OuterDiameter, value, unit, semanticId);
234316
return this;
235317
}
236318

319+
/// <summary>
320+
/// Sets bearing width with IEC 61360-conform unit and optional explicit semantic check.
321+
/// </summary>
322+
/// <param name="value">Numeric width value.</param>
323+
/// <param name="unit">Unit symbol (default: mm).</param>
324+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
325+
/// <returns>The current bearing characteristics builder.</returns>
237326
public BearingCharacteristicsGroupBuilder WithWidth(decimal value, string unit = "mm", string? semanticId = null)
238327
{
239328
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.BearingCharacteristics, TechnicalDataIdentifiers.Width, value, unit, semanticId);
240329
return this;
241330
}
242331

332+
/// <summary>
333+
/// Sets bearing limiting speed with IEC 61360-conform unit and optional explicit semantic check.
334+
/// </summary>
335+
/// <param name="value">Numeric limiting speed value.</param>
336+
/// <param name="unit">Unit symbol (default: 1/min).</param>
337+
/// <param name="semanticId">Optional ECLASS IRDI for explicit semantic conformity check.</param>
338+
/// <returns>The current bearing characteristics builder.</returns>
243339
public BearingCharacteristicsGroupBuilder WithLimitingSpeed(decimal value, string unit = "1/min", string? semanticId = null)
244340
{
245341
parent.UpsertDecimalProperty(TechnicalDataIdentifiers.BearingCharacteristics, TechnicalDataIdentifiers.LimitingSpeed, value, unit, semanticId);

FluentAAS/FluentAAS.Templates/TechnicalData/TechnicalDataCompositionExample.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@
22

33
namespace FluentAAS.Templates.TechnicalData;
44

5+
/// <summary>
6+
/// Provides a ready-to-run composition sample for the Technical Data template.
7+
/// The example demonstrates how to build a complete AAS environment with realistic motor and bearing data.
8+
/// </summary>
59
public static class TechnicalDataCompositionExample
610
{
11+
/// <summary>
12+
/// Builds an example <see cref="IEnvironment"/> containing one shell and one Technical Data submodel.
13+
/// Integrators can use this as a reference implementation for production composition flows.
14+
/// </summary>
15+
/// <returns>A fully built AAS environment with technical parameter groups.</returns>
716
public static IEnvironment BuildMotorAndBearingExampleEnvironment()
817
{
918
var aasBuilder = AasBuilder.Create();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,58 @@
11
namespace FluentAAS.Templates.TechnicalData;
22

3+
/// <summary>
4+
/// Provides the canonical <c>idShort</c> values used by the Technical Data builder.
5+
/// Reusing these identifiers keeps generated structures consistent across projects.
6+
/// </summary>
37
public static class TechnicalDataIdentifiers
48
{
9+
/// <summary>
10+
/// Group identifier for motor performance parameters.
11+
/// </summary>
512
public const string MotorPerformance = "MotorPerformance";
13+
14+
/// <summary>
15+
/// Group identifier for bearing characteristics.
16+
/// </summary>
617
public const string BearingCharacteristics = "BearingCharacteristics";
718

19+
/// <summary>
20+
/// Identifier for rated voltage.
21+
/// </summary>
822
public const string RatedVoltage = "RatedVoltage";
23+
24+
/// <summary>
25+
/// Identifier for rated current.
26+
/// </summary>
927
public const string RatedCurrent = "RatedCurrent";
28+
29+
/// <summary>
30+
/// Identifier for rated power.
31+
/// </summary>
1032
public const string RatedPower = "RatedPower";
33+
34+
/// <summary>
35+
/// Identifier for rated speed.
36+
/// </summary>
1137
public const string RatedSpeed = "RatedSpeed";
1238

39+
/// <summary>
40+
/// Identifier for bearing inner diameter.
41+
/// </summary>
1342
public const string InnerDiameter = "InnerDiameter";
43+
44+
/// <summary>
45+
/// Identifier for bearing outer diameter.
46+
/// </summary>
1447
public const string OuterDiameter = "OuterDiameter";
48+
49+
/// <summary>
50+
/// Identifier for bearing width.
51+
/// </summary>
1552
public const string Width = "Width";
53+
54+
/// <summary>
55+
/// Identifier for bearing limiting speed.
56+
/// </summary>
1657
public const string LimitingSpeed = "LimitingSpeed";
1758
}
Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,54 @@
11
namespace FluentAAS.Templates.TechnicalData;
22

3+
/// <summary>
4+
/// Provides stable semantic identifiers for the Technical Data template.
5+
/// Using these constants helps avoid typos and ensures that created AAS elements
6+
/// are linked to the intended ECLASS/IDTA semantics.
7+
/// </summary>
38
public static class TechnicalDataSemantics
49
{
5-
// IDTA submodel template semantic ID for Technical Data (v3.0)
10+
/// <summary>
11+
/// Semantic identifier of the IDTA Technical Data submodel template (v3.0).
12+
/// </summary>
613
public const string SubmodelTechnicalData = "https://admin-shell.io/idta/TechnicalData/SubmodelTemplate/3/0";
714

8-
// ECLASS / IEC 61360 IRDIs used in the predefined catalog.
15+
/// <summary>
16+
/// ECLASS IRDI for rated voltage.
17+
/// </summary>
918
public const string RatedVoltage = "0173-1#02-BAF053#008";
19+
20+
/// <summary>
21+
/// ECLASS IRDI for rated current.
22+
/// </summary>
1023
public const string RatedCurrent = "0173-1#02-BAF054#008";
24+
25+
/// <summary>
26+
/// ECLASS IRDI for rated power.
27+
/// </summary>
1128
public const string RatedPower = "0173-1#02-BAF055#008";
29+
30+
/// <summary>
31+
/// ECLASS IRDI for rated speed.
32+
/// </summary>
1233
public const string RatedSpeed = "0173-1#02-BAF056#008";
1334

35+
/// <summary>
36+
/// ECLASS IRDI for bearing inner diameter.
37+
/// </summary>
1438
public const string InnerDiameter = "0173-1#02-AAO677#002";
39+
40+
/// <summary>
41+
/// ECLASS IRDI for bearing outer diameter.
42+
/// </summary>
1543
public const string OuterDiameter = "0173-1#02-AAO678#002";
44+
45+
/// <summary>
46+
/// ECLASS IRDI for bearing width.
47+
/// </summary>
1648
public const string Width = "0173-1#02-AAO679#002";
49+
50+
/// <summary>
51+
/// ECLASS IRDI for bearing limiting speed.
52+
/// </summary>
1753
public const string LimitingSpeed = "0173-1#02-AAO680#002";
1854
}

FluentAAS/FluentAAS.Templates/TechnicalData/TechnicalDataShellBuilderExtensions.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,20 @@
22

33
namespace FluentAAS.Templates.TechnicalData;
44

5+
/// <summary>
6+
/// Extension methods to start Technical Data composition directly from a shell builder.
7+
/// This keeps Technical Data authoring aligned with existing FluentAAS composition workflows.
8+
/// </summary>
59
public static class TechnicalDataShellBuilderExtensions
610
{
11+
/// <summary>
12+
/// Starts a <see cref="TechnicalDataBuilder"/> for the current shell.
13+
/// Callers get a focused fluent API that validates technical parameters before they are attached.
14+
/// </summary>
15+
/// <param name="shellBuilder">The shell that will receive the Technical Data submodel.</param>
16+
/// <param name="id">Unique identifier of the Technical Data submodel.</param>
17+
/// <param name="idShort">Short readable name of the Technical Data submodel.</param>
18+
/// <returns>A specialized technical data builder.</returns>
719
public static TechnicalDataBuilder AddTechnicalData(this IShellBuilder shellBuilder, string id, string idShort = "TechnicalData")
820
{
921
ArgumentNullException.ThrowIfNull(shellBuilder);

0 commit comments

Comments
 (0)