Skip to content

Commit

Permalink
start implementing SimpleReader
Browse files Browse the repository at this point in the history
  • Loading branch information
jriegel committed Jan 6, 2014
1 parent 4be052a commit 51b640c
Show file tree
Hide file tree
Showing 8 changed files with 58,201 additions and 1 deletion.
1,864 changes: 1,864 additions & 0 deletions data/tests/Step/as1-ac-214.stp

Large diffs are not rendered by default.

220 changes: 220 additions & 0 deletions data/tests/Step/gasket1.p21
@@ -0,0 +1,220 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('STEP conformance test data','AP203 class 6 - advanced brep'),'1');
FILE_NAME('gasket1.p21','1994-12-14 T10:00:00',
('S. Dhar','S. Jetli','M. McFarland','J. Kindrick'),
('Industrial Technology Institute',
'P.O. Box 1485',
'Ann Arbor',
'Michigan',
'48106'),'NIST Data Probe, Release March 1993','conformance test suite','K. H. Muralidhar');
FILE_SCHEMA(('CONFIG_CONTROL_DESIGN'));
ENDSEC;
DATA;
#1=PRODUCT('11113','Flat Ring Gasket','Description for part 11113',(#2));
#2=MECHANICAL_CONTEXT('detailed design',#3,'mechanical');
#3=APPLICATION_CONTEXT('Control the configuration of three dimensional design');
#300=APPLICATION_PROTOCOL_DEFINITION('AP definition status','config_control_design', 1994, #3);
#4=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#5,#8,(#1));
#5=PERSON_AND_ORGANIZATION(#6,#7);
#6=PERSON('307-10-5806','Muralidhar','K.',('H.'),$,$);
#7=ORGANIZATION('ITI-Michigan','Industrial Technology Institute','A not-for-profit engineering and research center');
#8=PERSON_AND_ORGANIZATION_ROLE('design_owner');
#9=PRODUCT_RELATED_PRODUCT_CATEGORY('detail','Part Type for product 11113',(#1));
#10=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('A','Description of version with specified source for part 11113',#1,.BOUGHT.);
#11=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#13,#15,(#10));
#13=PERSON_AND_ORGANIZATION(#14,#7);
#14=PERSON('302-30-6149','Quadir','Nur',$,$,$);
#15=PERSON_AND_ORGANIZATION_ROLE('creator');
#44=CC_DESIGN_APPROVAL(#45,(#10));
#45=APPROVAL(#46,'Approved as initial STEP test case part');
#46=APPROVAL_STATUS('approved');
#47=APPROVAL_DATE_TIME(#48,#45);
#48=DATE_AND_TIME(#50,#51);
#50=CALENDAR_DATE(1993,17,7);
#51=LOCAL_TIME(13,29,52.0,#29);
#69=APPROVAL_PERSON_ORGANIZATION(#70,#45,#72);
#70=PERSON_AND_ORGANIZATION(#71,#7);
#71=PERSON('574-20-7069','Kindrick','James',$,$,$);
#72=APPROVAL_ROLE('Authorize part release');
#31=CC_DESIGN_SECURITY_CLASSIFICATION(#32,(#10));
#32=SECURITY_CLASSIFICATION('1993-C1','open availability of STEP test data',#33);
#33=SECURITY_CLASSIFICATION_LEVEL('unclassified');
#34=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#35,#39,(#32));
#35=DATE_AND_TIME(#36,#37);
#36=CALENDAR_DATE(1993,17,7);
#37=LOCAL_TIME(13,45,20.0,#29);
#39=DATE_TIME_ROLE('classification_date');
#40=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#41,#43,(#32));
#41=PERSON_AND_ORGANIZATION(#42,#7);
#42=PERSON('412-89-3456','Dhar','Shantanu',$,('Mr.'),$);
#43=PERSON_AND_ORGANIZATION_ROLE('classification_officer');
#53=CC_DESIGN_APPROVAL(#54,(#32));
#54=APPROVAL(#55,'Approved as unclassified step test data');
#55=APPROVAL_STATUS('approved');
#56=APPROVAL_DATE_TIME(#57,#54);
#57=DATE_AND_TIME(#58,#59);
#58=CALENDAR_DATE(1993,17,7);
#59=LOCAL_TIME(13,47,28.0,#29);
#73=APPROVAL_PERSON_ORGANIZATION(#74,#54,#76);
#74=PERSON_AND_ORGANIZATION(#75,#7);
#75=PERSON('525-94-5792','Matthews','Robert',('S.'),$,$);
#76=APPROVAL_ROLE('Authorize the security code');
#17=PRODUCT_DEFINITION('D1','Detailed drawing as planned for conformance testing',#10,#18);
#18=DESIGN_CONTEXT('detailed design',#3,'design');
#19=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#13,#23,(#17));
#23=PERSON_AND_ORGANIZATION_ROLE('creator');
#24=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#25,#30,(#17));
#25=DATE_AND_TIME(#27,#28);
#27=CALENDAR_DATE(1993,19,7);
#28=LOCAL_TIME(19,46,55.0,#29);
#29=COORDINATED_UNIVERSAL_TIME_OFFSET(8,$,.BEHIND.);
#30=DATE_TIME_ROLE('creation_date');
#61=CC_DESIGN_APPROVAL(#62,(#17));
#62=APPROVAL(#63,'Approved as STEP conformance testing drawing');
#63=APPROVAL_STATUS('approved');
#64=APPROVAL_DATE_TIME(#65,#62);
#65=DATE_AND_TIME(#66,#67);
#66=CALENDAR_DATE(1993,19,7);
#67=LOCAL_TIME(19,47,51.0,#29);
#77=APPROVAL_PERSON_ORGANIZATION(#70,#62,#79);
#79=APPROVAL_ROLE('Authorize product definition');
#80=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#81,#84,(#10,#1010));
#81=PERSON_AND_ORGANIZATION(#82,#83);
#82=PERSON('CDI-2','Dwaraka','B.',('K.'),$,$);
#83=ORGANIZATION('CDI','Contract Design, Inc.','Contract engineering organization.');
#84=PERSON_AND_ORGANIZATION_ROLE('design_supplier');
#88=SUPPLIED_PART_RELATIONSHIP('design','design supplier','The supplier provides detailed designs',#17,#1017);
#85=CC_DESIGN_CERTIFICATION(#86,(#88));
#86=CERTIFICATION('ISO-9000 certified design supplier','quality control',#87);
#87=CERTIFICATION_TYPE('design_supplier');
#89=CC_DESIGN_APPROVAL(#90,(#86));
#90=APPROVAL(#91,'Approved as ISO-9000 certified supplier');
#91=APPROVAL_STATUS('approved');
#92=APPROVAL_PERSON_ORGANIZATION(#70,#90,#93);
#93=APPROVAL_ROLE('Authorize supplier certification');
#94=DATE_AND_TIME(#95,#96);
#95=CALENDAR_DATE(1993,20,4);
#96=LOCAL_TIME(15,47,51.0,#29);
#97=APPROVAL_DATE_TIME(#94,#90);
#98=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#100,#102,(#86));
#99=CALENDAR_DATE(1993,19,4);
#100=DATE_AND_TIME(#99,#101);
#101=LOCAL_TIME(10,41,59.0,#29);
#102=DATE_TIME_ROLE('certification_date');
#1010=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('S-1','For Flat Ring Gasket',#1,.MADE.);
#1011=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#1013,#1016,(#1010));
#1013=PERSON_AND_ORGANIZATION(#1014,#83);
#1014=PERSON('CDI-1','Brandenberg','Chad',$,$,$);
#1016=PERSON_AND_ORGANIZATION_ROLE('creator');
#1044=CC_DESIGN_APPROVAL(#1045,(#1010));
#1045=APPROVAL(#1046,'Approved as test part design');
#1046=APPROVAL_STATUS('approved');
#1047=APPROVAL_DATE_TIME(#1048,#1045);
#1048=DATE_AND_TIME(#1050,#1051);
#1050=CALENDAR_DATE(1993,19,7);
#1051=LOCAL_TIME(19,51,59.0,#29);
#1069=APPROVAL_PERSON_ORGANIZATION(#1070,#1045,#1072);
#1070=PERSON_AND_ORGANIZATION(#82,#83);
#1072=APPROVAL_ROLE('Authorize part version');
#1031=CC_DESIGN_SECURITY_CLASSIFICATION(#1032,(#1010));
#1032=SECURITY_CLASSIFICATION('1993-C2','open availability of test part designs',#1033);
#1033=SECURITY_CLASSIFICATION_LEVEL('unclassified');
#1034=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#1035,#1039,(#1032));
#1035=DATE_AND_TIME(#1036,#1037);
#1036=CALENDAR_DATE(1993,19,7);
#1037=LOCAL_TIME(19,45,41.0,#29);
#1039=DATE_TIME_ROLE('classification_date');
#1040=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#1041,#1043,(#1032));
#1041=PERSON_AND_ORGANIZATION(#1042,#83);
#1042=PERSON('CDI-3','Sauter','Mitch',$,$,$);
#1043=PERSON_AND_ORGANIZATION_ROLE('classification_officer');
#1053=CC_DESIGN_APPROVAL(#1054,(#1032));
#1054=APPROVAL(#1055,'Approved as unclassified part design');
#1055=APPROVAL_STATUS('approved');
#1056=APPROVAL_DATE_TIME(#1057,#1054);
#1057=DATE_AND_TIME(#1058,#1059);
#1058=CALENDAR_DATE(1993,19,7);
#1059=LOCAL_TIME(19,47,58.0,#29);
#1073=APPROVAL_PERSON_ORGANIZATION(#81,#1054,#1076);
#1076=APPROVAL_ROLE('Authorize the security code');
#1017=PRODUCT_DEFINITION('D2','Description of product for part 11113',#1010,#1018);
#1018=DESIGN_CONTEXT('detailed design',#3,'design');
#1019=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#1013,#1023,(#1017));
#1023=PERSON_AND_ORGANIZATION_ROLE('creator');
#1024=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#1025,#1030,(#1017));
#1025=DATE_AND_TIME(#1027,#1028);
#1027=CALENDAR_DATE(1993,18,7);
#1028=LOCAL_TIME(10,51,59.0,#29);
#1030=DATE_TIME_ROLE('creation_date');
#1061=CC_DESIGN_APPROVAL(#1062,(#1017));
#1062=APPROVAL(#1063,'Approved as detailed drawing');
#1063=APPROVAL_STATUS('approved');
#1064=APPROVAL_DATE_TIME(#1065,#1062);
#1065=DATE_AND_TIME(#1066,#1067);
#1066=CALENDAR_DATE(1993,19,7);
#1067=LOCAL_TIME(19,51,59.0,#29);
#1077=APPROVAL_PERSON_ORGANIZATION(#81,#1062,#1079);
#1079=APPROVAL_ROLE('Authorize product definition');

