Browse Source

- Ifc: implement basic support for IfcSweptDiskSolid elements.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1287 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
aramis_acg 13 years ago
parent
commit
d7410e6f08
5 changed files with 238 additions and 106 deletions
  1. 2 1
      code/IFCCurve.cpp
  2. 106 1
      code/IFCGeometry.cpp
  3. 87 62
      code/IFCReaderGen.cpp
  4. 42 42
      code/IFCReaderGen.h
  5. 1 0
      scripts/IFCImporter/entitylist.txt

+ 2 - 1
code/IFCCurve.cpp

@@ -549,7 +549,8 @@ bool Curve :: InRange(IfcFloat u) const
 		ai_assert(range.first != std::numeric_limits<IfcFloat>::infinity() && range.second != std::numeric_limits<IfcFloat>::infinity());
 		u = range.first + fmod(u-range.first,range.second-range.first);
 	}
-	return u >= range.first && u <= range.second;
+	const IfcFloat epsilon = 1e-5;
+	return u - range.first > -epsilon && range.second - u > -epsilon;
 }
 #endif 
 

+ 106 - 1
code/IFCGeometry.cpp

@@ -451,7 +451,6 @@ void ProcessConnectedFaceSet(const IfcConnectedFaceSet& fset, TempMesh& result,
 
 
 
-
 // ------------------------------------------------------------------------------------------------
 void ProcessRevolvedAreaSolid(const IfcRevolvedAreaSolid& solid, TempMesh& result, ConversionData& conv)
 {
@@ -539,6 +538,109 @@ void ProcessRevolvedAreaSolid(const IfcRevolvedAreaSolid& solid, TempMesh& resul
 	IFCImporter::LogDebug("generate mesh procedurally by radial extrusion (IfcRevolvedAreaSolid)");
 }
 
+
+
+// ------------------------------------------------------------------------------------------------
+void ProcessSweptDiskSolid(const IfcSweptDiskSolid solid, TempMesh& result, ConversionData& conv)
+{
+	const Curve* const curve = Curve::Convert(*solid.Directrix, conv);
+	if(!curve) {
+		IFCImporter::LogError("failed to convert Directrix curve (IfcSweptDiskSolid)");
+		return;
+	}
+
+	const std::vector<IfcVector3>& in = result.verts;
+	const size_t size=in.size();
+
+	const unsigned int cnt_segments = 16;
+	const IfcFloat deltaAngle = AI_MATH_TWO_PI/cnt_segments;
+
+	const size_t samples = curve->EstimateSampleCount(solid.StartParam,solid.EndParam);
+
+	result.verts.reserve(cnt_segments * samples * 4);
+	result.vertcnt.reserve((cnt_segments - 1) * samples);
+
+	// XXX while EstimateSampleCount() works well for non-composite curves, it
+	// fails badly for composite curves that require non-uniform sampling
+	// for good results.
+	IfcFloat p = solid.StartParam, delta = (solid.EndParam-solid.StartParam)/ (samples - 1);
+
+	
+	IfcVector3 current = curve->Eval(p);
+	IfcVector3 previous = current;
+	IfcVector3 next;
+
+	IfcVector3 startvec;
+	startvec.x = 1.0f;
+	startvec.y = 1.0f;
+	startvec.z = 1.0f;
+
+	std::vector<IfcVector3> points;
+	points.reserve(cnt_segments * samples);
+
+	p += delta;
+
+	// generate circles at the sweep positions
+	for(size_t i = 0; i < samples; ++i, p += delta) {
+
+		next = curve->Eval(p);
+
+		// get a direction vector reflecting the approximate curvature (i.e. tangent)
+		IfcVector3 d = (current-previous) + (next-previous);
+	
+		d.Normalize();
+
+		// figure out an arbitrary point q so that (p-q) * d = 0,
+		// try to maximize ||(p-q)|| * ||(p_last-q_last)|| 
+		IfcVector3 q;
+		if (abs(d.x) > 1e-6) {
+			q.y = startvec.y;
+			q.z = startvec.z;
+			q.x = -(d.y * q.y + d.z * q.z) / d.x;
+		}
+		else if (abs(d.y) > 1e-6) {
+			q.x = startvec.x;
+			q.z = startvec.z;
+			q.y = -(d.x * q.x + d.z * q.z) / d.y;
+		}
+		else { // if (abs(d.z) > 1e-6) 
+			q.y = startvec.y;
+			q.x = startvec.x;
+			q.z = -(d.y * q.y + d.x * q.x) / d.z;
+		}
+
+		startvec = q;
+		q *= solid.Radius / q.Length();
+
+		// generate a rotation matrix to rotate q around d
+		IfcMatrix4 rot;
+		IfcMatrix4::Rotation(deltaAngle,d,rot);
+
+		for (unsigned int seg = 0; seg < cnt_segments; ++seg, q *= rot ) {
+			points.push_back(q + current);	
+		}
+
+		previous = current;
+		current = next;
+	}
+
+	// make quads
+	for(size_t i = 0; i < samples - 1; ++i) {
+
+		for (unsigned int seg = 0; seg < cnt_segments - 1; ++seg) {
+
+			result.verts.push_back(points[ i * cnt_segments + seg]);
+			result.verts.push_back(points[ i * cnt_segments + seg + 1]);
+			result.verts.push_back(points[ (i+1) * cnt_segments + seg + 1]);
+			result.verts.push_back(points[ (i+1) * cnt_segments + seg]);
+
+			result.vertcnt.push_back(4);
+		}
+	}
+
+	IFCImporter::LogDebug("generate mesh procedurally by sweeping a disk along a curve (IfcSweptDiskSolid)");
+}
+
 // ------------------------------------------------------------------------------------------------
 IfcMatrix3 DerivePlaneCoordinateSpace(const TempMesh& curmesh) {
 
@@ -1723,6 +1825,9 @@ bool ProcessGeometricItem(const IfcRepresentationItem& geo, std::vector<unsigned
 	else  if(const IfcSweptAreaSolid* swept = geo.ToPtr<IfcSweptAreaSolid>()) {
 		ProcessSweptAreaSolid(*swept,meshtmp,conv);
 	}   
+	else  if(const IfcSweptDiskSolid* disk = geo.ToPtr<IfcSweptDiskSolid>()) {
+		ProcessSweptDiskSolid(*disk,meshtmp,conv);
+	}   
 	else if(const IfcManifoldSolidBrep* brep = geo.ToPtr<IfcManifoldSolidBrep>()) {
 		ProcessConnectedFaceSet(brep->Outer,meshtmp,conv);
 	} 

+ 87 - 62
code/IFCReaderGen.cpp

@@ -1,8 +1,8 @@
 /*
-Open Asset Import Library (assimp)
+Open Asset Import Library (ASSIMP)
 ----------------------------------------------------------------------
 
-Copyright (c) 2006-2012, assimp team
+Copyright (c) 2006-2010, ASSIMP Development Team
 All rights reserved.
 
 Redistribution and use of this software in source and binary forms, 
@@ -18,10 +18,10 @@ following conditions are met:
   following disclaimer in the documentation and/or other
   materials provided with the distribution.
 
-* Neither the name of the assimp team, nor the names of its
+* Neither the name of the ASSIMP team, nor the names of its
   contributors may be used to endorse or promote products
   derived from this software without specific prior
-  written permission of the assimp team.
+  written permission of the ASSIMP Development Team.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
@@ -96,7 +96,6 @@ namespace {
 ,		SchemaEntry("ifcobjecttypeenum",NULL )
 ,		SchemaEntry("ifcthermalloadtypeenum",NULL )
 ,		SchemaEntry("ifcionconcentrationmeasure",NULL )
-,		SchemaEntry("ifcobjectreferenceselect",NULL )
 ,		SchemaEntry("ifcclassificationnotationselect",NULL )
 ,		SchemaEntry("ifcbsplinecurveform",NULL )
 ,		SchemaEntry("ifcelementcompositionenum",NULL )
@@ -158,6 +157,7 @@ namespace {
 ,		SchemaEntry("ifcidentifier",NULL )
 ,		SchemaEntry("ifcradioactivitymeasure",NULL )
 ,		SchemaEntry("ifcsymbolstyleselect",NULL )
+,		SchemaEntry("ifcobjectreferenceselect",NULL )
 ,		SchemaEntry("ifcrooftypeenum",NULL )
 ,		SchemaEntry("ifcreal",NULL )
 ,		SchemaEntry("ifcroleenum",NULL )
@@ -168,6 +168,7 @@ namespace {
 ,		SchemaEntry("ifcfiltertypeenum",NULL )
 ,		SchemaEntry("ifctransformertypeenum",NULL )
 ,		SchemaEntry("ifcsurfaceside",NULL )
+,		SchemaEntry("ifcspaceheatertypeenum",NULL )
 ,		SchemaEntry("ifcthermaltransmittancemeasure",NULL )
 ,		SchemaEntry("ifctubebundletypeenum",NULL )
 ,		SchemaEntry("ifclightfixturetypeenum",NULL )
@@ -239,7 +240,6 @@ namespace {
 ,		SchemaEntry("ifcvolumemeasure",NULL )
 ,		SchemaEntry("ifcbeamtypeenum",NULL )
 ,		SchemaEntry("ifcstateenum",NULL )
-,		SchemaEntry("ifcspaceheatertypeenum",NULL )
 ,		SchemaEntry("ifcsectiontypeenum",NULL )
 ,		SchemaEntry("ifcfootingtypeenum",NULL )
 ,		SchemaEntry("ifcmonetarymeasure",NULL )
@@ -379,6 +379,9 @@ namespace {
 ,		SchemaEntry("ifcpermeablecoveringoperationenum",NULL )
 ,		SchemaEntry("ifcmagneticfluxdensitymeasure",NULL )
 ,		SchemaEntry("ifcmoisturediffusivitymeasure",NULL )
+,		SchemaEntry("ifcprofiledef",&STEP::ObjectHelper<IfcProfileDef,2>::Construct )
+,		SchemaEntry("ifcparameterizedprofiledef",&STEP::ObjectHelper<IfcParameterizedProfileDef,1>::Construct )
+,		SchemaEntry("ifczshapeprofiledef",&STEP::ObjectHelper<IfcZShapeProfileDef,6>::Construct )
 ,		SchemaEntry("ifcroot",&STEP::ObjectHelper<IfcRoot,4>::Construct )
 ,		SchemaEntry("ifcobjectdefinition",&STEP::ObjectHelper<IfcObjectDefinition,0>::Construct )
 ,		SchemaEntry("ifctypeobject",&STEP::ObjectHelper<IfcTypeObject,2>::Construct )
@@ -463,7 +466,6 @@ namespace {
 ,		SchemaEntry("ifcpredefineditem",&STEP::ObjectHelper<NotImplemented,0>::Construct )
 ,		SchemaEntry("ifcpredefinedcolour",&STEP::ObjectHelper<NotImplemented,0>::Construct )
 ,		SchemaEntry("ifcdraughtingpredefinedcolour",&STEP::ObjectHelper<NotImplemented,0>::Construct )
-,		SchemaEntry("ifcprofiledef",&STEP::ObjectHelper<IfcProfileDef,2>::Construct )
 ,		SchemaEntry("ifcarbitraryclosedprofiledef",&STEP::ObjectHelper<IfcArbitraryClosedProfileDef,1>::Construct )
 ,		SchemaEntry("ifccurve",&STEP::ObjectHelper<IfcCurve,0>::Construct )
 ,		SchemaEntry("ifcconic",&STEP::ObjectHelper<IfcConic,1>::Construct )
@@ -550,6 +552,7 @@ namespace {
 ,		SchemaEntry("ifcaxis1placement",&STEP::ObjectHelper<IfcAxis1Placement,1>::Construct )
 ,		SchemaEntry("ifclightintensitydistribution",&STEP::ObjectHelper<NotImplemented,0>::Construct )
 ,		SchemaEntry("ifcpredefinedsymbol",&STEP::ObjectHelper<NotImplemented,0>::Construct )
+,		SchemaEntry("ifccolourspecification",&STEP::ObjectHelper<IfcColourSpecification,1>::Construct )
 ,		SchemaEntry("ifcstructuralpointaction",&STEP::ObjectHelper<IfcStructuralPointAction,0>::Construct )
 ,		SchemaEntry("ifcspatialstructureelement",&STEP::ObjectHelper<IfcSpatialStructureElement,2>::Construct )
 ,		SchemaEntry("ifcspace",&STEP::ObjectHelper<IfcSpace,2>::Construct )
@@ -583,7 +586,6 @@ namespace {
 ,		SchemaEntry("ifcvertex",&STEP::ObjectHelper<IfcVertex,0>::Construct )
 ,		SchemaEntry("ifcvertexpoint",&STEP::ObjectHelper<IfcVertexPoint,1>::Construct )
 ,		SchemaEntry("ifcflowinstrumenttype",&STEP::ObjectHelper<IfcFlowInstrumentType,1>::Construct )
-,		SchemaEntry("ifcparameterizedprofiledef",&STEP::ObjectHelper<IfcParameterizedProfileDef,1>::Construct )
 ,		SchemaEntry("ifcushapeprofiledef",&STEP::ObjectHelper<IfcUShapeProfileDef,8>::Construct )
 ,		SchemaEntry("ifcramp",&STEP::ObjectHelper<IfcRamp,1>::Construct )
 ,		SchemaEntry("ifcfillareastyle",&STEP::ObjectHelper<NotImplemented,0>::Construct )
@@ -869,7 +871,6 @@ namespace {
 ,		SchemaEntry("ifcrelaggregates",&STEP::ObjectHelper<IfcRelAggregates,0>::Construct )
 ,		SchemaEntry("ifcboilertype",&STEP::ObjectHelper<IfcBoilerType,1>::Construct )
 ,		SchemaEntry("ifcrelprojectselement",&STEP::ObjectHelper<NotImplemented,0>::Construct )
-,		SchemaEntry("ifccolourspecification",&STEP::ObjectHelper<IfcColourSpecification,1>::Construct )
 ,		SchemaEntry("ifccolourrgb",&STEP::ObjectHelper<IfcColourRgb,3>::Construct )
 ,		SchemaEntry("ifcrelconnectsstructuralactivity",&STEP::ObjectHelper<NotImplemented,0>::Construct )
 ,		SchemaEntry("ifcdoorstyle",&STEP::ObjectHelper<IfcDoorStyle,4>::Construct )
@@ -881,7 +882,6 @@ namespace {
 ,		SchemaEntry("ifcsensortype",&STEP::ObjectHelper<IfcSensorType,1>::Construct )
 ,		SchemaEntry("ifcairterminalboxtype",&STEP::ObjectHelper<IfcAirTerminalBoxType,1>::Construct )
 ,		SchemaEntry("ifcannotationsurfaceoccurrence",&STEP::ObjectHelper<IfcAnnotationSurfaceOccurrence,0>::Construct )
-,		SchemaEntry("ifczshapeprofiledef",&STEP::ObjectHelper<IfcZShapeProfileDef,6>::Construct )
 ,		SchemaEntry("ifcclassificationnotation",&STEP::ObjectHelper<NotImplemented,0>::Construct )
 ,		SchemaEntry("ifcrationalbeziercurve",&STEP::ObjectHelper<IfcRationalBezierCurve,1>::Construct )
 ,		SchemaEntry("ifccartesiantransformationoperator2d",&STEP::ObjectHelper<IfcCartesianTransformationOperator2D,0>::Construct )
@@ -1052,6 +1052,44 @@ template <> size_t GenericFill<NotImplemented>(const STEP::DB& db, const LIST& p
 
 
 
+// -----------------------------------------------------------------------------------------------------------
+template <> size_t GenericFill<IfcProfileDef>(const DB& db, const LIST& params, IfcProfileDef* in)
+{
+	size_t base = 0;
+	if (params.GetSize() < 2) { throw STEP::TypeError("expected 2 arguments to IfcProfileDef"); }    do { // convert the 'ProfileType' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcProfileDef,2>::aux_is_derived[0]=true; break; }
+        try { GenericConvert( in->ProfileType, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 0 to IfcProfileDef to be a `IfcProfileTypeEnum`")); }
+    } while(0);
+    do { // convert the 'ProfileName' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcProfileDef,2>::aux_is_derived[1]=true; break; }
+        if (dynamic_cast<const UNSET*>(&*arg)) break;
+        try { GenericConvert( in->ProfileName, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 1 to IfcProfileDef to be a `IfcLabel`")); }
+    } while(0);
+	return base;
+}
+// -----------------------------------------------------------------------------------------------------------
+template <> size_t GenericFill<IfcParameterizedProfileDef>(const DB& db, const LIST& params, IfcParameterizedProfileDef* in)
+{
+	size_t base = GenericFill(db,params,static_cast<IfcProfileDef*>(in));
+	if (params.GetSize() < 3) { throw STEP::TypeError("expected 3 arguments to IfcParameterizedProfileDef"); }    do { // convert the 'Position' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcParameterizedProfileDef,1>::aux_is_derived[0]=true; break; }
+        try { GenericConvert( in->Position, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 2 to IfcParameterizedProfileDef to be a `IfcAxis2Placement2D`")); }
+    } while(0);
+	return base;
+}
+// -----------------------------------------------------------------------------------------------------------
+template <> size_t GenericFill<IfcZShapeProfileDef>(const DB& db, const LIST& params, IfcZShapeProfileDef* in)
+{
+	size_t base = GenericFill(db,params,static_cast<IfcParameterizedProfileDef*>(in));
+// this data structure is not used yet, so there is no code generated to fill its members
+	return base;
+}
 // -----------------------------------------------------------------------------------------------------------
 template <> size_t GenericFill<IfcRoot>(const DB& db, const LIST& params, IfcRoot* in)
 {
@@ -1519,25 +1557,6 @@ template <> size_t GenericFill<IfcPlacement>(const DB& db, const LIST& params, I
 	return base;
 }
 // -----------------------------------------------------------------------------------------------------------
-template <> size_t GenericFill<IfcProfileDef>(const DB& db, const LIST& params, IfcProfileDef* in)
-{
-	size_t base = 0;
-	if (params.GetSize() < 2) { throw STEP::TypeError("expected 2 arguments to IfcProfileDef"); }    do { // convert the 'ProfileType' argument
-        boost::shared_ptr<const DataType> arg = params[base++];
-        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcProfileDef,2>::aux_is_derived[0]=true; break; }
-        try { GenericConvert( in->ProfileType, arg, db ); break; } 
-        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 0 to IfcProfileDef to be a `IfcProfileTypeEnum`")); }
-    } while(0);
-    do { // convert the 'ProfileName' argument
-        boost::shared_ptr<const DataType> arg = params[base++];
-        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcProfileDef,2>::aux_is_derived[1]=true; break; }
-        if (dynamic_cast<const UNSET*>(&*arg)) break;
-        try { GenericConvert( in->ProfileName, arg, db ); break; } 
-        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 1 to IfcProfileDef to be a `IfcLabel`")); }
-    } while(0);
-	return base;
-}
-// -----------------------------------------------------------------------------------------------------------
 template <> size_t GenericFill<IfcArbitraryClosedProfileDef>(const DB& db, const LIST& params, IfcArbitraryClosedProfileDef* in)
 {
 	size_t base = GenericFill(db,params,static_cast<IfcProfileDef*>(in));
@@ -2068,6 +2087,19 @@ template <> size_t GenericFill<IfcAxis1Placement>(const DB& db, const LIST& para
 	return base;
 }
 // -----------------------------------------------------------------------------------------------------------
+template <> size_t GenericFill<IfcColourSpecification>(const DB& db, const LIST& params, IfcColourSpecification* in)
+{
+	size_t base = 0;
+	if (params.GetSize() < 1) { throw STEP::TypeError("expected 1 arguments to IfcColourSpecification"); }    do { // convert the 'Name' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcColourSpecification,1>::aux_is_derived[0]=true; break; }
+        if (dynamic_cast<const UNSET*>(&*arg)) break;
+        try { GenericConvert( in->Name, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 0 to IfcColourSpecification to be a `IfcLabel`")); }
+    } while(0);
+	return base;
+}
+// -----------------------------------------------------------------------------------------------------------
 template <> size_t GenericFill<IfcStructuralPointAction>(const DB& db, const LIST& params, IfcStructuralPointAction* in)
 {
 	size_t base = GenericFill(db,params,static_cast<IfcStructuralAction*>(in));
@@ -2236,18 +2268,6 @@ template <> size_t GenericFill<IfcFlowInstrumentType>(const DB& db, const LIST&
 	return base;
 }
 // -----------------------------------------------------------------------------------------------------------
-template <> size_t GenericFill<IfcParameterizedProfileDef>(const DB& db, const LIST& params, IfcParameterizedProfileDef* in)
-{
-	size_t base = GenericFill(db,params,static_cast<IfcProfileDef*>(in));
-	if (params.GetSize() < 3) { throw STEP::TypeError("expected 3 arguments to IfcParameterizedProfileDef"); }    do { // convert the 'Position' argument
-        boost::shared_ptr<const DataType> arg = params[base++];
-        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcParameterizedProfileDef,1>::aux_is_derived[0]=true; break; }
-        try { GenericConvert( in->Position, arg, db ); break; } 
-        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 2 to IfcParameterizedProfileDef to be a `IfcAxis2Placement2D`")); }
-    } while(0);
-	return base;
-}
-// -----------------------------------------------------------------------------------------------------------
 template <> size_t GenericFill<IfcUShapeProfileDef>(const DB& db, const LIST& params, IfcUShapeProfileDef* in)
 {
 	size_t base = GenericFill(db,params,static_cast<IfcParameterizedProfileDef*>(in));
@@ -3375,7 +3395,32 @@ template <> size_t GenericFill<IfcSubContractResource>(const DB& db, const LIST&
 template <> size_t GenericFill<IfcSweptDiskSolid>(const DB& db, const LIST& params, IfcSweptDiskSolid* in)
 {
 	size_t base = GenericFill(db,params,static_cast<IfcSolidModel*>(in));
-// this data structure is not used yet, so there is no code generated to fill its members
+	if (params.GetSize() < 5) { throw STEP::TypeError("expected 5 arguments to IfcSweptDiskSolid"); }    do { // convert the 'Directrix' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        try { GenericConvert( in->Directrix, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 0 to IfcSweptDiskSolid to be a `IfcCurve`")); }
+    } while(0);
+    do { // convert the 'Radius' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        try { GenericConvert( in->Radius, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 1 to IfcSweptDiskSolid to be a `IfcPositiveLengthMeasure`")); }
+    } while(0);
+    do { // convert the 'InnerRadius' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        if (dynamic_cast<const UNSET*>(&*arg)) break;
+        try { GenericConvert( in->InnerRadius, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 2 to IfcSweptDiskSolid to be a `IfcPositiveLengthMeasure`")); }
+    } while(0);
+    do { // convert the 'StartParam' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        try { GenericConvert( in->StartParam, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 3 to IfcSweptDiskSolid to be a `IfcParameterValue`")); }
+    } while(0);
+    do { // convert the 'EndParam' argument
+        boost::shared_ptr<const DataType> arg = params[base++];
+        try { GenericConvert( in->EndParam, arg, db ); break; } 
+        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 4 to IfcSweptDiskSolid to be a `IfcParameterValue`")); }
+    } while(0);
 	return base;
 }
 // -----------------------------------------------------------------------------------------------------------
@@ -3980,19 +4025,6 @@ template <> size_t GenericFill<IfcBoilerType>(const DB& db, const LIST& params,
 	return base;
 }
 // -----------------------------------------------------------------------------------------------------------
-template <> size_t GenericFill<IfcColourSpecification>(const DB& db, const LIST& params, IfcColourSpecification* in)
-{
-	size_t base = 0;
-	if (params.GetSize() < 1) { throw STEP::TypeError("expected 1 arguments to IfcColourSpecification"); }    do { // convert the 'Name' argument
-        boost::shared_ptr<const DataType> arg = params[base++];
-        if (dynamic_cast<const ISDERIVED*>(&*arg)) { in->ObjectHelper<Assimp::IFC::IfcColourSpecification,1>::aux_is_derived[0]=true; break; }
-        if (dynamic_cast<const UNSET*>(&*arg)) break;
-        try { GenericConvert( in->Name, arg, db ); break; } 
-        catch (const TypeError& t) { throw TypeError(t.what() + std::string(" - expected argument 0 to IfcColourSpecification to be a `IfcLabel`")); }
-    } while(0);
-	return base;
-}
-// -----------------------------------------------------------------------------------------------------------
 template <> size_t GenericFill<IfcColourRgb>(const DB& db, const LIST& params, IfcColourRgb* in)
 {
 	size_t base = GenericFill(db,params,static_cast<IfcColourSpecification*>(in));
@@ -4063,13 +4095,6 @@ template <> size_t GenericFill<IfcAnnotationSurfaceOccurrence>(const DB& db, con
 	return base;
 }
 // -----------------------------------------------------------------------------------------------------------
-template <> size_t GenericFill<IfcZShapeProfileDef>(const DB& db, const LIST& params, IfcZShapeProfileDef* in)
-{
-	size_t base = GenericFill(db,params,static_cast<IfcParameterizedProfileDef*>(in));
-// this data structure is not used yet, so there is no code generated to fill its members
-	return base;
-}
-// -----------------------------------------------------------------------------------------------------------
 template <> size_t GenericFill<IfcRationalBezierCurve>(const DB& db, const LIST& params, IfcRationalBezierCurve* in)
 {
 	size_t base = GenericFill(db,params,static_cast<IfcBezierCurve*>(in));

+ 42 - 42
code/IFCReaderGen.h

@@ -1,8 +1,8 @@
 /*
-Open Asset Import Library (assimp)
+Open Asset Import Library (ASSIMP)
 ----------------------------------------------------------------------
 
-Copyright (c) 2006-2012, assimp team
+Copyright (c) 2006-2010, ASSIMP Development Team
 All rights reserved.
 
 Redistribution and use of this software in source and binary forms, 
@@ -18,10 +18,10 @@ following conditions are met:
   following disclaimer in the documentation and/or other
   materials provided with the distribution.
 
-* Neither the name of the assimp team, nor the names of its
+* Neither the name of the ASSIMP team, nor the names of its
   contributors may be used to endorse or promote products
   derived from this software without specific prior
-  written permission of the assimp team.
+  written permission of the ASSIMP Development Team.
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
@@ -149,8 +149,6 @@ namespace IFC {
     typedef ENUMERATION IfcThermalLoadTypeEnum;
     // C++ wrapper type for IfcIonConcentrationMeasure
     typedef REAL IfcIonConcentrationMeasure;
-    // C++ wrapper type for IfcObjectReferenceSelect
-    typedef SELECT IfcObjectReferenceSelect;
     // C++ wrapper type for IfcClassificationNotationSelect
     typedef SELECT IfcClassificationNotationSelect;
     // C++ wrapper type for IfcBSplineCurveForm
@@ -273,6 +271,8 @@ namespace IFC {
     typedef REAL IfcRadioActivityMeasure;
     // C++ wrapper type for IfcSymbolStyleSelect
     typedef SELECT IfcSymbolStyleSelect;
+    // C++ wrapper type for IfcObjectReferenceSelect
+    typedef SELECT IfcObjectReferenceSelect;
     // C++ wrapper type for IfcRoofTypeEnum
     typedef ENUMERATION IfcRoofTypeEnum;
     // C++ wrapper type for IfcReal
@@ -293,6 +293,8 @@ namespace IFC {
     typedef ENUMERATION IfcTransformerTypeEnum;
     // C++ wrapper type for IfcSurfaceSide
     typedef ENUMERATION IfcSurfaceSide;
+    // C++ wrapper type for IfcSpaceHeaterTypeEnum
+    typedef ENUMERATION IfcSpaceHeaterTypeEnum;
     // C++ wrapper type for IfcThermalTransmittanceMeasure
     typedef REAL IfcThermalTransmittanceMeasure;
     // C++ wrapper type for IfcTubeBundleTypeEnum
@@ -433,8 +435,6 @@ namespace IFC {
     typedef ENUMERATION IfcBeamTypeEnum;
     // C++ wrapper type for IfcStateEnum
     typedef ENUMERATION IfcStateEnum;
-    // C++ wrapper type for IfcSpaceHeaterTypeEnum
-    typedef ENUMERATION IfcSpaceHeaterTypeEnum;
     // C++ wrapper type for IfcSectionTypeEnum
     typedef ENUMERATION IfcSectionTypeEnum;
     // C++ wrapper type for IfcFootingTypeEnum
@@ -719,6 +719,9 @@ namespace IFC {
 	// IFC Entities
 	// ******************************************************************************
 
+	struct IfcProfileDef;
+	struct IfcParameterizedProfileDef;
+	struct IfcZShapeProfileDef;
 	struct IfcRoot;
 	struct IfcObjectDefinition;
 	struct IfcTypeObject;
@@ -803,7 +806,6 @@ namespace IFC {
 	typedef NotImplemented IfcPreDefinedItem; // (not currently used by Assimp)
 	typedef NotImplemented IfcPreDefinedColour; // (not currently used by Assimp)
 	typedef NotImplemented IfcDraughtingPreDefinedColour; // (not currently used by Assimp)
-	struct IfcProfileDef;
 	struct IfcArbitraryClosedProfileDef;
 	struct IfcCurve;
 	struct IfcConic;
@@ -890,6 +892,7 @@ namespace IFC {
 	struct IfcAxis1Placement;
 	typedef NotImplemented IfcLightIntensityDistribution; // (not currently used by Assimp)
 	typedef NotImplemented IfcPreDefinedSymbol; // (not currently used by Assimp)
+	struct IfcColourSpecification;
 	struct IfcStructuralPointAction;
 	struct IfcSpatialStructureElement;
 	struct IfcSpace;
@@ -923,7 +926,6 @@ namespace IFC {
 	struct IfcVertex;
 	struct IfcVertexPoint;
 	struct IfcFlowInstrumentType;
-	struct IfcParameterizedProfileDef;
 	struct IfcUShapeProfileDef;
 	struct IfcRamp;
 	typedef NotImplemented IfcFillAreaStyle; // (not currently used by Assimp)
@@ -1209,7 +1211,6 @@ namespace IFC {
 	struct IfcRelAggregates;
 	struct IfcBoilerType;
 	typedef NotImplemented IfcRelProjectsElement; // (not currently used by Assimp)
-	struct IfcColourSpecification;
 	struct IfcColourRgb;
 	typedef NotImplemented IfcRelConnectsStructuralActivity; // (not currently used by Assimp)
 	struct IfcDoorStyle;
@@ -1221,7 +1222,6 @@ namespace IFC {
 	struct IfcSensorType;
 	struct IfcAirTerminalBoxType;
 	struct IfcAnnotationSurfaceOccurrence;
-	struct IfcZShapeProfileDef;
 	typedef NotImplemented IfcClassificationNotation; // (not currently used by Assimp)
 	struct IfcRationalBezierCurve;
 	struct IfcCartesianTransformationOperator2D;
@@ -1375,6 +1375,27 @@ namespace IFC {
 
 
 
+    // C++ wrapper for IfcProfileDef
+    struct IfcProfileDef :  ObjectHelper<IfcProfileDef,2> { IfcProfileDef() : Object("IfcProfileDef") {}
+		IfcProfileTypeEnum::Out ProfileType;
+		Maybe< IfcLabel::Out > ProfileName;
+    };
+
+    // C++ wrapper for IfcParameterizedProfileDef
+    struct IfcParameterizedProfileDef : IfcProfileDef, ObjectHelper<IfcParameterizedProfileDef,1> { IfcParameterizedProfileDef() : Object("IfcParameterizedProfileDef") {}
+		Lazy< IfcAxis2Placement2D > Position;
+    };
+
+    // C++ wrapper for IfcZShapeProfileDef
+    struct IfcZShapeProfileDef : IfcParameterizedProfileDef, ObjectHelper<IfcZShapeProfileDef,6> { IfcZShapeProfileDef() : Object("IfcZShapeProfileDef") {}
+		IfcPositiveLengthMeasure::Out Depth;
+		IfcPositiveLengthMeasure::Out FlangeWidth;
+		IfcPositiveLengthMeasure::Out WebThickness;
+		IfcPositiveLengthMeasure::Out FlangeThickness;
+		Maybe< IfcPositiveLengthMeasure::Out > FilletRadius;
+		Maybe< IfcPositiveLengthMeasure::Out > EdgeRadius;
+    };
+
     // C++ wrapper for IfcRoot
     struct IfcRoot :  ObjectHelper<IfcRoot,4> { IfcRoot() : Object("IfcRoot") {}
 		IfcGloballyUniqueId::Out GlobalId;
@@ -1654,12 +1675,6 @@ namespace IFC {
 		Lazy< IfcCartesianPoint > Location;
     };
 
-    // C++ wrapper for IfcProfileDef
-    struct IfcProfileDef :  ObjectHelper<IfcProfileDef,2> { IfcProfileDef() : Object("IfcProfileDef") {}
-		IfcProfileTypeEnum::Out ProfileType;
-		Maybe< IfcLabel::Out > ProfileName;
-    };
-
     // C++ wrapper for IfcArbitraryClosedProfileDef
     struct IfcArbitraryClosedProfileDef : IfcProfileDef, ObjectHelper<IfcArbitraryClosedProfileDef,1> { IfcArbitraryClosedProfileDef() : Object("IfcArbitraryClosedProfileDef") {}
 		Lazy< IfcCurve > OuterCurve;
@@ -1997,6 +2012,11 @@ namespace IFC {
 		Maybe< Lazy< IfcDirection > > Axis;
     };
 
+    // C++ wrapper for IfcColourSpecification
+    struct IfcColourSpecification :  ObjectHelper<IfcColourSpecification,1> { IfcColourSpecification() : Object("IfcColourSpecification") {}
+		Maybe< IfcLabel::Out > Name;
+    };
+
     // C++ wrapper for IfcStructuralPointAction
     struct IfcStructuralPointAction : IfcStructuralAction, ObjectHelper<IfcStructuralPointAction,0> { IfcStructuralPointAction() : Object("IfcStructuralPointAction") {}
 
@@ -2103,11 +2123,6 @@ namespace IFC {
 		IfcFlowInstrumentTypeEnum::Out PredefinedType;
     };
 
-    // C++ wrapper for IfcParameterizedProfileDef
-    struct IfcParameterizedProfileDef : IfcProfileDef, ObjectHelper<IfcParameterizedProfileDef,1> { IfcParameterizedProfileDef() : Object("IfcParameterizedProfileDef") {}
-		Lazy< IfcAxis2Placement2D > Position;
-    };
-
     // C++ wrapper for IfcUShapeProfileDef
     struct IfcUShapeProfileDef : IfcParameterizedProfileDef, ObjectHelper<IfcUShapeProfileDef,8> { IfcUShapeProfileDef() : Object("IfcUShapeProfileDef") {}
 		IfcPositiveLengthMeasure::Out Depth;
@@ -3215,11 +3230,6 @@ namespace IFC {
 		IfcBoilerTypeEnum::Out PredefinedType;
     };
 
-    // C++ wrapper for IfcColourSpecification
-    struct IfcColourSpecification :  ObjectHelper<IfcColourSpecification,1> { IfcColourSpecification() : Object("IfcColourSpecification") {}
-		Maybe< IfcLabel::Out > Name;
-    };
-
     // C++ wrapper for IfcColourRgb
     struct IfcColourRgb : IfcColourSpecification, ObjectHelper<IfcColourRgb,3> { IfcColourRgb() : Object("IfcColourRgb") {}
 		IfcNormalisedRatioMeasure::Out Red;
@@ -3270,16 +3280,6 @@ namespace IFC {
 
     };
 
-    // C++ wrapper for IfcZShapeProfileDef
-    struct IfcZShapeProfileDef : IfcParameterizedProfileDef, ObjectHelper<IfcZShapeProfileDef,6> { IfcZShapeProfileDef() : Object("IfcZShapeProfileDef") {}
-		IfcPositiveLengthMeasure::Out Depth;
-		IfcPositiveLengthMeasure::Out FlangeWidth;
-		IfcPositiveLengthMeasure::Out WebThickness;
-		IfcPositiveLengthMeasure::Out FlangeThickness;
-		Maybe< IfcPositiveLengthMeasure::Out > FilletRadius;
-		Maybe< IfcPositiveLengthMeasure::Out > EdgeRadius;
-    };
-
     // C++ wrapper for IfcRationalBezierCurve
     struct IfcRationalBezierCurve : IfcBezierCurve, ObjectHelper<IfcRationalBezierCurve,1> { IfcRationalBezierCurve() : Object("IfcRationalBezierCurve") {}
 		ListOf< REAL, 2, 0 >::Out WeightsData;
@@ -3829,6 +3829,9 @@ namespace STEP {
 	
 #define DECL_CONV_STUB(type) template <> size_t GenericFill<IFC::type>(const STEP::DB& db, const EXPRESS::LIST& params, IFC::type* in)
 	
+	DECL_CONV_STUB(IfcProfileDef);
+	DECL_CONV_STUB(IfcParameterizedProfileDef);
+	DECL_CONV_STUB(IfcZShapeProfileDef);
 	DECL_CONV_STUB(IfcRoot);
 	DECL_CONV_STUB(IfcObjectDefinition);
 	DECL_CONV_STUB(IfcTypeObject);
@@ -3880,7 +3883,6 @@ namespace STEP {
 	DECL_CONV_STUB(IfcUnitaryEquipmentType);
 	DECL_CONV_STUB(IfcPort);
 	DECL_CONV_STUB(IfcPlacement);
-	DECL_CONV_STUB(IfcProfileDef);
 	DECL_CONV_STUB(IfcArbitraryClosedProfileDef);
 	DECL_CONV_STUB(IfcCurve);
 	DECL_CONV_STUB(IfcConic);
@@ -3943,6 +3945,7 @@ namespace STEP {
 	DECL_CONV_STUB(IfcDimensionCurve);
 	DECL_CONV_STUB(IfcBoundedCurve);
 	DECL_CONV_STUB(IfcAxis1Placement);
+	DECL_CONV_STUB(IfcColourSpecification);
 	DECL_CONV_STUB(IfcStructuralPointAction);
 	DECL_CONV_STUB(IfcSpatialStructureElement);
 	DECL_CONV_STUB(IfcSpace);
@@ -3963,7 +3966,6 @@ namespace STEP {
 	DECL_CONV_STUB(IfcVertex);
 	DECL_CONV_STUB(IfcVertexPoint);
 	DECL_CONV_STUB(IfcFlowInstrumentType);
-	DECL_CONV_STUB(IfcParameterizedProfileDef);
 	DECL_CONV_STUB(IfcUShapeProfileDef);
 	DECL_CONV_STUB(IfcRamp);
 	DECL_CONV_STUB(IfcCompositeCurve);
@@ -4150,7 +4152,6 @@ namespace STEP {
 	DECL_CONV_STUB(IfcConstructionMaterialResource);
 	DECL_CONV_STUB(IfcRelAggregates);
 	DECL_CONV_STUB(IfcBoilerType);
-	DECL_CONV_STUB(IfcColourSpecification);
 	DECL_CONV_STUB(IfcColourRgb);
 	DECL_CONV_STUB(IfcDoorStyle);
 	DECL_CONV_STUB(IfcDuctSilencerType);
@@ -4159,7 +4160,6 @@ namespace STEP {
 	DECL_CONV_STUB(IfcSensorType);
 	DECL_CONV_STUB(IfcAirTerminalBoxType);
 	DECL_CONV_STUB(IfcAnnotationSurfaceOccurrence);
-	DECL_CONV_STUB(IfcZShapeProfileDef);
 	DECL_CONV_STUB(IfcRationalBezierCurve);
 	DECL_CONV_STUB(IfcCartesianTransformationOperator2D);
 	DECL_CONV_STUB(IfcCartesianTransformationOperator2DnonUniform);

+ 1 - 0
scripts/IFCImporter/entitylist.txt

@@ -94,6 +94,7 @@ IfcSurfaceStyleRendering
 IfcSurfaceStyleShading
 IfcSurfaceStyleWithTextures
 IfcSweptAreaSolid
+IfcSweptDiskSolid
 IfcTopologicalRepresentationItem
 IfcTrimmedCurve
 IfcUnit