PISTPModelExtension#
Provides convenient extension methods for common STEP model operations.
This extension adds utility methods to ISTPModel for creating standardized ISO 10303 (STEP) entities and contexts that are frequently used across various application protocols (AP203, AP214, AP242, etc.).
Methods#
createAppContext() extension#
Creates an application context instance for the current schema.
The application context identifies the application protocol and area of use. This is a required entity in STEP files that specifies which schema and protocol the data conforms to.
Typically, only one application context is needed per STEP file.
Returns an IInstance of type "application_context", or null instance if the creation fails.
Example usage:
final appContext = createAppContext();
if (!appContext.isNull) {
print('Created application context for ${schemaName[schemaEnum]}');
}
Available on ISTPModel, provided by the PISTPModelExtension extension
Implementation
IInstance createAppContext() {
try {
final appContext = createInstance(typeName: "application_context");
appContext.setAttribute(
attName: "application", schemaContentsDesc[schemaEnum] ?? '');
final appProto =
createInstance(typeName: "application_protocol_definition");
appProto.setAttribute(attName: "status", 'design');
appProto.setAttribute(
attName: "application_interpreted_model_schema_name",
schemaName[schemaEnum] ?? '');
appProto.setAttribute(
attName: "application_protocol_year",
schemaPublicationYear[schemaEnum] ?? 0);
appProto.setInstanceRef(attName: "application", appContext);
saveInstance(appProto);
saveInstance(appContext);
return appContext;
} catch (e) {
return createNullInstance();
}
}
createGeometryContext() extension#
Creates a geometric representation context with specified dimensions and uncertainty.
This method creates a geometric context that includes:
- Coordinate space dimensionality (2D, 3D, etc.)
- Unit assignments (length, angle, solid angle)
- Optional uncertainty values for geometric accuracy
Parameters:
dims: The coordinate space dimension (2 for 2D, 3 for 3D)-
lengthUncertainty: The maximum uncertainty value for geometric accuracy. If less than kEpsilon, uncertainty assignment is omitted.
Returns an IInstance representing the geometric context, or null instance if creation fails.
Example usage:
Create a 3D geometric context with 0.001mm uncertainty
final geomContext = createGeometryContext(3, 0.001);
if (!geomContext.isNull) {
print('Created 3D geometric context with uncertainty');
}
Available on ISTPModel, provided by the PISTPModelExtension extension
Implementation
IInstance createGeometryContext(int dims, double lengthUncertainty) {
try {
String id = PIComposerAPIFFI.getGuid();
IInstance lenUnit = _createMMUnit();
IInstance angUnit = _createRadianUnit();
IInstance solidAngUnit =
dims > 2 ? _createSteradianUnit() : createNullInstance();
if (lenUnit.isNull || angUnit.isNull || solidAngUnit.isNull) {
return createNullInstance();
}
IInstance? ctx;
bool hasUncertainty = false;
if (lengthUncertainty < kEpsilon) {
List<String> parts = [
"geometric_representation_context",
"global_unit_assigned_context"
];
ctx = createComplexInstance(typeNames: parts);
} else {
List<String> parts = [
"geometric_representation_context",
"global_uncertainty_assigned_context",
"global_unit_assigned_context"
];
ctx = createComplexInstance(typeNames: parts);
hasUncertainty = true;
}
// Set the general geometric part of the context
String ss = '${dims}D';
ctx.setAttribute(attName: "context_identifier", id);
ctx.setAttribute(attName: "context_type", ss);
ctx.setAttribute(attName: "coordinate_space_dimension", dims);
// Set the global units part of the context
List<ISelect> units = [];
final l = createSelect(typeName: "unit");
l.setSelectedType(typeName: "named_unit");
if (hasUncertainty) {
l.setInstanceRef(lenUnit);
} else {
l.setValue(lenUnit);
}
units.add(l);
final a = createSelect(typeName: "unit");
a.setSelectedType(typeName: "named_unit");
a.setValue(angUnit);
units.add(a);
final s = createSelect(typeName: "unit");
s.setSelectedType(typeName: "named_unit");
if (!solidAngUnit.isNull) {
s.setValue(solidAngUnit);
}
units.add(s);
ctx.setAttribute(attName: "units", units);
// Set the uncertainty value if given
if (hasUncertainty) {
IInstance umwu =
createInstance(typeName: "uncertainty_measure_with_unit");
final measureValue = createSelect(typeName: "measure_value");
measureValue.setSelectedType(typeName: "length_measure");
measureValue.setValue(lengthUncertainty);
umwu.setAttribute(attName: "value_component", measureValue);
final unit = umwu.createSelect(
attName: "unit_component", selectedType: "named_unit");
unit.setInstanceRef(lenUnit);
umwu.setAttribute(attName: "unit_component", unit);
umwu.setAttribute(attName: "name", "DISTANCE_ACCURACY_VALUE");
umwu.setAttribute(
attName: "description",
"Maximum model space distance between geometric "
"entities at asserted connectivities");
ctx.addAttribute(attName: "uncertainty", umwu);
saveInstance(lenUnit);
}
return ctx;
} catch (e) {
return createNullInstance();
}
}
createInchUnit() extension#
Creates an inch length unit with conversion factor to millimeters.
Returns an IInstance representing an inch unit as a conversion-based unit with proper conversion factor to SI units (25.4 mm per inch), or a null instance on failure.
This is useful for working with imperial measurement systems while maintaining SI unit compatibility.
Available on ISTPModel, provided by the PISTPModelExtension extension
Implementation
IInstance createInchUnit() {
try {
// Create conversion factor
final conversionFactor =
createInstance(typeName: "length_measure_with_unit");
final measureValue = createSelect(typeName: "measure_value");
measureValue.setSelectedType(typeName: "length_measure");
measureValue.setValue(25.4);
final mm = _createMMUnit();
if (mm.isNull) {
return createNullInstance();
}
final unit = createSelect(typeName: "unit");
unit.setSelectedType(typeName: "si_unit");
unit.setValue(mm);
conversionFactor.setAttribute(attName: "unit_component", unit);
conversionFactor.setAttribute(attName: "value_component", measureValue);
final inch = createComplexInstance(
typeNames: ["conversion_based_unit", "length_unit"]);
inch.setAttribute(attName: "name", "inch");
inch.setAttribute(attName: "conversion_factor", conversionFactor);
return inch;
} catch (e) {
return createNullInstance();
}
}
createProductContext() extension#
Creates a product context instance for the current schema.
A product context identifies the engineering discipline's point of view from which the data is being presented (mechanical, electrical, etc.).
Parameters:
appCtx: The application context instance handle to reference
Returns an IInstance of type "product_context", or null instance if the creation fails.
Typically, only one product context is needed per STEP file.
Available on ISTPModel, provided by the PISTPModelExtension extension
Implementation
IInstance createProductContext(IInstance appCtx) {
try {
final prodContext = createInstance(typeName: "product_context");
prodContext.setAttribute(
attName: "name", schemaContextName[schemaEnum] ?? '');
prodContext.setAttribute(
attName: "discipline_type", schemaDiscipline[schemaEnum] ?? '');
prodContext.setInstanceRef(attName: "frame_of_reference", appCtx);
return prodContext;
} catch (e) {
return createNullInstance();
}
}
createProductDefinitionContext() extension#
Creates a product definition context instance.
The product definition context identifies the life cycle stage or maturity of the data being presented (e.g., design, prototype, production).
Parameters:
appCtx: The application context instance handle to referencestage: The life cycle stage (defaults to 'design')
Returns an IInstance of type "product_definition_context", or a null instance if the creation fails.
Typically, only one product definition context is needed per STEP file.
Available on ISTPModel, provided by the PISTPModelExtension extension
Implementation
IInstance createProductDefinitionContext(IInstance appCtx,
{String stage = 'design'}) {
try {
final ctx = createInstance(typeName: "product_definition_context");
ctx.setAttribute(attName: "name", schemaContextName[schemaEnum] ?? '');
ctx.setAttribute(attName: "life_cycle_stage", stage);
ctx.setInstanceRef(attName: "frame_of_reference", appCtx);
return ctx;
} catch (e) {
return createNullInstance();
}
}