#1080=SHAPE_DEFINITION_REPRESENTATION(#1081,#9240);
#1081=PRODUCT_DEFINITION_SHAPE('ABR_Shape','Shape of Flat Ring Gasket',#17);
#9040 =(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));
#9041 =(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.));
#9042 =(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT());
#9043 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.000001),#9040);
#9100 = CARTESIAN_POINT('CartPt1',(0.0,0.0,0.0));
#9101 = DIRECTION('Dir1',(1.0,0.0,0.0));
#9103 = DIRECTION('Dir3',(0.0,0.0,1.0));
#9120 = AXIS2_PLACEMENT_3D('Ax2P3D1',#9100,#9103,#9101);
#9121 = PLANE('Plane1',#9120);
#9122 = CIRCLE('Circ1',#9120,30.0);
#9123 = CARTESIAN_POINT('CartPt2',(30.0,0.0,0.0));
#9124 = VERTEX_POINT('VertPt1',#9123);
#9125 = EDGE_CURVE('EdgeCur1',#9124,#9124,#9122,.T.);
#9126 = ORIENTED_EDGE('OriEdge1',*,*,#9125,.T.);
#9127 = EDGE_LOOP('EdgeLoop1',(#9126));
#9128 = FACE_BOUND('FaceBnd1',#9127,.F.);
#9130 = CIRCLE('Circ2',#9120,25.0);
#9131 = CARTESIAN_POINT('CartPt3',(25.0,0.0,0.0));
#9132 = VERTEX_POINT('VertPt2',#9131);
#9133 = EDGE_CURVE('EdgeCur2',#9132,#9132,#9130,.T.);
#9134 = ORIENTED_EDGE('OriEdge2',*,*,#9133,.T.);
#9135 = EDGE_LOOP('EdgeLoop2',(#9134));
#9136 = FACE_BOUND('FaceBnd2',#9135,.T.);
#9137 = ADVANCED_FACE('AdvFace1',(#9136,#9128),#9121,.F.);
#9140 = CARTESIAN_POINT('CartPt4',(0.0,0.0,5.0));
#9141 = AXIS2_PLACEMENT_3D('Ax2P3D2',#9140,#9103,#9101);
#9142 = PLANE('Plane2',#9141);
#9143 = CIRCLE('Circ3',#9141,30.0);
#9144 = CARTESIAN_POINT('CartPt5',(30.0,0.0,5.0));
#9145 = VERTEX_POINT('VertPt3',#9144);
#9146 = EDGE_CURVE('EdgeCur3',#9145,#9145,#9143,.T.);
#9147 = ORIENTED_EDGE('OriEdge3',*,*,#9146,.T.);
#9148 = EDGE_LOOP('EdgeLoop3',(#9147));
#9149 = FACE_BOUND('FaceBnd3',#9148,.T.);
#9160 = CIRCLE('Circ4',#9141,25.0);
#9161 = CARTESIAN_POINT('CartPt6',(25.0,0.0,5.0));
#9162 = VERTEX_POINT('VertPt4',#9161);
#9163 = EDGE_CURVE('EdgeCur4',#9162,#9162,#9160,.T.);
#9164 = ORIENTED_EDGE('OriEdge4',*,*,#9163,.T.);
#9165 = EDGE_LOOP('EdgeLoop4',(#9164));
#9166 = FACE_BOUND('FaceBnd4',#9165,.F.);
#9167 = ADVANCED_FACE('AdvFace2',(#9149,#9166),#9142,.T.);
#9180 = CYLINDRICAL_SURFACE('CylSur1',#9120,30.0);
#9190 = FACE_BOUND('FaceBnd5',#9127,.T.);
#9191 = FACE_BOUND('FaceBnd6',#9148,.F.);
#9192 = ADVANCED_FACE('AdvFace3',(#9190,#9191),#9180,.T.);
#9200 = CYLINDRICAL_SURFACE('CylSur2',#9120,25.0);
#9201 = FACE_BOUND('FaceBnd7',#9135,.F.);
#9202 = FACE_BOUND('FaceBnd8',#9165,.T.);
#9203 = ADVANCED_FACE('AdvFace4',(#9201,#9202),#9200,.F.);
#9210 = CLOSED_SHELL('CloseSh1',(#9137,#9167,#9192,#9203));
#9220 = MANIFOLD_SOLID_BREP('ManSolBrep1',#9210);
#9230 = (GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#9043))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#9040,#9041,#9042))
REPRESENTATION_CONTEXT('CONTEXT for advanced brep test case gasket','This is a 3d context using millimeters for linear dimension'));
#9240 = ADVANCED_BREP_SHAPE_REPRESENTATION('ABShapeRep1',(#9220),#9230);
ENDSEC;
END-ISO-10303-21;
71 changes: 71 additions & 0 deletions data/tests/Step/geometry_out.stp
@@ -0,0 +1,71 @@
ISO-10303-21;
HEADER;
/* Generated by software containing ST-Developer
* from STEP Tools, Inc. (www.steptools.com)
*/

