Due to the combination of very large scale factors and very small scale factors
in the exported VRML file, truncation errors in VRML viewers (whitedune and
lookat) caused problems; for example whitedune would render correctly when
exported in mm but gives bad results when exporting to inch or meter. I have
changed the code to scale the point coordinates rather than specifying a global
scale + counteracting local scales and this appears to solve the problem. When
tested with the pic_programmer demo, the resulting file size was smaller by
almost 2MB (~7.7MB rather than ~9.5MB) due to space saved in writing the text
representation of coordinates.
Other changes made:
1. removed unnecessary translation/rotation/scale parameters within the VRML
Transform block
2. corrected the URL file syntax
I am aware of at least one bug but it is one that requires some thought before
deciding how to address it: if relative filenames are used, the URL points to
invalid relative locations. I believe relative file URLs should only be allowed
when the 3D models are copied to a directory (this allows people to give their
board VRML model to others), and absolute file URLs should be used when the
models are not being copied.
There is also a problem with thru-hole pads; for the resistors and diodes (in
pic_programmer) it seems pads are rendered, but for the DILs only the first pad
is rendered. I haven't had time yet to look into this.
Regards,
Cirilo
=== modified file 'pcbnew/export_vrml.cpp'
--- pcbnew/export_vrml.cpp 2013-01-12 10:35:08 +0000
+++ pcbnew/export_vrml.cpp 2013-01-13 09:18:58 +0000
@@ -303,16 +303,14 @@
static void write_triangle_bag( FILE* output_file, int color_index, //{{{
- const TriangleBag& triangles )
+ const TriangleBag& triangles,
+ double boardIU2WRML )
{
/* A lot of nodes are not required, but blender sometimes chokes
* without them */
static const char* shape_boiler[] =
{
"Transform {\n",
- " translation 0.0 0.0 0.0\n",
- " rotation 1.0 0.0 0.0 0.0\n",
- " scale 1.0 1.0 1.0\n",
" children [\n",
" Group {\n",
" children [\n",
@@ -379,12 +377,15 @@
i != triangles.end();
i++ )
{
- fprintf( output_file, "%g %g %g\n",
- i->p1.x, -i->p1.y, i->p1.z );
- fprintf( output_file, "%g %g %g\n",
- i->p2.x, -i->p2.y, i->p2.z );
- fprintf( output_file, "%g %g %g\n",
- i->p3.x, -i->p3.y, i->p3.z );
+ fprintf( output_file, "%.8g %.8g %.8g\n",
+ i->p1.x * boardIU2WRML, -i->p1.y * boardIU2WRML,
+ i->p1.z * boardIU2WRML );
+ fprintf( output_file, "%.8g %.8g %.8g\n",
+ i->p2.x * boardIU2WRML, -i->p2.y * boardIU2WRML,
+ i->p2.z * boardIU2WRML );
+ fprintf( output_file, "%.8g %.8g %.8g\n",
+ i->p3.x * boardIU2WRML, -i->p3.y * boardIU2WRML,
+ i->p3.z * boardIU2WRML );
}
}
break;
@@ -1098,7 +1099,8 @@
static void export_vrml_module( BOARD* aPcb, MODULE* aModule,
FILE* aOutputFile,
double aVRMLModelsToBiu,
- bool aExport3DFiles, const wxString & a3D_Subdir )
+ bool aExport3DFiles, const wxString & a3D_Subdir,
+ double boardIU2WRML )
{
// Reference and value
export_vrml_text_module( aModule->m_Reference );
@@ -1206,9 +1208,9 @@
RotatePoint(&offsetx, &offsety, aModule->GetOrientation());
fprintf( aOutputFile, " translation %g %g %g\n",
- (double) (offsetx + aModule->m_Pos.x),
- - (double)(offsety + aModule->m_Pos.y), // Y axis is reversed in Pcbnew
- offsetz + layer_z[aModule->GetLayer()] );
+ (double) (offsetx + aModule->m_Pos.x) * boardIU2WRML,
+ - (double)(offsety + aModule->m_Pos.y) * boardIU2WRML, // Y axis is reversed in Pcbnew
+ offsetz + layer_z[aModule->GetLayer()] * boardIU2WRML);
fprintf( aOutputFile, " scale %g %g %g\n",
vrmlm->m_MatScale.x * aVRMLModelsToBiu,
@@ -1216,18 +1218,19 @@
vrmlm->m_MatScale.z * aVRMLModelsToBiu );
fprintf( aOutputFile,
- " children [\n Inline {\n url \"%s\"\n } ]\n",
+ " children [\n Inline {\n url \"file://%s\"\n } ]\n",
TO_UTF8( fname ) );
fprintf( aOutputFile, " }\n" );
}
}
-static void write_and_empty_triangle_bag( FILE* output_file, TriangleBag& triangles, int color )
+static void write_and_empty_triangle_bag( FILE* output_file, TriangleBag& triangles,
+ int color, double boardIU2WRML )
{
if( !triangles.empty() )
{
- write_triangle_bag( output_file, color, triangles );
+ write_triangle_bag( output_file, color, triangles, boardIU2WRML );
triangles.clear( );
}
}
@@ -1290,8 +1293,6 @@
// (aMMtoWRMLScale = 1.0 to export in mm)
double boardIU2WRML = aMMtoWRMLunit / MM_PER_IU;
fprintf( output_file, "Transform {\n" );
- fprintf( output_file, " scale %g %g %g\n",
- boardIU2WRML , boardIU2WRML, boardIU2WRML );
/* Define the translation to have the board centre to the 2D axis origin
* more easy for rotations...
@@ -1324,25 +1325,28 @@
* So the scaling factor from 0.1 inch to board units
* is 0.1 / general_scaling_factor
*/
- double wrml_3D_models_scaling_factor = 2.54 / boardIU2WRML;
+ 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,
wrml_3D_models_scaling_factor,
- aExport3DFiles, a3D_Subdir );
+ aExport3DFiles, a3D_Subdir,
+ boardIU2WRML );
/* Output the bagged triangles for each layer
* Each layer will be a separate shape */
for( int layer = 0; layer < LAYER_COUNT; layer++ )
write_and_empty_triangle_bag( output_file,
layer_triangles[layer],
- pcb->GetLayerColor(layer) );
+ pcb->GetLayerColor(layer),
+ boardIU2WRML );
// Same thing for the via layers
for( int i = 0; i < 4; i++ )
write_and_empty_triangle_bag( output_file,
via_triangles[i],
- pcb->GetVisibleElementColor( VIAS_VISIBLE + i ) );
+ pcb->GetVisibleElementColor( VIAS_VISIBLE + i ),
+ boardIU2WRML );
// Close the outer 'transform' node
fputs( "]\n}\n", output_file );
_______________________________________________
Mailing list: https://launchpad.net/~kicad-developers
Post to : [email protected]
Unsubscribe : https://launchpad.net/~kicad-developers
More help : https://help.launchpad.net/ListHelp