diff --git a/3d-viewer/3d_read_mesh.cpp b/3d-viewer/3d_read_mesh.cpp index c91b2ff859..11f356f8e9 100644 --- a/3d-viewer/3d_read_mesh.cpp +++ b/3d-viewer/3d_read_mesh.cpp @@ -41,16 +41,17 @@ // Imported function: extern void Set_Object_Data( std::vector< S3D_VERTEX >& aVertices, double aBiuTo3DUnits ); -S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster, - const wxString aExtension ) + +S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster, + const wxString aExtension ) { if ( aExtension == wxT( "x3d" ) ) { - return new X3D_MODEL_PARSER(aMaster); + return new X3D_MODEL_PARSER( aMaster ); } else if ( aExtension == wxT( "wrl" ) ) { - return new VRML_MODEL_PARSER(aMaster); + return new VRML_MODEL_PARSER( aMaster ); } else { @@ -58,6 +59,7 @@ S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster, } } + int S3D_MASTER::ReadData() { wxFileName fn; @@ -69,16 +71,17 @@ int S3D_MASTER::ReadData() } wxString shape3DNname = m_Shape3DName; + #ifdef __WINDOWS__ - shape3DNname.Replace( wxT("/"), wxT("\\") ); + shape3DNname.Replace( wxT( "/" ), wxT( "\\" ) ); #else - shape3DNname.Replace( wxT("\\"), wxT("/") ); + shape3DNname.Replace( wxT( "\\" ), wxT( "/" ) ); #endif if( wxFileName::FileExists( shape3DNname ) ) { FullFilename = shape3DNname; - fn.Assign(FullFilename); + fn.Assign( FullFilename ); } else { @@ -94,14 +97,15 @@ int S3D_MASTER::ReadData() } wxString extension = fn.GetExt(); - S3D_MODEL_PARSER* parser = S3D_MODEL_PARSER::Create(this, extension); - if(parser) + S3D_MODEL_PARSER* parser = S3D_MODEL_PARSER::Create( this, extension ); + + if( parser ) { - parser->Load(FullFilename); + parser->Load( FullFilename ); delete parser; return 0; - } - else + } + else { wxLogDebug( wxT( "Unknown file type <%s>" ), GetChars( extension ) ); } @@ -109,6 +113,7 @@ int S3D_MASTER::ReadData() return -1; } + int STRUCT_3D_SHAPE::ReadData( FILE* file, int* LineNum ) { char line[512]; diff --git a/3d-viewer/modelparsers.h b/3d-viewer/modelparsers.h index 55e2dc738e..7153c21ba2 100644 --- a/3d-viewer/modelparsers.h +++ b/3d-viewer/modelparsers.h @@ -49,8 +49,8 @@ class X3D_MODEL_PARSER; class S3D_MODEL_PARSER { public: - S3D_MODEL_PARSER(S3D_MASTER* aMaster) - :master(aMaster) + S3D_MODEL_PARSER(S3D_MASTER* aMaster) : + master( aMaster ) {} virtual ~S3D_MODEL_PARSER() @@ -64,19 +64,18 @@ public: /** * Function Create * Factory method for creating concrete 3D model parsers - * Notice that the caller is responible to delete created parser. + * Notice that the caller is responsible to delete created parser. * * @param aMaster is master object that the parser will fill. * @param aExtension is file extension of the file you are going to parse. */ - static S3D_MODEL_PARSER* Create( S3D_MASTER* aMaster, - const wxString aExtension ); + static S3D_MODEL_PARSER* Create( S3D_MASTER* aMaster, const wxString aExtension ); /** * Function Load * * Concrete parsers should implement this function */ - virtual void Load(const wxString aFilename) = 0; + virtual void Load( const wxString aFilename ) = 0; private: S3D_MASTER* master; @@ -92,9 +91,9 @@ class wxXmlNode; class X3D_MODEL_PARSER: public S3D_MODEL_PARSER { public: - X3D_MODEL_PARSER(S3D_MASTER* aMaster); + X3D_MODEL_PARSER( S3D_MASTER* aMaster ); ~X3D_MODEL_PARSER(); - void Load(const wxString aFilename); + void Load( const wxString aFilename ); typedef std::map< wxString, wxString > PROPERTY_MAP; typedef std::vector< wxXmlNode* > NODE_LIST; @@ -107,8 +106,7 @@ public: * @param aName is the name of node you try to find * @param aResult contains found nodes */ - static void GetChildsByName(wxXmlNode* aParent, const wxString aName, - NODE_LIST& aResult); + static void GetChildsByName( wxXmlNode* aParent, const wxString aName, NODE_LIST& aResult ); /** * Function GetNodeProperties @@ -116,7 +114,7 @@ public: * * @param aProps contains map of found properties */ - static void GetNodeProperties(wxXmlNode* aNode, PROPERTY_MAP& aProps); + static void GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps ); /** * Return string representing x3d file in vrml format @@ -126,17 +124,16 @@ public: wxString VRML_representation(); private: - std::vector vrml_materials; - std::vector vrml_points; - std::vector vrml_coord_indexes; + std::vector< wxString > vrml_materials; + std::vector< wxString > vrml_points; + std::vector< wxString > vrml_coord_indexes; void readTransform( wxXmlNode* aTransformNode ); void readMaterial( wxXmlNode* aMatNode ); - void readIndexedFaceSet( wxXmlNode* aFaceNode, - PROPERTY_MAP& aTransfromProps ); + void readIndexedFaceSet( wxXmlNode* aFaceNode, PROPERTY_MAP& aTransfromProps ); bool parseDoubleTriplet( const wxString& aData, S3D_VERTEX& aResult ); - void rotate( S3D_VERTEX& aCoordinate, S3D_VERTEX& aRotAxis, double angle); + void rotate( S3D_VERTEX& aCoordinate, S3D_VERTEX& aRotAxis, double angle ); }; /** @@ -146,9 +143,9 @@ private: class VRML_MODEL_PARSER: public S3D_MODEL_PARSER { public: - VRML_MODEL_PARSER(S3D_MASTER* aMaster); + VRML_MODEL_PARSER( S3D_MASTER* aMaster ); ~VRML_MODEL_PARSER(); - void Load(const wxString aFilename); + void Load( const wxString aFilename ); private: /** @@ -170,7 +167,26 @@ private: int readShape( FILE* file, int* LineNum ); int readAppearance( FILE* file, int* LineNum ); int readGeometry( FILE* file, int* LineNum ); - void readCoordsList( FILE* file, char* text_buffer, std::vector< double >& aList, int* LineNum ); + + /** + * Function ReadCoordList + * reads 3D coordinate lists like: + * coord Coordinate { point [ + * -5.24489 6.57640e-3 -9.42129e-2, + * -5.11821 6.57421e-3 0.542654, + * -3.45868 0.256565 1.32000 ] } + * or: + * normal Normal { vector [ + * 0.995171 -6.08102e-6 9.81541e-2, + * 0.923880 -4.09802e-6 0.382683, + * 0.707107 -9.38186e-7 0.707107] + * } + * + * text_buffer contains the first line of this node : + * "coord Coordinate { point [" + */ + void readCoordsList( FILE* file, char* text_buffer, std::vector< double >& aList, + int* LineNum ); }; #endif // MODELPARSERS_H diff --git a/3d-viewer/vrmlmodelparser.cpp b/3d-viewer/vrmlmodelparser.cpp index cbb3205e41..20ec219991 100644 --- a/3d-viewer/vrmlmodelparser.cpp +++ b/3d-viewer/vrmlmodelparser.cpp @@ -36,19 +36,21 @@ #include "3d_struct.h" #include "modelparsers.h" - + // separator chars static const char* sep_chars = " \t\n\r"; -VRML_MODEL_PARSER::VRML_MODEL_PARSER(S3D_MASTER* aMaster) -:S3D_MODEL_PARSER(aMaster) +VRML_MODEL_PARSER::VRML_MODEL_PARSER( S3D_MASTER* aMaster ) : + S3D_MODEL_PARSER( aMaster ) {} + VRML_MODEL_PARSER::~VRML_MODEL_PARSER() {} -void VRML_MODEL_PARSER::Load(const wxString aFilename) -{ + +void VRML_MODEL_PARSER::Load( const wxString aFilename ) +{ char line[1024], * text; FILE* file; int LineNum = 0; @@ -67,7 +69,7 @@ void VRML_MODEL_PARSER::Load(const wxString aFilename) { text = strtok( line, sep_chars ); - if( stricmp( text, "DEF" ) == 0 || stricmp( text, "Group" ) == 0) + if( stricmp( text, "DEF" ) == 0 || stricmp( text, "Group" ) == 0 ) { while( GetLine( file, line, &LineNum, 512 ) ) { @@ -91,6 +93,7 @@ void VRML_MODEL_PARSER::Load(const wxString aFilename) SetLocaleTo_Default(); // revert to the current locale } + int VRML_MODEL_PARSER::readMaterial( FILE* file, int* LineNum ) { char line[512], * text, * command; @@ -258,7 +261,8 @@ int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum ) if( *text == '}' ) { - err = 0; break; + err = 0; + break; } if( stricmp( text, "material" ) == 0 ) @@ -278,24 +282,8 @@ int VRML_MODEL_PARSER::readAppearance( FILE* file, int* LineNum ) #define BUFSIZE 2000 -/** - * Function ReadCoordList - * reads 3D coordinate lists like: - * coord Coordinate { point [ - * -5.24489 6.57640e-3 -9.42129e-2, - * -5.11821 6.57421e-3 0.542654, - * -3.45868 0.256565 1.32000 ] } - * or: - * normal Normal { vector [ - * 0.995171 -6.08102e-6 9.81541e-2, - * 0.923880 -4.09802e-6 0.382683, - * 0.707107 -9.38186e-7 0.707107] - * } - * - * text_buffer contains the first line of this node : - * "coord Coordinate { point [" - */ -void VRML_MODEL_PARSER::readCoordsList( FILE* file, char* text_buffer, std::vector< double >& aList, int* LineNum ) +void VRML_MODEL_PARSER::readCoordsList( FILE* file, char* text_buffer, + std::vector< double >& aList, int* LineNum ) { unsigned int ii = 0, jj = 0; char* text; @@ -399,6 +387,7 @@ int VRML_MODEL_PARSER::readGeometry( FILE* file, int* LineNum ) else { } + continue; } diff --git a/3d-viewer/x3dmodelparser.cpp b/3d-viewer/x3dmodelparser.cpp index 8402164547..8205726ce1 100644 --- a/3d-viewer/x3dmodelparser.cpp +++ b/3d-viewer/x3dmodelparser.cpp @@ -39,17 +39,20 @@ #include "3d_struct.h" #include "modelparsers.h" -X3D_MODEL_PARSER::X3D_MODEL_PARSER( S3D_MASTER* aMaster ) -:S3D_MODEL_PARSER( aMaster ) +X3D_MODEL_PARSER::X3D_MODEL_PARSER( S3D_MASTER* aMaster ) : + S3D_MODEL_PARSER( aMaster ) {} + X3D_MODEL_PARSER::~X3D_MODEL_PARSER() {} -void X3D_MODEL_PARSER::Load( const wxString aFilename ) + +void X3D_MODEL_PARSER::Load( const wxString aFilename ) { - wxXmlDocument doc; - if( !doc.Load( aFilename ) ) + wxXmlDocument doc; + + if( !doc.Load( aFilename ) ) { wxLogError( wxT( "Error while parsing file <%s>" ), GetChars( aFilename ) ); return; @@ -62,74 +65,85 @@ void X3D_MODEL_PARSER::Load( const wxString aFilename ) } // Shapes are inside of Transform nodes - // Transform node contains information about + // Transform node contains information about // transition, scale and rotation of the shape NODE_LIST transforms; GetChildsByName( doc.GetRoot(), wxT( "Transform" ), transforms ); + for( NODE_LIST::iterator node_it = transforms.begin(); node_it != transforms.end(); - node_it++ ) + node_it++ ) { readTransform( *node_it ); } } -wxString X3D_MODEL_PARSER::VRML_representation() + +wxString X3D_MODEL_PARSER::VRML_representation() { wxString output; - for( unsigned i = 0; i < vrml_points.size(); i++ ) + + for( unsigned i = 0; i < vrml_points.size(); i++ ) { - output += wxT("Shape {\n" - " appearance Appearance {\n" - " material Material {\n" ) + - vrml_materials[i] + - wxT(" }\n" - " }\n" - " geometry IndexedFaceSet {\n" - " solid TRUE\n" - " coord Coordinate {\n" - " point [\n") + + output += wxT( "Shape {\n" + " appearance Appearance {\n" + " material Material {\n" ) + + vrml_materials[i] + + wxT( " }\n" + " }\n" + " geometry IndexedFaceSet {\n" + " solid TRUE\n" + " coord Coordinate {\n" + " point [\n") + vrml_points[i] + wxT( " ]\n" " }\n" " coordIndex [\n" ) + vrml_coord_indexes[i] + - wxT(" ]\n" - " }\n" - "},\n"); + wxT( " ]\n" + " }\n" + "},\n" ); } return output; } -void X3D_MODEL_PARSER::GetChildsByName( wxXmlNode* aParent, - const wxString aName, - std::vector< wxXmlNode* >& aResult ) + +void X3D_MODEL_PARSER::GetChildsByName( wxXmlNode* aParent, + const wxString aName, + std::vector< wxXmlNode* >& aResult ) { // Breadth-first search (BFS) std::queue< wxXmlNode* > found; found.push( aParent ); - while( !found.empty() ) + + while( !found.empty() ) { wxXmlNode *elem = found.front(); + for( wxXmlNode *child = elem->GetChildren(); - child != NULL; + child != NULL; child = child->GetNext() ) { - if( child->GetName() == aName) + if( child->GetName() == aName ) { aResult.push_back( child ); } + found.push( child ); } + found.pop(); } } -void X3D_MODEL_PARSER::GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps ) { + +void X3D_MODEL_PARSER::GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps ) +{ wxXmlProperty *prop; - for( prop = aNode->GetProperties(); - prop != NULL; + + for( prop = aNode->GetAttributes(); + prop != NULL; prop = prop->GetNext() ) { aProps[ prop->GetName() ] = prop->GetValue(); @@ -145,98 +159,110 @@ void X3D_MODEL_PARSER::readTransform( wxXmlNode* aTransformNode ) for( NODE_LIST::iterator node = childnodes.begin(); node != childnodes.end(); - node++ ) + node++ ) { readMaterial( *node ); } + childnodes.clear(); PROPERTY_MAP properties; GetNodeProperties( aTransformNode, properties ); GetChildsByName( aTransformNode, wxT("IndexedFaceSet"), childnodes ); + for( NODE_LIST::iterator node = childnodes.begin(); node != childnodes.end(); - node++ ) + node++ ) { readIndexedFaceSet( *node, properties ); } + childnodes.clear(); } + void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode ) { PROPERTY_MAP properties; GetNodeProperties( aMatNode, properties ); // DEFine new Material named as value of DEF - if( properties.find( wxT( "DEF" ) ) != properties.end() ) { + if( properties.find( wxT( "DEF" ) ) != properties.end() ) + { double amb, shine, transp; S3D_MATERIAL* material = new S3D_MATERIAL( GetMaster(), properties[ wxT( "DEF" ) ] ); GetMaster()->Insert( material ); - if( !parseDoubleTriplet( properties[ wxT( "diffuseColor" ) ], - material->m_DiffuseColor) ) - { - D( printf("diffuseColor parsing error") ); + if( !parseDoubleTriplet( properties[ wxT( "diffuseColor" ) ], + material->m_DiffuseColor ) ) + { + D( printf("diffuseColor parsing error") ); } - + if( !parseDoubleTriplet( properties[ wxT( "specularColor" ) ], material->m_SpecularColor ) ) { - D( printf("specularColor parsing error") ); + D( printf("specularColor parsing error") ); } if( !parseDoubleTriplet( properties[ wxT( "emissiveColor" ) ], material->m_EmissiveColor ) ) - { - D( printf("emissiveColor parsing error") ); + { + D( printf("emissiveColor parsing error") ); } wxStringTokenizer values; values.SetString( properties[ wxT( "ambientIntensity" ) ] ); - if( values.GetNextToken().ToDouble( &amb ) ) + + if( values.GetNextToken().ToDouble( &amb ) ) { material->m_AmbientIntensity = amb; - } - else + } + else { - D( printf("ambienterror") ); + D( printf( "ambienterror" ) ); } values.SetString( properties[ wxT( "shininess" ) ] ); - if( values.GetNextToken().ToDouble(&shine) ) + + if( values.GetNextToken().ToDouble( &shine ) ) { material->m_Shininess = shine; - } - else { - D( printf( "shininess error" ) ); + } + else + { + D( printf( "shininess error" ) ); } values.SetString( properties[ wxT( "transparency" ) ] ); - if( values.GetNextToken().ToDouble(&transp) ) + + if( values.GetNextToken().ToDouble( &transp ) ) { material->m_Transparency = transp; - } + } else - { + { D( printf( "trans error") ); } material->SetMaterial(); - + // VRML wxString vrml_material; PROPERTY_MAP::const_iterator p = ++properties.begin(); // skip DEF - for(;p != properties.end();p++) { - vrml_material.Append( p->first + wxT(" ") + p->second + wxT("\n") ); + + for(;p != properties.end();p++) + { + vrml_material.Append( p->first + wxT( " " ) + p->second + wxT( "\n" ) ); } - vrml_materials.push_back(vrml_material); + vrml_materials.push_back( vrml_material ); } - + // USE existing material named by value of USE - else if( properties.find( wxT( "USE" ) ) != properties.end() ) { + else if( properties.find( wxT( "USE" ) ) != properties.end() ) + { S3D_MATERIAL* material = NULL; wxString mat_name = properties[ wxT( "USE" ) ]; @@ -244,34 +270,33 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode ) { if( material->m_Name == mat_name ) { - + wxString vrml_material; - vrml_material.Append( wxString::Format( wxT( "specularColor %f %f %f\n"), - material->m_SpecularColor.x, - material->m_SpecularColor.y, - material->m_SpecularColor.z) ); + vrml_material.Append( wxString::Format( wxT( "specularColor %f %f %f\n" ), + material->m_SpecularColor.x, + material->m_SpecularColor.y, + material->m_SpecularColor.z ) ); - vrml_material.Append( wxString::Format( wxT( "diffuseColor %f %f %f\n"), - material->m_DiffuseColor.x, - material->m_DiffuseColor.y, - material->m_DiffuseColor.z) ); + vrml_material.Append( wxString::Format( wxT( "diffuseColor %f %f %f\n" ), + material->m_DiffuseColor.x, + material->m_DiffuseColor.y, + material->m_DiffuseColor.z ) ); - vrml_material.Append( wxString::Format( wxT( "emissiveColor %f %f %f\n"), - material->m_EmissiveColor.x, - material->m_EmissiveColor.y, - material->m_EmissiveColor.z) ); + vrml_material.Append( wxString::Format( wxT( "emissiveColor %f %f %f\n" ), + material->m_EmissiveColor.x, + material->m_EmissiveColor.y, + material->m_EmissiveColor.z ) ); - vrml_material.Append( wxString::Format( wxT( "ambientIntensity %f\n"), - material->m_AmbientIntensity) ); + vrml_material.Append( wxString::Format( wxT( "ambientIntensity %f\n"), + material->m_AmbientIntensity ) ); - vrml_material.Append( wxString::Format( wxT( "shininess %f\n"), - material->m_Shininess) ); - - vrml_material.Append( wxString::Format( wxT( "transparency %f\n"), - material->m_Transparency) ); - - vrml_materials.push_back(vrml_material); + vrml_material.Append( wxString::Format( wxT( "shininess %f\n"), + material->m_Shininess ) ); + vrml_material.Append( wxString::Format( wxT( "transparency %f\n"), + material->m_Transparency ) ); + + vrml_materials.push_back( vrml_material ); material->SetMaterial(); return; @@ -279,39 +304,40 @@ void X3D_MODEL_PARSER::readMaterial( wxXmlNode* aMatNode ) } D( printf( "ReadMaterial error: material not found\n" ) ); - } } -bool X3D_MODEL_PARSER::parseDoubleTriplet( const wxString& aData, + +bool X3D_MODEL_PARSER::parseDoubleTriplet( const wxString& aData, S3D_VERTEX& aResult ) { wxStringTokenizer tokens(aData); + return tokens.GetNextToken().ToDouble( &aResult.x ) && tokens.GetNextToken().ToDouble( &aResult.y ) && - tokens.GetNextToken().ToDouble( &aResult.z ); + tokens.GetNextToken().ToDouble( &aResult.z ); } -void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV, - S3D_VERTEX& aU, - double angle) +void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV, + S3D_VERTEX& aU, + double angle ) { S3D_VERTEX rotated; - double C = cos(angle); - double S = sin(angle); + double C = cos( angle ); + double S = sin( angle ); double t = 1.0 - C; - rotated.x = ( t * aU.x * aU.x + C ) * aV.x + - ( t * aU.x * aU.y - S * aU.z ) * aV.y + + rotated.x = ( t * aU.x * aU.x + C ) * aV.x + + ( t * aU.x * aU.y - S * aU.z ) * aV.y + ( t * aU.x * aU.z + S * aU.y ) * aV.z; - rotated.y = ( t * aU.x * aU.y + S * aU.z ) * aV.x + - ( t * aU.y * aU.y + C ) * aV.y + + rotated.y = ( t * aU.x * aU.y + S * aU.z ) * aV.x + + ( t * aU.y * aU.y + C ) * aV.y + ( t * aU.y * aU.z - S * aU.x ) * aV.z; - rotated.z = ( t * aU.x * aU.z - S * aU.y ) * aV.x + - ( t * aU.y * aU.z + S * aU.x ) * aV.y + + rotated.z = ( t * aU.x * aU.z - S * aU.y ) * aV.x + + ( t * aU.y * aU.z + S * aU.x ) * aV.y + ( t * aU.z * aU.z + C) * aV.z; aV.x = rotated.x; @@ -319,21 +345,21 @@ void X3D_MODEL_PARSER::rotate( S3D_VERTEX& aV, aV.z = rotated.z; } + /* Steps: * 1. Read transform data - * 2. Read vectex triplets + * 2. Read vertex triplets * 3. Read coordinate indexes * 4. Apply geometry to Master object */ -void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, +void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, PROPERTY_MAP& aTransformProps) { /* Step 1: Read transform data * --------------------------- */ - + S3D_VERTEX translation; - parseDoubleTriplet( aTransformProps[ wxT( "translation" ) ], - translation ); + parseDoubleTriplet( aTransformProps[ wxT( "translation" ) ], translation ); S3D_VERTEX scale; parseDoubleTriplet( aTransformProps[ wxT( "scale" ) ], scale ); @@ -341,6 +367,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, S3D_VERTEX rotation; double angle = 0.0; wxStringTokenizer tokens(aTransformProps[ wxT( "rotation" ) ]); + if( !(tokens.GetNextToken().ToDouble( &rotation.x ) && tokens.GetNextToken().ToDouble( &rotation.y ) && tokens.GetNextToken().ToDouble( &rotation.z ) && @@ -349,7 +376,7 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, D( printf("rotation read error") ); } - double vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * + double vrmlunits_to_3Dunits = g_Parm_3D_Visu.m_BiuTo3Dunits * UNITS3D_TO_UNITSPCB; /* Step 2: Read all coordinate points @@ -365,7 +392,8 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, // Save points to vector as doubles wxStringTokenizer point_tokens( coordinate_properties[ wxT("point") ] ); double point = 0.0; - while( point_tokens.HasMoreTokens() ) + + while( point_tokens.HasMoreTokens() ) { if( point_tokens.GetNextToken().ToDouble( &point ) ) { @@ -377,28 +405,30 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, } } - if(points.size() % 3 != 0) { - D( printf("Number of points is incorrect") ); + if( points.size() % 3 != 0 ) + { + D( printf( "Number of points is incorrect" ) ); return; } /* Create 3D vertex from 3 points and - * apply tansforms in order of SCALE, ROTATION, TRANSLATION + * apply transforms in order of SCALE, ROTATION, TRANSLATION */ wxString vrml_pointlist; std::vector< S3D_VERTEX > triplets; + for( unsigned id = 0; id < points.size() / 3; id++ ) { int triplet_indx = id * 3; - S3D_VERTEX point( points[ triplet_indx ], - points[ triplet_indx + 1 ], + S3D_VERTEX point( points[ triplet_indx ], + points[ triplet_indx + 1 ], points[ triplet_indx + 2 ] ); point.x *= scale.x; point.y *= scale.y; point.z *= scale.z; - rotate(point, rotation, angle); + rotate( point, rotation, angle ); point.x += translation.x; point.y += translation.y; @@ -407,9 +437,10 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, triplets.push_back(point); // VRML - vrml_pointlist.Append( wxString::Format(wxT("%f %f %f\n"), point.x, point.y, point.z) ); + vrml_pointlist.Append( wxString::Format( wxT( "%f %f %f\n" ), point.x, point.y, point.z ) ); } - vrml_points.push_back(vrml_pointlist); + + vrml_points.push_back( vrml_pointlist ); /* -- Read coordinate indexes -- */ PROPERTY_MAP faceset_properties; @@ -422,10 +453,11 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, wxStringTokenizer index_tokens( coordIndex_str ); wxString vrml_coord_indx_list; - while( index_tokens.HasMoreTokens() ) + + while( index_tokens.HasMoreTokens() ) { long index = 0; - index_tokens.GetNextToken().ToLong(&index); + index_tokens.GetNextToken().ToLong( &index ); // -1 marks the end of polygon if( index < 0 ) @@ -433,11 +465,12 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, /* Step 4: Apply geometry to Master object * --------------------------------------- */ std::vector::const_iterator id; + for( id = coordIndex.begin(); id != coordIndex.end(); id++ ) { - vertices.push_back( triplets.at(*id) ); + vertices.push_back( triplets.at( *id ) ); } GetMaster()->Set_Object_Coords( vertices ); @@ -445,14 +478,14 @@ void X3D_MODEL_PARSER::readIndexedFaceSet( wxXmlNode* aFaceNode, vertices.clear(); coordIndex.clear(); - vrml_coord_indx_list.Append( wxT("-1\n") ); + vrml_coord_indx_list.Append( wxT( "-1\n" ) ); } else { coordIndex.push_back( index ); - vrml_coord_indx_list.Append( wxString::Format(wxT("%u "), index) ); + vrml_coord_indx_list.Append( wxString::Format( wxT( "%u " ), index ) ); } } - vrml_coord_indexes.push_back(vrml_coord_indx_list); -} + vrml_coord_indexes.push_back( vrml_coord_indx_list ); +} diff --git a/common/common_plot_functions.cpp b/common/common_plot_functions.cpp index 6f8b3bc139..4e07bdaa78 100644 --- a/common/common_plot_functions.cpp +++ b/common/common_plot_functions.cpp @@ -59,7 +59,7 @@ void PlotWorkSheet( PLOTTER* plotter, const TITLE_BLOCK& aTitleBlock, int iusPerMil = plotter->GetIUsPerDecimil() * 10; wxSize pageSize = aPageInfo.GetSizeMils(); // in mils int xg, yg; - int refx, refy; +// int refx, refy; wxPoint pos, end, ref; wxString msg; wxSize text_size; diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index 7f465694d9..7fdae7f55e 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -905,6 +905,17 @@ public: /** * Function ExportVRML_File * Creates the file(s) exporting current BOARD to a VRML file. + * + * @note When copying 3D shapes files, the new filename is build from the full path + * name, changing the separators by underscore. This is needed because files + * with the same shortname can exist in different directories + * @note ExportVRML_File generates coordinates in board units (BIU) inside the file. + * @todo Use mm inside the file. A general scale transform is applied to the whole + * file (1.0 to have the actual WRML unit im mm, 0.001 to have the actual WRML + * unit in meters. + * @note For 3D models built by a 3D modeler, the unit is 0,1 inches. A specfic scale + * is applied to 3D models to convert them to internal units. + * * @param aFullFileName = the full filename of the file to create * @param aMMtoWRMLunit = the VRML scaling factor: * 1.0 to export in mm. 0.001 for meters diff --git a/pcbnew/export_vrml.cpp b/pcbnew/export_vrml.cpp index 7ccbd48081..b9ec9ff37b 100644 --- a/pcbnew/export_vrml.cpp +++ b/pcbnew/export_vrml.cpp @@ -257,6 +257,7 @@ static void write_triangle_bag( FILE* output_file, int color_index, //{{{ "}\n", 0 // End marker }; + int marker_found = 0, lineno = 0; while( marker_found < 4 ) @@ -554,6 +555,7 @@ static void export_vrml_arc( int layer, double centerx, double centery, ring.bag( layer, false ); } + static void export_vrml_varc( TRIANGLEBAG& triangles, int top_layer, int bottom_layer, double centerx, double centery, @@ -958,28 +960,28 @@ static void export_vrml_pad( BOARD* pcb, D_PAD* aPad ) //{{{ pad_dy = 0; case PAD_TRAPEZOID: + { + int coord[8] = { - int coord[8] = - { - KiROUND(-pad_w - pad_dy), KiROUND(+pad_h + pad_dx), - KiROUND(-pad_w + pad_dy), KiROUND(-pad_h - pad_dx), - KiROUND(+pad_w - pad_dy), KiROUND(+pad_h - pad_dx), - KiROUND(+pad_w + pad_dy), KiROUND(-pad_h + pad_dx), - }; + KiROUND( -pad_w - pad_dy ), KiROUND( +pad_h + pad_dx ), + KiROUND( -pad_w + pad_dy ), KiROUND( -pad_h - pad_dx ), + KiROUND( +pad_w - pad_dy ), KiROUND( +pad_h - pad_dx ), + KiROUND( +pad_w + pad_dy ), KiROUND( -pad_h + pad_dx ), + }; - for( int i = 0; i < 4; i++ ) - { - RotatePoint( &coord[i * 2], &coord[i * 2 + 1], aPad->GetOrientation() ); - coord[i * 2] += KiROUND( pad_x ); - coord[i * 2 + 1] += KiROUND( pad_y ); - } - - bag_flat_quad( layer, coord[0], coord[1], - coord[2], coord[3], - coord[4], coord[5], - coord[6], coord[7] ); + for( int i = 0; i < 4; i++ ) + { + RotatePoint( &coord[i * 2], &coord[i * 2 + 1], aPad->GetOrientation() ); + coord[i * 2] += KiROUND( pad_x ); + coord[i * 2 + 1] += KiROUND( pad_y ); } - break; + + bag_flat_quad( layer, coord[0], coord[1], + coord[2], coord[3], + coord[4], coord[5], + coord[6], coord[7] ); + } + break; default: ; @@ -1043,11 +1045,11 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule, switch( item->Type() ) { case PCB_MODULE_TEXT_T: - export_vrml_text_module( dynamic_cast(item) ); + export_vrml_text_module( dynamic_cast( item ) ); break; case PCB_MODULE_EDGE_T: - export_vrml_edge_module( dynamic_cast(item) ); + export_vrml_edge_module( dynamic_cast( item ) ); break; default: @@ -1078,13 +1080,13 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule, fname = vrmlm->m_Shape3DName; } - fname.Replace(wxT("\\"), wxT("/" ) ); + fname.Replace( wxT( "\\" ), wxT( "/" ) ); wxString source_fname = fname; if( aExport3DFiles ) // Change illegal characters in short filename { ChangeIllegalCharacters( fname, true ); - fname = a3D_Subdir + wxT("/") + fname; + fname = a3D_Subdir + wxT( "/" ) + fname; if( !wxFileExists( fname ) ) wxCopyFile( source_fname, fname ); @@ -1153,12 +1155,12 @@ static void export_vrml_module( BOARD* aPcb, MODULE* aModule, if( fname.EndsWith( wxT( "x3d" ) ) ) { - X3D_MODEL_PARSER* parser = new X3D_MODEL_PARSER(vrmlm); + X3D_MODEL_PARSER* parser = new X3D_MODEL_PARSER( vrmlm ); - if(parser) + if( parser ) { // embed x3d model in vrml format - parser->Load(fname); + parser->Load( fname ); fprintf( aOutputFile, " children [\n %s ]\n", TO_UTF8( parser->VRML_representation() ) ); fprintf( aOutputFile, " }\n" ); @@ -1187,28 +1189,7 @@ static void write_and_empty_triangle_bag( FILE* output_file, TRIANGLEBAG& triang } } -/* ExportVRML_File - * Creates the file(s) exporting current BOARD to a VRML file. - * aFullFileName = the full filename of the file to create - * aMMtoWRMLunit = the general WRML scaling factor. 1.0 to export in mm - * @param aExport3DFiles = true to copy 3D shapes in the subdir a3D_Subdir - * a3D_Subdir = sub directory where 3D shapes files are copied - * used only when aExport3DFiles == true - */ -/* Note1: - * When copying 3D shapes files, the new filename is build from - * the full path name, changing the separators by underscore. - * this is needed because files with the same shortname can exist in different directories - * Note 2: - * ExportVRML_File generates coordinates in board units (BIU) inside the file. - * (TODO: use mm inside the file) - * A general scale transform is applied to the whole file - * (1.0 to have the actual WRML unit im mm, 0.001 to have the actual WRML unit im meter - * Note 3: - * For 3D models built by a 3D modeler, the unit is 0,1 inch - * A specfic scale is applied to 3D models to convert them to BIU - * - */ + bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName, double aMMtoWRMLunit, bool aExport3DFiles, const wxString & a3D_Subdir ) @@ -1218,6 +1199,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName, BOARD* pcb = GetBoard(); output_file = wxFopen( aFullFileName, wxT( "wt" ) ); + if( output_file == NULL ) return false; @@ -1227,7 +1209,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName, // Begin with the usual VRML boilerplate wxString name = aFullFileName; - name.Replace(wxT("\\"), wxT("/" ) ); + name.Replace( wxT( "\\" ), wxT( "/" ) ); ChangeIllegalCharacters( name, false ); fprintf( output_file, "#VRML V2.0 utf8\n" "WorldInfo {\n" @@ -1275,6 +1257,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName, * is 2.54 * aMMtoWRMLunit */ double wrml_3D_models_scaling_factor = 2.54 * aMMtoWRMLunit; + // Export footprints for( MODULE* module = pcb->m_Modules; module != 0; module = module->Next() ) export_vrml_module( pcb, module, output_file, @@ -1307,6 +1290,7 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName, return true; } + /* * some characters cannot be used in filenames, * this function change them to "_" @@ -1314,8 +1298,8 @@ bool PCB_EDIT_FRAME::ExportVRML_File( const wxString & aFullFileName, static void ChangeIllegalCharacters( wxString & aFileName, bool aDirSepIsIllegal ) { if( aDirSepIsIllegal ) - aFileName.Replace(wxT("/"), wxT("_" ) ); + aFileName.Replace( wxT( "/" ), wxT( "_" ) ); - aFileName.Replace(wxT(" "), wxT("_" ) ); - aFileName.Replace(wxT(":"), wxT("_" ) ); + aFileName.Replace( wxT( " " ), wxT( "_" ) ); + aFileName.Replace( wxT( ":" ), wxT( "_" ) ); }