FILE_DESCRIPTION(
/* description */ ('Empty Shape Representation Sample File'),
/* implementation_level */ '2;1');

FILE_NAME(
/* name */ 'output_file',
/* time_stamp */ '2005-11-07T17:37:07-05:00',
/* author */ (''),
/* organization */ (''),
/* preprocessor_version */ 'ST-DEVELOPER v11',
/* originating_system */ 'Geometry Demo',
/* authorisation */ '');

FILE_SCHEMA (('AUTOMOTIVE_DESIGN'));
ENDSEC;

DATA;
#10=AXIS2_PLACEMENT_3D('orientation',#11,$,$);
#11=CARTESIAN_POINT('',(1.1,2.2,3.3));
#12=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-006),#14,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted co
nnectivities');
#13=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#12))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#14,#16,#19))
REPRESENTATION_CONTEXT('ID1','3D')
);
#14=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.MILLI.,.METRE.)
);
#15=DIMENSIONAL_EXPONENTS(0.,0.,0.,0.,0.,0.,0.);
#16=(
CONVERSION_BASED_UNIT('degree',#18)
NAMED_UNIT(#15)
PLANE_ANGLE_UNIT()
);
#17=(
NAMED_UNIT(*)
PLANE_ANGLE_UNIT()
SI_UNIT($,.RADIAN.)
);
#18=MEASURE_WITH_UNIT(PLANE_ANGLE_MEASURE(0.01745329252),#17);
#19=(
NAMED_UNIT(*)
SI_UNIT($,.STERADIAN.)
SOLID_ANGLE_UNIT()
);
#20=SHAPE_DEFINITION_REPRESENTATION(#21,#22);
#21=PRODUCT_DEFINITION_SHAPE('',$,#24);
#22=SHAPE_REPRESENTATION('',(#10),#13);
#23=PRODUCT_DEFINITION_CONTEXT('3D Mechanical Parts',#27,'design');
#24=PRODUCT_DEFINITION('design','example product_definition',#25,#23);
#25=PRODUCT_DEFINITION_FORMATION('1.0','first version of our widget',#29);
#26=APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2003,#27);
#27=APPLICATION_CONTEXT(
'Core Data for Automotive Mechanical Design Process');
#28=PRODUCT_CONTEXT('3D Mechanical Parts',#27,'mechanical');
#29=PRODUCT('1234-K789','widget','a fictional product',(#28));
ENDSEC;
END-ISO-10303-21;
103 changes: 103 additions & 0 deletions src/Mod/Import/App/SCL/SimpleReader.py
@@ -0,0 +1,103 @@
# Copyright (c) 2014, Juergen Riegel (FreeCAD@juergen-riegel.net)
# Copyright (c) 2011, Thomas Paviot (tpaviot@gmail.com)
# All rights reserved.

