Skip to content

Commit

Permalink
Merge pull request #289 from buildingSMART/IVS-133-PJS003-Global-Uniq…
Browse files Browse the repository at this point in the history
…ue-Identifiers

IVS-133/PJS003 - Globally Unique Identifiers
  • Loading branch information
civilx64 authored Sep 27, 2024
2 parents b00cd69 + b34f1de commit 768aa98
Show file tree
Hide file tree
Showing 12 changed files with 1,057 additions and 10 deletions.
25 changes: 25 additions & 0 deletions features/PJS003_Globally-Unique-Identifiers.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
@implementer-agreement
@PJS
@version1
@E00010
Feature: PJS003 - Globally Unique Identifiers
The rule verifies that the GUID of each element adheres to the Global Unique Identifier format
and ensures compliance with constraints that are not yet validated by other methods.
Specifically, the characters must be within the official encoding character set
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$,"
, the resulting string must be exactly 22 characters in length, and the first character must be either 0, 1, 2, or 3.

https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcGloballyUniqueId.htm


Scenario Outline: Valid globally unique identifiers
Given An IfcRoot
Given Its attribute GlobalId

Then <Constraint>

Examples:
| Constraint |
| The string length must be exactly "22" characters |
| The characters must be within the official encoding character set |
| Its value starts with 0 or 1 or 2 or 3 |
79 changes: 69 additions & 10 deletions features/steps/givens/attributes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from behave import register_type
from utils import geometry, ifc, misc
from parse_type import TypeBuilder
from validation_handling import gherkin_ifc
from validation_handling import gherkin_ifc, register_enum_type
from . import ValidationOutcome, OutcomeSeverity

from enum import Enum, auto
Expand All @@ -22,6 +22,12 @@ class SubTypeHandling (Enum):
INCLUDE = auto()
EXCLUDE = auto()

@register_enum_type
class PrefixCondition(Enum):
STARTS = "starts"
DOES_NOT_START = "does not start"


register_type(include_or_exclude_subtypes=TypeBuilder.make_enum({"including subtypes": SubTypeHandling.INCLUDE, "excluding subtypes": SubTypeHandling.EXCLUDE }))
register_type(first_or_final=TypeBuilder.make_enum({"first": FirstOrFinal.FIRST, "final": FirstOrFinal.FINAL }))
register_type(equal_or_not_equal=TypeBuilder.make_enum({
Expand Down Expand Up @@ -140,15 +146,68 @@ def step_impl(context, inst, attribute, tail="single"):
yield ValidationOutcome(instance_id=getattr(inst, attribute, None), severity=OutcomeSeverity.PASSED)


@gherkin_ifc.step("Its {attribute} attribute {condition} with {prefix}")
def step_impl(context, inst, attribute, condition, prefix):
assert condition in ('starts', 'does not start')
if condition == 'starts':
if hasattr(inst, attribute) and str(getattr(inst, attribute, '')).startswith(prefix):
yield ValidationOutcome(instance_id=inst, severity=OutcomeSeverity.PASSED)
elif condition == 'does not start':
if hasattr(inst, attribute) and not str(getattr(inst, attribute, '')).startswith(prefix):
yield ValidationOutcome(instance_id=inst, severity=OutcomeSeverity.PASSED)
@gherkin_ifc.step("Its {attribute} attribute {prefix_condition:PrefixCondition} with {prefix}")
def step_impl(context, inst, attribute, prefix_condition, prefix):
"""
'
Given its attribute X must start with Y or Z
'
Is almost the same as
'
Given its attribute X
Its value must start with Y or Z
'
However, when navigating the context stack and there is a subsequent step,
it is sometimes preferable to include the statement within a single step.
For example;
'
(1)Given an entity IfcBuildingStorey
(2)Given its attribute X must start with Y or Z
(3)Given its relating Wall
(4)Then Some condiion
'
In this case, it is challenging to split step (2) into two separate steps and then return to the
relating Wall (step 3) of the entity in step (1). This is because the instances in the context will be
the content of the attribute X of IfcBuildingStorey rather than the storey itself."
"""
prefixes = tuple(prefix.split(' or '))
attribute_value = str(getattr(inst, attribute, ''))

if not hasattr(inst, attribute):
yield ValidationOutcome(instance_id=inst, expected=attribute, observed='not {attribute}', severity=OutcomeSeverity.ERROR)
return

condition_met = (
(prefix_condition == PrefixCondition.STARTS and attribute_value.startswith(prefixes)) or
(prefix_condition == PrefixCondition.DOES_NOT_START and not attribute_value.startswith(prefixes))
)

if condition_met:
yield ValidationOutcome(instance_id=inst, severity=OutcomeSeverity.PASSED)
else:
expected = prefixes if prefix_condition == PrefixCondition.STARTS else f'not {prefixes}'
yield ValidationOutcome(instance_id=inst, expected=expected, observed=attribute_value, severity=OutcomeSeverity.ERROR)


@gherkin_ifc.step("Its value {prefix_condition:PrefixCondition} with {prefix}")
def step_impl(context, inst, prefix_condition, prefix):
prefixes = tuple(prefix.split(' or '))
inst = str(inst)
starts_with = inst.startswith(prefixes)

if prefix_condition == PrefixCondition.STARTS:
condition_met = starts_with
expected = prefixes
elif prefix_condition == PrefixCondition.DOES_NOT_START:
condition_met = not starts_with
expected = f'not {prefixes}'

if condition_met:
yield ValidationOutcome(instance_id=inst, severity=OutcomeSeverity.PASSED)
else:
yield ValidationOutcome(instance_id=inst, expected=expected, observed=inst[0], severity=OutcomeSeverity.ERROR)


@gherkin_ifc.step('Its {ff:first_or_final} element')
Expand Down
16 changes: 16 additions & 0 deletions features/steps/thens/attributes.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,19 @@ def step_impl(context, inst, segment_type, length_attribute):
raise ValueError(f"Invalid segment_type '{segment_type}'.")


@gherkin_ifc.step('The string length must be {constraint} "{num:d}" characters')
def step_impl(context, inst, constraint, num):
if not isinstance(inst, str):
yield ValidationOutcome(inst=inst, expected='string', observed=type(inst).__name__, severity=OutcomeSeverity.ERROR)
inst = str(inst)
op = misc.stmt_to_op(constraint)
if not op(len(inst), num):
yield ValidationOutcome(inst=inst, expected=num, observed=len(inst), severity=OutcomeSeverity.ERROR)


@gherkin_ifc.step('The characters must be within the official encoding character set')
def step_impl(context, inst):
valid_chars = set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$")
invalid_guid_chars = [char for char in inst if char not in valid_chars]
if invalid_guid_chars:
yield ValidationOutcome(inst=inst, expected="^[0-9A-Za-z_$]+$", observed=invalid_guid_chars, severity=OutcomeSeverity.ERROR)
38 changes: 38 additions & 0 deletions test/files/pjs003/fail-pjs003-IFC4_3_ADD2_GuidTests.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
ISO-10303-21;
HEADER;

FILE_DESCRIPTION((''),'2;1');
FILE_NAME('','2024-06-12T09:50:55',(''),(''),'LAB','GMN3DS','');
FILE_SCHEMA(('IFC4X3_ADD2'));
ENDSEC;

DATA;

/* PROJECT CONTEXT */
#1= IFCPROJECT('2eS$fZmw9QmetNIywDEzSR',#2,'ODT',$,$,$,$,(#10),#15);
#2= IFCOWNERHISTORY(#3,#6,$,.NOCHANGE.,$,$,$,152828);
#3= IFCPERSONANDORGANIZATION(#4,#5,$);
#4= IFCPERSON($,'','ALCHEMIST',$,$,$,$,$);
#5= IFCORGANIZATION($,'LAB',$,$,$);
#6= IFCAPPLICATION(#5,'2024','GREY','REVOLT');

#10= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.0E-05,#11,$);
#11= IFCAXIS2PLACEMENT3D(#12,$,$);
#12= IFCCARTESIANPOINT((0.,0.,0.));

#15= IFCUNITASSIGNMENT((#16));
#16= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);


/* SITES AGGREGATED TO PROJECT */
#29=IFCRELAGGREGATES('2te7nJfPvJyvPEahDDrZW0',#2,'ProjectContainer',$,#1,(#29990,#30000,#30010,#30020,#30030,#30040));
#31=IFCLOCALPLACEMENT($,#11);


#29990=IFCSITE('14oxcl5LHMZQ6iCWJKpe5w',#2,'SITE_withCorrectGuid',$,$,#31,$,$,.COMPLEX.,$,$,$,$,$);
#30010=IFCSITE('14oxcl5',#2,'SITE_withIncorrectGuid','Invalid Length',$,#31,$,$,.ELEMENT.,$,$,$,$,$);
#30020=IFCSITE('1-+=cl5LHMZQ6iCWJKpe5w',#2,'SITE_withIncorrectGuid','Invalid Characters',$,#31,$,$,.PARTIAL.,$,$,$,$,$);
#30030=IFCSITE('b4oxcl5LHMZQ6iCWJKpe5w',#2,'SITE_withIncorrectGuid','Invalid Starting Character',$,#31,$,$,.COMPLEX.,$,$,$,$,$);

ENDSEC;
END-ISO-10303-21;
190 changes: 190 additions & 0 deletions test/files/pjs003/fail-pjs003-invalid_characters_ifcproject.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION (('ViewDefinition [Ifc4X3NotAssigned]'), '2;1');
FILE_NAME ('', '2021-05-31T10:35:59', (), (), 'redacted', $, $);
FILE_SCHEMA (('IFC4X3_ADD2'));
ENDSEC;

DATA;
#1 = IFCOWNERHISTORY(#2, #6, $, .NOCHANGE., $, $, $, 1622457359);
#2 = IFCPERSONANDORGANIZATION(#3, #4, $);
#3 = IFCPERSON($, 'redacted', 'redacted', $, $, $, $, $);
#4 = IFCORGANIZATION($, 'redacted', $, $, $);
#5 = IFCORGANIZATION($, 'redacted', $, $, $);
#6 = IFCAPPLICATION(#5, 'redacted', 'redacted', 'redacted');
#7 = IFCPROJECT('0A_yMRoU+BdB-FGHn1GH7s', #1, 'Test IFC Project', $, $, $, $, (#13), #8);
#8 = IFCUNITASSIGNMENT((#9, #10, #11, #12));
#9 = IFCSIUNIT(*, .LENGTHUNIT., $, .METRE.);
#10 = IFCSIUNIT(*, .AREAUNIT., $, .SQUARE_METRE.);
#11 = IFCSIUNIT(*, .VOLUMEUNIT., $, .CUBIC_METRE.);
#12 = IFCSIUNIT(*, .PLANEANGLEUNIT., $, .RADIAN.);
#13 = IFCGEOMETRICREPRESENTATIONCONTEXT($, 'Model', 3, 1.E-4, #14, #16);
#14 = IFCAXIS2PLACEMENT3D(#15, $, $);
#15 = IFCCARTESIANPOINT((0., 0., 0.));
#16 = IFCDIRECTION((0., 1.));
#17 = IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body', 'Model', *, *, *, *, #13, $, .MODEL_VIEW., $);
#18 = IFCARBITRARYCLOSEDPROFILEDEF(.AREA., 'Simple Profile', #19);
#19 = IFCINDEXEDPOLYCURVE(#20, (IFCLINEINDEX((1, 2)), IFCLINEINDEX((2, 3)), IFCLINEINDEX((3, 4)), IFCLINEINDEX((4, 1))), $);
#20 = IFCCARTESIANPOINTLIST2D(((-4., 0.), (-5., -1.), (5., -1.), (4., 0.)), $);
#24 = IFCSITE('35wH0d2VDFze34cZziHyWH', #1, 'Default Site', $, $, #25, $, $, .ELEMENT., (0, 0, 0), (0, 0, 0), 0., $, $);
#25 = IFCLOCALPLACEMENT($, #28);
#26 = IFCDIRECTION((0., 0., 1.));
#27 = IFCDIRECTION((1., 0., 0.));
#28 = IFCAXIS2PLACEMENT3D(#15, #26, #27);
#29 = IFCALIGNMENT('0qI6nq6055HgCBPMUsw303', #1, 'Test Alignment', $, $, #30, #104, $);
#30 = IFCLOCALPLACEMENT(#25, #33);
#31 = IFCDIRECTION((0., 0., 1.));
#32 = IFCDIRECTION((1., 0., 0.));
#33 = IFCAXIS2PLACEMENT3D(#15, #31, #32);
#20002 = IFCLOCALPLACEMENT(#30, #33);
#20000 = IFCPRODUCTDEFINITIONSHAPE($, $, (#20001));
#20001 = IFCSHAPEREPRESENTATION(#1001, 'Axis', 'Curve2D', (#54));
#34 = IFCALIGNMENTHORIZONTAL('2a51YNKc9CIA9mX6PHta0R', #1, $, $, $, #20002, #20000);
#35 = IFCALIGNMENTSEGMENT('2VLcO34uj1ThLg3tnDQSDu', #1, $, $, $, #1501, #1601, #36);
#36 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #37, 0., 0., 0., 400., $, .LINE.);
#37 = IFCCARTESIANPOINT((0., 0.));
#38 = IFCALIGNMENTSEGMENT('23in7RdgnF5etPmWAUg6Un', #1, $, $, $, #1501, #1611, #39);
#39 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #40, 0., 0., -500.000000000002, 150., $, .CLOTHOID.);
#40 = IFCCARTESIANPOINT((400., 0.));
#41 = IFCALIGNMENTSEGMENT('2f96e3LmrECxEoe22s5Xpd', #1, $, $, $, #1501, #1621, #42);
#42 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #43, 6.13318530717958, -500.000000000002, -500.000000000002, 400., $, .CIRCULARARC.);
#43 = IFCCARTESIANPOINT((549.662851380011, -7.48795505445));
#44 = IFCRELNESTS('3A9jueO1j2z8C76N1IFh7f', #1, 'Linear Element Nesting', $, #34, (#35, #38, #41, #1101));
#20003 = IFCLOCALPLACEMENT(#30, #33);
#20010 = IFCPRODUCTDEFINITIONSHAPE($, $, (#20011));
#20011 = IFCSHAPEREPRESENTATION(#1001, 'Axis', 'Curve3D', (#79));
#45 = IFCALIGNMENTVERTICAL('3SOdKle3DEtuUG6EbrmQpy', #1, $, $, $, #20003, #20010);
#46 = IFCALIGNMENTSEGMENT('16nyAX_5956AZO3WakpmwA', #1, $, $, $, #2501, #2601, #47);
#47 = IFCALIGNMENTVERTICALSEGMENT($, $, 0., 449.999993741124, 150., -9.99999999995544E-4, -9.99999999995544E-4, $, .CONSTANTGRADIENT.);
#48 = IFCALIGNMENTSEGMENT('3Zuiuqd_1EPuTb4o9SuLse', #1, $, $, $, #2501, #2611, #49);
#49 = IFCALIGNMENTVERTICALSEGMENT($, $, 449.999993741124, 100.000006258876, 149.550000006261, -9.99999999995544E-4, 4.44444444449813E-4, 69230.7996321627, .CIRCULARARC.);
#50 = IFCALIGNMENTSEGMENT('1ZSIbG7kLDTxDPZKyT21HX', #1, $, $, $, #2501, #2621, #51);
#51 = IFCALIGNMENTVERTICALSEGMENT($, $, 550., 400., 149.522222225005, 4.44444444449813E-4, 4.44444444449813E-4, $, .CONSTANTGRADIENT.);
#52 = IFCRELNESTS('0f0eGFsknBWxOW9inF_FLN', #1, 'Linear Element Nesting', $, #45, (#46, #48, #50, #2001));
#53 = IFCRELNESTS('0Ejb6tfov7UebksdwCEIZR', #1, 'Alignment Nesting', $, #29, (#34, #45));
#54 = IFCCOMPOSITECURVE((#55, #63, #71, #1201), .U.);
#55 = IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE., #58, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(400.), #59);
#56 = IFCCARTESIANPOINT((0., 0.));
#57 = IFCDIRECTION((1., 0.));
#58 = IFCAXIS2PLACEMENT2D(#56, #57);
#59 = IFCLINE(#60, #61);
#60 = IFCCARTESIANPOINT((0., 0.));
#61 = IFCVECTOR(#62, 1.);
#62 = IFCDIRECTION((1., 0.));
#63 = IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE., #66, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(150.), #67);
#64 = IFCCARTESIANPOINT((400., 0.));
#65 = IFCDIRECTION((1., 0.));
#66 = IFCAXIS2PLACEMENT2D(#64, #65);
#67 = IFCCLOTHOID(#70, -273.861278752584);
#68 = IFCCARTESIANPOINT((0., 0.));
#69 = IFCDIRECTION((1., 0.));
#70 = IFCAXIS2PLACEMENT2D(#68, #69);
#71 = IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE., #74, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(-400.), #75);
#72 = IFCCARTESIANPOINT((549.662851380011, -7.48795505445));
#73 = IFCDIRECTION((9.88771077936042E-1, -1.49438132473604E-1));
#74 = IFCAXIS2PLACEMENT2D(#72, #73);
#75 = IFCCIRCLE(#78, 500.000000000002);
#76 = IFCCARTESIANPOINT((0., 0.));
#77 = IFCDIRECTION((1., 0.));
#78 = IFCAXIS2PLACEMENT2D(#76, #77);
#79 = IFCGRADIENTCURVE((#80, #88, #96, #2101), .U., #54, $);
#80 = IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE., #83, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(450.000218741065), #84);
#81 = IFCCARTESIANPOINT((0., 150.));
#82 = IFCDIRECTION((9.99999500000375E-1, -9.99999499995919E-4));
#83 = IFCAXIS2PLACEMENT2D(#81, #82);
#84 = IFCLINE(#85, #86);
#85 = IFCCARTESIANPOINT((0., 0.));
#86 = IFCVECTOR(#87, 1.);
#87 = IFCDIRECTION((1., 0.));
#88 = IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE., #91, IFCLENGTHMEASURE(4.71138898071803), IFCLENGTHMEASURE(100.00001881), #92);
#89 = IFCCARTESIANPOINT((449.999993741124, 149.550000006261));
#90 = IFCDIRECTION((9.99999500000375E-1, -9.99999499995919E-4));
#91 = IFCAXIS2PLACEMENT2D(#89, #90);
#92 = IFCCIRCLE(#95, 69230.7996321627);
#93 = IFCCARTESIANPOINT((0., 0.));
#94 = IFCDIRECTION((1., 0.));
#95 = IFCAXIS2PLACEMENT2D(#93, #94);
#96 = IFCCURVESEGMENT(.CONTSAMEGRADIENTSAMECURVATURE., #99, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(400.000039506171), #100);
#97 = IFCCARTESIANPOINT((550., 149.522222225005));
#98 = IFCDIRECTION((9.99999901234583E-1, 4.44444400554072E-4));
#99 = IFCAXIS2PLACEMENT2D(#97, #98);
#100 = IFCLINE(#101, #102);
#101 = IFCCARTESIANPOINT((0., 0.));
#102 = IFCVECTOR(#103, 1.);
#103 = IFCDIRECTION((1., 0.));
/* tfk: remove the footprint representation for now in #1002 */
#104 = IFCPRODUCTDEFINITIONSHAPE($, $, (#106));
#105 = IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis', 'Model', *, *, *, *, #13, $, .MODEL_VIEW., $);
#106 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Curve3D', (#79));
#107 = IFCBUILTELEMENT('3k7$iV7T92$R$xNE9oe5R8', #1, 'SimpleProfile', $, $, #108, #115, $);
#108 = IFCLOCALPLACEMENT(#25, #114);
#109 = IFCDIRECTION((0., 0., 1.));
#110 = IFCDIRECTION((1., 0., 0.));
#114 = IFCAXIS2PLACEMENT3D(#15, #109, #110);
#115 = IFCPRODUCTDEFINITIONSHAPE($, $, (#127));
#116 = IFCSECTIONEDSOLIDHORIZONTAL(#79, (#18, #18), (#117, #119));
#117 = IFCAXIS2PLACEMENTLINEAR(#118, $, $);
#118 = IFCPOINTBYDISTANCEEXPRESSION(IFCLENGTHMEASURE(300.), $, $, $, #79);
#119 = IFCAXIS2PLACEMENTLINEAR(#120, $, $);
#120 = IFCPOINTBYDISTANCEEXPRESSION(IFCLENGTHMEASURE(600.), $, $, $, #79);
#127 = IFCSHAPEREPRESENTATION(#17, 'Body', 'AdvancedSweptSolid', (#116));
#128 = IFCRELCONTAINEDINSPATIALSTRUCTURE('0de2EMoG5C3AvNHWz3ILSb', #1, 'Container', 'Container to Contained', (#29, #107), #24);
#129 = IFCRELAGGREGATES('0PN7lKNInB_OsofZN8N0Nn', #1, 'Project Container', 'Project to Spatial Element', #7, (#24));

#1001 = IFCGEOMETRICREPRESENTATIONSUBCONTEXT('FootPrint', 'Model', *, *, *, *, #13, $, .MODEL_VIEW., $);

#1101 = IFCALIGNMENTSEGMENT('1lqBKv7Xz1Hx2tmPCGtaIa', #1, $, $, $, #1501, #1631, #1102);
#1102 = IFCALIGNMENTHORIZONTALSEGMENT($, $, #1103, -0.95, 0., 0., 0., $, .LINE.);
#1103 = IFCCARTESIANPOINT((881.65153753789, -211.03194929054));

#1201 = IFCCURVESEGMENT(.DISCONTINUOUS., #1204, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(0.), #1205);
#1202 = IFCCARTESIANPOINT((0881.65153753789, -211.03194929054));
#1203 = IFCDIRECTION((0.58168308946, -0.81341550478));
#1204 = IFCAXIS2PLACEMENT2D(#1202, #1203);
#1205 = IFCLINE(#1206, #1207);
#1206 = IFCCARTESIANPOINT((0., 0.));
#1207 = IFCVECTOR(#1208, 1.);
#1208 = IFCDIRECTION((1., 0.));

#1501 = IFCLOCALPLACEMENT($, #1502);
#1502 = IFCAXIS2PLACEMENT3D(#1503, $, $);
#1503 = IFCCARTESIANPOINT((0., 0., 0.));

#1601 = IFCPRODUCTDEFINITIONSHAPE($, $, (#1602));
#1602 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#55));
#1611 = IFCPRODUCTDEFINITIONSHAPE($, $, (#1612));
#1612 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#63));
#1621 = IFCPRODUCTDEFINITIONSHAPE($, $, (#1622));
#1622 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#71));
#1631 = IFCPRODUCTDEFINITIONSHAPE($, $, (#1632));
#1632 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#1201));

#2001 = IFCALIGNMENTSEGMENT('39fS3hA8n5YOBvYphrBOIP', #1, $, $, $, #2501, #2631, #2002);
#2002 = IFCALIGNMENTVERTICALSEGMENT($, $, 950., 0., 149.7, 4.44444444449813E-4, 4.44444444449813E-4, $, .CONSTANTGRADIENT.);

#2101 = IFCCURVESEGMENT(.DISCONTINUOUS., #2104, IFCLENGTHMEASURE(0.), IFCLENGTHMEASURE(0.), #2105);
#2102 = IFCCARTESIANPOINT((950., 149.7));
#2103 = IFCDIRECTION((9.99999901234583E-1, 4.44444400554072E-4));
#2104 = IFCAXIS2PLACEMENT2D(#2102, #2103);
#2105 = IFCLINE(#85, #86);
#2106 = IFCCARTESIANPOINT((0., 0.));
#2107 = IFCVECTOR(#2108, 1.);
#2108 = IFCDIRECTION((1., 0.));

#2501 = IFCLOCALPLACEMENT($, #2502);
#2502 = IFCAXIS2PLACEMENT3D(#2503, $, $);
#2503 = IFCCARTESIANPOINT((0., 0., 0.));

#2601 = IFCPRODUCTDEFINITIONSHAPE($, $, (#2602));
#2602 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#80));
#2611 = IFCPRODUCTDEFINITIONSHAPE($, $, (#2612));
#2612 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#88));
#2621 = IFCPRODUCTDEFINITIONSHAPE($, $, (#2622));
#2622 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#96));
#2631 = IFCPRODUCTDEFINITIONSHAPE($, $, (#2632));
#2632 = IFCSHAPEREPRESENTATION(#105, 'Axis', 'Segment', (#2101));

#3000 = IFCRELAGGREGATES('0mRn50inT2pf1XqujacVu9', #1, 'Project Container 2', 'Project to Alignment', #7, (#29));

ENDSEC;
END-ISO-10303-21;
Loading

0 comments on commit 768aa98

Please sign in to comment.