diff --git a/pcbnew/exporters/export_vrml.cpp b/pcbnew/exporters/export_vrml.cpp index 5ac438ba26..ecef9749b4 100644 --- a/pcbnew/exporters/export_vrml.cpp +++ b/pcbnew/exporters/export_vrml.cpp @@ -968,13 +968,39 @@ static void export_vrml_tracks( MODEL_VRML& aModel, BOARD* pcb ) export_vrml_via( aModel, pcb, (const VIA*) track ); } else if( ( track->GetLayer() == B_Cu || track->GetLayer() == F_Cu ) - && !aModel.m_plainPCB ) - export_vrml_line( aModel, track->GetLayer(), - track->GetStart().x * BOARD_SCALE, - track->GetStart().y * BOARD_SCALE, - track->GetEnd().x * BOARD_SCALE, - track->GetEnd().y * BOARD_SCALE, - track->GetWidth() * BOARD_SCALE ); + && !aModel.m_plainPCB ) + { + if( track->Type() == PCB_ARC_T ) + { + ARC* arc = static_cast( track ); + VECTOR2D center( arc->GetCenter() ); + double arc_angle_degree = arc->GetAngle()/10; + + // Vrml exporter does not export arcs with angle < 1.0 degree + // ( to avoid issues with vrml viewers). + // The best way is to convert them to a small straight line + if( arc_angle_degree < -1.0 || arc_angle_degree > 1.0 ) + export_vrml_arc( aModel, track->GetLayer(), + center.x * BOARD_SCALE, center.y * BOARD_SCALE, + arc->GetStart().x * BOARD_SCALE, + arc->GetStart().y * BOARD_SCALE, + arc->GetWidth() * BOARD_SCALE, arc_angle_degree ); + else + export_vrml_line( aModel, arc->GetLayer(), + arc->GetStart().x * BOARD_SCALE, + arc->GetStart().y * BOARD_SCALE, + arc->GetEnd().x * BOARD_SCALE, + arc->GetEnd().y * BOARD_SCALE, + arc->GetWidth() * BOARD_SCALE ); + } + else + export_vrml_line( aModel, track->GetLayer(), + track->GetStart().x * BOARD_SCALE, + track->GetStart().y * BOARD_SCALE, + track->GetEnd().x * BOARD_SCALE, + track->GetEnd().y * BOARD_SCALE, + track->GetWidth() * BOARD_SCALE ); + } } } diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp index ebb5316532..2a961804c6 100644 --- a/pcbnew/plot_board_layers.cpp +++ b/pcbnew/plot_board_layers.cpp @@ -575,7 +575,20 @@ void PlotStandardLayer( BOARD *aBoard, PLOTTER* aPlotter, gbr_metadata.SetNetName( track->GetNetname() ); int width = track->GetWidth() + itemplotter.getFineWidthAdj(); aPlotter->SetColor( itemplotter.getColor( track->GetLayer() ) ); - aPlotter->ThickSegment( track->GetStart(), track->GetEnd(), width, plotMode, &gbr_metadata ); + + if( track->Type() == PCB_ARC_T ) + { + ARC* arc = static_cast( track ); + VECTOR2D center( arc->GetCenter() ); + auto radius = arc->GetRadius(); + auto start_angle = arc->GetArcAngleStart(); + auto end_angle = start_angle + arc->GetAngle(); + + aPlotter->ThickArc( wxPoint( center.x, center.y ), -end_angle, -start_angle, + radius, width, plotMode, &gbr_metadata ); + } + else + aPlotter->ThickSegment( track->GetStart(), track->GetEnd(), width, plotMode, &gbr_metadata ); } aPlotter->EndBlock( NULL );