# This file is part of the StepClassLibrary (SCL).
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# Neither the name of the <ORGANIZATION> nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.

# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.
# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"""Simple Part21 STEP reader
Reads a given STEP file. Maps the enteties and instaciate the
corosbonding classes.
In addition it writes out a graphwiz file with the entity graph.
"""

import Part21,sys



__title__="Simple Part21 STEP reader"
__author__ = "Juergen Riegel, Thomas Paviot"
__url__ = "http://www.freecadweb.org"
__version__ = "0.1 (Jan 2014)"



class SimpleParser:
"""
Loads all instances definition of a Part21 file into memory.
Two dicts are created:
self._instance_definition : stores attibutes, key is the instance integer id
self._number_of_ancestors : stores the number of ancestors of entity id. This enables
to define the order of instances creation.
"""
def __init__(self, filename):
import time
import sys
self._p21loader = Part21.Part21Parser("gasket1.p21")
self.schemaModule = None
self.schemaClasses = None

def instaciate(self):
"""Instaciate the python classe from the enteties"""
import inspect
# load the needed schema module
if self._p21loader.get_schema_name() == 'config_control_design':
import config_control_design
self.schemaModule = config_control_design
if self._p21loader.get_schema_name() == 'automotive_design':
import automotive_design
self.schemaModule = automotive_design

if self.schemaModule:
self.schemaClasses = dict(inspect.getmembers(self.schemaModule))

for number_of_ancestor in self._p21loader._number_of_ancestors.keys():
for entity_definition_id in self._p21loader._number_of_ancestors[number_of_ancestor]:
#print entity_definition_id,':',self._p21loader._instances_definition[entity_definition_id]
self.create_entity_instance(entity_definition_id)

def create_entity_instance(self, instance_id):
instance_definition = self._p21loader._instances_definition[instance_id]
print "Instance definition to process",instance_definition
# first find class name
class_name = instance_definition[0].lower()
print "Class name:%s"%class_name

if not class_name=='':
object_ = self.schemaClasses[class_name]
# then attributes
print object_.__doc__
#instance_attributes = instance_definition[1]
#print "instance_attributes:",instance_attributes
#a = object_(*instance_attributes)

if __name__ == "__main__":
sys.path.append('..') # path where config_control_design.py is found
parser = SimpleParser("gasket1.p21") # simple test file
parser.instaciate()

0 comments on commit 51b640c

Please sign in to comment.