Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: IfcSweptDiskSolidPolygonal Informal Proposition #3

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ jobs:
echo $CONDA/bin >> $GITHUB_PATH
- name: Install dependencies
run: |
conda install numpy
conda install -c conda-forge ifcopenshell
pip install behave pytest
- name: Lint with flake8
Expand Down
18 changes: 18 additions & 0 deletions features/geometry.sweptdisksolidpolygondal.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
@informal-proposition
Feature: SweptDiskSolidPolygonal

Scenario: IfcSweptDiskSolidPolygonal

Given An IfcSweptDiskSolidPolygonal
And FilletRadius = not null
And Directrix forms an open curve

Then FilletRadius has to be smaller than or equal to the length of the start and end segments of the Directrix
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please change "shall" to "must" as per #20

And FilletRadius has to be smaller than or equal to the length / 2 of the inner segments of the Directrix
Comment on lines +10 to +11
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Breadcrumbs: #20 - here is another section that should be amended accordingly if we strive for maximum reusability.


Given An IfcSweptDiskSolidPolygonal
And FilletRadius = not null
And Directrix forms a closed curve

Then FilletRadius has to be smaller than or equal to the length of all segments of the Directrix
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How come not length / 2, similarly to the open curve example?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pjanck I think you're correct. A closed curve means all segments are the "inner segments" and hence the length / 2 rule should apply. Thank you.

There are also no test cases yet for closed curve directrices.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

idem, change "shall" to "must" as per #20


81 changes: 79 additions & 2 deletions features/steps/steps.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import ast
import json
import numpy
import typing
import operator

Expand Down Expand Up @@ -58,6 +59,17 @@ class edge_use_error:
def __str__(self):
return f"On instance {fmt(self.inst)} the edge {fmt(self.edge)} was referenced {fmt(self.count)} times"

@dataclass
class edge_length_error:
inst: ifcopenshell.entity_instance
edge: typing.Any
length: float
predicate: str
requirement: float
modifier: str = ''

def __str__(self):
return f"On instance {fmt(self.inst)} the edge {fmt(self.edge)} has {self.modifier}length {self.length}. The value {self.requirement} is not {self.predicate} that that."

@dataclass
class instance_count_error:
Expand Down Expand Up @@ -159,9 +171,13 @@ def _():

@given("{attribute} = {value}")
def step_impl(context, attribute, value):
value = ast.literal_eval(value)
if value == 'not null':
pred = lambda x: x is not None
else:
value = ast.literal_eval(value)
pred = lambda x: x == value
context.instances = list(
filter(lambda inst: getattr(inst, attribute) == value, context.instances)
filter(lambda inst: pred(getattr(inst, attribute)), context.instances)
)


Expand Down Expand Up @@ -212,3 +228,64 @@ def step_impl(context, related, relating, other_entity, condition):
errors.append(instance_structure_error(inst, rel.RelatingObject))

handle_errors(context, errors)


def is_closed(seq_of_pt):
# @todo tolerance
return seq_of_pt[0] == seq_of_pt[-1]


def get_points(inst):
if inst.is_a().startswith('IfcCartesianPointList'):
return inst.CoordList
elif inst.is_a('IfcPolyline'):
return [p.Coordinates for p in inst.Points]
else:
raise NotImplementedError(f'get_points() not implemented on {inst.is_a}')


@given('{attr} forms {closed_or_open} curve')
def step_impl(context, attr, closed_or_open):
assert closed_or_open in ('a closed', 'an open')
should_be_closed = closed_or_open == 'a closed'
context.instances = list(
map(operator.itemgetter(0), filter(lambda pair: pair[1] == should_be_closed, zip(context.instances, map(is_closed, map(get_points, map(operator.attrgetter(attr), context.instances))))))
)

@then('{attr} has to be {pred} the {what} of {which} segments of the {attr2}')
def step_impl(context, attr, pred, what, which, attr2):
assert pred in ('smaller than or equal to',)
assert what in ('length', 'length / 2')
assert which in ('the start and end', 'the inner', 'all')

def slice_indices(arr):
if which == 'the start and end':
return [0, len(arr) - 1]
elif which == 'the inner':
return range(1, len(arr) - 1)
elif which == 'all':
return range(len(arr))

fn = operator.le

def _():
for inst in context.instances:
points = numpy.array(get_points(getattr(inst, attr2)))
points_shifted = points[1:]
points = points[:-1]
edges_vecs = points_shifted - points
edge_lengths = numpy.linalg.norm(edges_vecs, axis=1)
comparison_value = getattr(inst, attr)
if what == 'length / 2':
factor = 0.5
modifier = {'modifier': 'half '}
else:
factor = 1.0
modifier = {}

idxs = slice_indices(edge_lengths)
for idx, bl in filter(lambda p: p[0] in idxs, enumerate(fn(comparison_value, edge_lengths * factor))):
if not bl:
yield edge_length_error(inst, (tuple(points[idx]), tuple(points_shifted[idx])), edge_lengths[idx] * factor, pred, comparison_value, **modifier)

handle_errors(context, list(_()))
34 changes: 34 additions & 0 deletions test/files/fail-x-300mm-y-100mm-2d-indexed.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2022-09-18T14:00:05',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1663509605);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('1ti8eEl5L8S8$t$$cAW4g0',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,0.1),(0.3,0.1),(0.3,0.)));
#22=IFCSWEPTDISKSOLIDPOLYGONAL(#21,0.01,$,$,$,0.2);
#23=IFCSHAPEREPRESENTATION(#11,'Body','AdvancedSweptSolid',(#22));
#24=IFCPRODUCTDEFINITIONSHAPE($,$,(#23));
#25=IFCREINFORCINGBAR('1H7s4iuTfEZxQRUUKdXW30',$,$,$,$,$,#24,$,$,$,$,$,$,$);
ENDSEC;
END-ISO-10303-21;
38 changes: 38 additions & 0 deletions test/files/fail-x-300mm-y-100mm-2d-poly.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2022-09-18T14:00:05',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1663509605);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('20TwZINt11lfHeBRoR2YSf',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINT((0.,0.));
#22=IFCCARTESIANPOINT((0.,0.1));
#23=IFCCARTESIANPOINT((0.3,0.1));
#24=IFCCARTESIANPOINT((0.3,0.));
#25=IFCPOLYLINE((#21,#22,#23,#24));
#26=IFCSWEPTDISKSOLIDPOLYGONAL(#25,0.01,$,$,$,0.2);
#27=IFCSHAPEREPRESENTATION(#11,'Body','AdvancedSweptSolid',(#26));
#28=IFCPRODUCTDEFINITIONSHAPE($,$,(#27));
#29=IFCREINFORCINGBAR('3zHiwWY2T2gA727d9v$2ca',$,$,$,$,$,#28,$,$,$,$,$,$,$);
ENDSEC;
END-ISO-10303-21;
34 changes: 34 additions & 0 deletions test/files/fail-x-300mm-y-100mm-3d-indexed.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2022-09-18T14:00:05',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1663509605);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('2FBkm2wK5ERgmt4_WnfKyG',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINTLIST3D(((0.,0.,0.),(0.,0.1,0.),(0.3,0.1,0.),(0.3,0.,0.)));
#22=IFCSWEPTDISKSOLIDPOLYGONAL(#21,0.01,$,$,$,0.2);
#23=IFCSHAPEREPRESENTATION(#11,'Body','AdvancedSweptSolid',(#22));
#24=IFCPRODUCTDEFINITIONSHAPE($,$,(#23));
#25=IFCREINFORCINGBAR('2NEoNDRZf6UBHe4pMcspUJ',$,$,$,$,$,#24,$,$,$,$,$,$,$);
ENDSEC;
END-ISO-10303-21;
38 changes: 38 additions & 0 deletions test/files/fail-x-300mm-y-100mm-3d-poly.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2022-09-18T14:00:05',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1663509605);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('0isDH1eMrFawVply2TlmDl',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINT((0.,0.,0.));
#22=IFCCARTESIANPOINT((0.,0.1,0.));
#23=IFCCARTESIANPOINT((0.3,0.1,0.));
#24=IFCCARTESIANPOINT((0.3,0.,0.));
#25=IFCPOLYLINE((#21,#22,#23,#24));
#26=IFCSWEPTDISKSOLIDPOLYGONAL(#25,0.01,$,$,$,0.2);
#27=IFCSHAPEREPRESENTATION(#11,'Body','AdvancedSweptSolid',(#26));
#28=IFCPRODUCTDEFINITIONSHAPE($,$,(#27));
#29=IFCREINFORCINGBAR('0Ah9Bz591EwB2Z9pjYF5hK',$,$,$,$,$,#28,$,$,$,$,$,$,$);
ENDSEC;
END-ISO-10303-21;
34 changes: 34 additions & 0 deletions test/files/fail-x-300mm-y-500mm-2d-indexed.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2022-09-18T14:00:05',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1663509605);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('0WAt4fAIf1yheAfdJ0BD20',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINTLIST2D(((0.,0.),(0.,0.5),(0.3,0.5),(0.3,0.)));
#22=IFCSWEPTDISKSOLIDPOLYGONAL(#21,0.01,$,$,$,0.2);
#23=IFCSHAPEREPRESENTATION(#11,'Body','AdvancedSweptSolid',(#22));
#24=IFCPRODUCTDEFINITIONSHAPE($,$,(#23));
#25=IFCREINFORCINGBAR('237cfEV5PAgg$UI6FrLo8H',$,$,$,$,$,#24,$,$,$,$,$,$,$);
ENDSEC;
END-ISO-10303-21;
38 changes: 38 additions & 0 deletions test/files/fail-x-300mm-y-500mm-2d-poly.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2022-09-18T14:00:05',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1663509605);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('3mWksfw$12BxN3rFIvV1MF',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINT((0.,0.));
#22=IFCCARTESIANPOINT((0.,0.5));
#23=IFCCARTESIANPOINT((0.3,0.5));
#24=IFCCARTESIANPOINT((0.3,0.));
#25=IFCPOLYLINE((#21,#22,#23,#24));
#26=IFCSWEPTDISKSOLIDPOLYGONAL(#25,0.01,$,$,$,0.2);
#27=IFCSHAPEREPRESENTATION(#11,'Body','AdvancedSweptSolid',(#26));
#28=IFCPRODUCTDEFINITIONSHAPE($,$,(#27));
#29=IFCREINFORCINGBAR('0KlEzBwlTCD8weVBy323PX',$,$,$,$,$,#28,$,$,$,$,$,$,$);
ENDSEC;
END-ISO-10303-21;
34 changes: 34 additions & 0 deletions test/files/fail-x-300mm-y-500mm-3d-indexed.ifc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2022-09-18T14:00:05',(''),(''),'IfcOpenShell-0.7.0','IfcOpenShell-0.7.0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPERSON($,$,'',$,$,$,$,$);
#2=IFCORGANIZATION($,'',$,$,$);
#3=IFCPERSONANDORGANIZATION(#1,#2,$);
#4=IFCAPPLICATION(#2,'0.7.0','IfcOpenShell-0.7.0','');
#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,1663509605);
#6=IFCDIRECTION((1.,0.,0.));
#7=IFCDIRECTION((0.,0.,1.));
#8=IFCCARTESIANPOINT((0.,0.,0.));
#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
#10=IFCDIRECTION((0.,1.,0.));
#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
#20=IFCPROJECT('3J6ROiXqvBfPG86rU4VsjZ',#5,'',$,$,$,$,(#11),#19);
#21=IFCCARTESIANPOINTLIST3D(((0.,0.,0.),(0.,0.5,0.),(0.3,0.5,0.),(0.3,0.,0.)));
#22=IFCSWEPTDISKSOLIDPOLYGONAL(#21,0.01,$,$,$,0.2);
#23=IFCSHAPEREPRESENTATION(#11,'Body','AdvancedSweptSolid',(#22));
#24=IFCPRODUCTDEFINITIONSHAPE($,$,(#23));
#25=IFCREINFORCINGBAR('2npZO60pLCohZWNO4zE6D2',$,$,$,$,$,#24,$,$,$,$,$,$,$);
ENDSEC;
END-ISO-10303-21;