Fix VRML export bugs
Corrected polygon export missing vertex. Set pads to export on copper layer when not masked, keeping visual output similar to physical. Fixes: lp:1766634 * https://bugs.launchpad.net/kicad/+bug/1766634
This commit is contained in:
parent
bfc70c8208
commit
345f7d0732
|
@ -676,6 +676,43 @@ static void export_vrml_arc( MODEL_VRML& aModel, LAYER_NUM layer,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void export_vrml_polygon( MODEL_VRML& aModel, LAYER_NUM layer,
|
||||||
|
DRAWSEGMENT *aOutline, double aOrientation, wxPoint aPos )
|
||||||
|
{
|
||||||
|
const int circleSegmentsCount = 32;
|
||||||
|
|
||||||
|
if( aOutline->IsPolyShapeValid() )
|
||||||
|
{
|
||||||
|
SHAPE_POLY_SET shape = aOutline->GetPolyShape();
|
||||||
|
VRML_LAYER* vlayer;
|
||||||
|
|
||||||
|
if( !GetLayer( aModel, layer, &vlayer ) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( aOutline->GetWidth() )
|
||||||
|
{
|
||||||
|
shape.Inflate( aOutline->GetWidth()/2, circleSegmentsCount );
|
||||||
|
shape.Fracture( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
||||||
|
}
|
||||||
|
|
||||||
|
shape.Rotate( -aOrientation, VECTOR2I( 0, 0 ) );
|
||||||
|
shape.Move( aPos );
|
||||||
|
const SHAPE_LINE_CHAIN& outline = shape.COutline( 0 );
|
||||||
|
|
||||||
|
int seg = vlayer->NewContour();
|
||||||
|
|
||||||
|
for( int j = 0; j < outline.PointCount(); j++ )
|
||||||
|
{
|
||||||
|
if( !vlayer->AddVertex( seg, outline.CPoint( j ).x * BOARD_SCALE,
|
||||||
|
-outline.CPoint( j ).y * BOARD_SCALE ) )
|
||||||
|
throw( std::runtime_error( vlayer->GetError() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
vlayer->EnsureWinding( seg, false );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void export_vrml_drawsegment( MODEL_VRML& aModel, DRAWSEGMENT* drawseg )
|
static void export_vrml_drawsegment( MODEL_VRML& aModel, DRAWSEGMENT* drawseg )
|
||||||
{
|
{
|
||||||
LAYER_NUM layer = drawseg->GetLayer();
|
LAYER_NUM layer = drawseg->GetLayer();
|
||||||
|
@ -709,37 +746,7 @@ static void export_vrml_drawsegment( MODEL_VRML& aModel, DRAWSEGMENT* drawseg )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_POLYGON:
|
case S_POLYGON:
|
||||||
if( drawseg->IsPolyShapeValid() )
|
export_vrml_polygon( aModel, layer, drawseg, 0.0, wxPoint( 0, 0 ) );
|
||||||
{
|
|
||||||
VRML_LAYER* vlayer;
|
|
||||||
|
|
||||||
if( !GetLayer( aModel, layer, &vlayer ) )
|
|
||||||
break;
|
|
||||||
|
|
||||||
SHAPE_POLY_SET shape = drawseg->GetPolyShape();
|
|
||||||
|
|
||||||
const int circleSegmentsCount = 16;
|
|
||||||
|
|
||||||
if( drawseg->GetWidth() )
|
|
||||||
{
|
|
||||||
shape.Inflate( drawseg->GetWidth()/2, circleSegmentsCount );
|
|
||||||
shape.Fracture( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
|
||||||
}
|
|
||||||
|
|
||||||
const SHAPE_LINE_CHAIN& outline = shape.COutline( 0 );
|
|
||||||
|
|
||||||
int seg = vlayer->NewContour();
|
|
||||||
|
|
||||||
for( int j = 0; j < outline.PointCount(); j++ )
|
|
||||||
{
|
|
||||||
if( !vlayer->AddVertex( seg, (double)outline.CPoint( j ).x * BOARD_SCALE,
|
|
||||||
-((double)outline.CPoint( j ).y * BOARD_SCALE ) ) )
|
|
||||||
throw( std::runtime_error( vlayer->GetError() ) );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
vlayer->EnsureWinding( seg, false );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1067,50 +1074,8 @@ static void export_vrml_edge_module( MODEL_VRML& aModel, EDGE_MODULE* aOutline,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_POLYGON:
|
case S_POLYGON:
|
||||||
if( aOutline->IsPolyShapeValid() )
|
export_vrml_polygon( aModel, layer, aOutline, aModule->GetOrientationRadians(),
|
||||||
{
|
aModule->GetPosition() );
|
||||||
VRML_LAYER* vl;
|
|
||||||
|
|
||||||
if( !GetLayer( aModel, layer, &vl ) )
|
|
||||||
break;
|
|
||||||
|
|
||||||
SHAPE_POLY_SET shape = aOutline->GetPolyShape();
|
|
||||||
|
|
||||||
const int circleSegmentsCount = 16;
|
|
||||||
|
|
||||||
if( aOutline->GetWidth() )
|
|
||||||
{
|
|
||||||
shape.Inflate( aOutline->GetWidth()/2, circleSegmentsCount );
|
|
||||||
shape.Fracture( SHAPE_POLY_SET::PM_STRICTLY_SIMPLE );
|
|
||||||
}
|
|
||||||
|
|
||||||
shape.Rotate( -aModule->GetOrientationRadians(), VECTOR2I( 0, 0 ) );
|
|
||||||
shape.Move( aModule->GetPosition() );
|
|
||||||
|
|
||||||
const SHAPE_LINE_CHAIN& outline = shape.COutline( 0 );
|
|
||||||
|
|
||||||
int nvert = outline.PointCount() - 1;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
if( nvert < 3 ) break;
|
|
||||||
|
|
||||||
int seg = vl->NewContour();
|
|
||||||
|
|
||||||
if( seg < 0 )
|
|
||||||
break;
|
|
||||||
|
|
||||||
while( i < nvert )
|
|
||||||
{
|
|
||||||
x = outline.CPoint( i ).x * BOARD_SCALE;
|
|
||||||
y = - ( outline.CPoint( i ).y * BOARD_SCALE );
|
|
||||||
|
|
||||||
if( !vl->AddVertex( seg, x, y ) )
|
|
||||||
throw( std::runtime_error( vl->GetError() ) );
|
|
||||||
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
vl->EnsureWinding( seg, false );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1315,13 +1280,19 @@ static void export_vrml_pad( MODEL_VRML& aModel, BOARD* aPcb, D_PAD* aPad )
|
||||||
|
|
||||||
if( layer_mask[B_Cu] )
|
if( layer_mask[B_Cu] )
|
||||||
{
|
{
|
||||||
|
if( layer_mask[B_Mask] )
|
||||||
export_vrml_padshape( aModel, &aModel.m_bot_tin, aPad );
|
export_vrml_padshape( aModel, &aModel.m_bot_tin, aPad );
|
||||||
|
else
|
||||||
|
export_vrml_padshape( aModel, &aModel.m_bot_copper, aPad );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( layer_mask[F_Cu] )
|
if( layer_mask[F_Cu] )
|
||||||
{
|
{
|
||||||
|
if( layer_mask[F_Mask] )
|
||||||
export_vrml_padshape( aModel, &aModel.m_top_tin, aPad );
|
export_vrml_padshape( aModel, &aModel.m_top_tin, aPad );
|
||||||
|
else
|
||||||
|
export_vrml_padshape( aModel, &aModel.m_top_copper, aPad );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue