34#include <idf_parser.h>
50#define LINE_WIDTH (pcbIUScale.mmToIU( 0.1 ))
62 double scale = aIDFBoard.GetUserScale();
64 std::list< IDF_SEGMENT* > lines;
65 IDF_OUTLINE* outline =
nullptr;
73 aIDFBoard.GetUserOffset( offX, offY );
94 IDF_SEGMENT* seg =
new IDF_SEGMENT( sp, ep );
97 lines.push_back( seg );
112 IDF_POINT corners[4];
113 corners[0] = IDF_POINT(
left, top );
114 corners[1] = IDF_POINT(
right, top );
115 corners[2] = IDF_POINT(
right, bottom );
116 corners[3] = IDF_POINT(
left, bottom );
118 lines.push_back(
new IDF_SEGMENT( corners[0], corners[1] ) );
119 lines.push_back(
new IDF_SEGMENT( corners[1], corners[2] ) );
120 lines.push_back(
new IDF_SEGMENT( corners[2], corners[3] ) );
121 lines.push_back(
new IDF_SEGMENT( corners[3], corners[0] ) );
137 lines.push_back( seg );
154 IDF_SEGMENT* seg =
new IDF_SEGMENT( sp, ep, 360.0,
true );
157 lines.push_back( seg );
177 outline =
new IDF_OUTLINE;
178 IDF3::GetOutline( lines, *outline );
180 if( outline->empty() )
183 aIDFBoard.AddBoardOutline( outline );
187 while( !lines.empty() )
190 outline =
new IDF_OUTLINE;
192 IDF3::GetOutline( lines, *outline );
194 if( outline->empty() )
200 aIDFBoard.AddBoardOutline( outline );
209 while( !lines.empty() )
211 delete lines.front();
218 outline =
new IDF_OUTLINE;
251 outline->push(
new IDF_SEGMENT( p1, p2 ) );
253 for(
int i = 1; i < 4; ++i )
260 outline->push(
new IDF_SEGMENT( p1, p2 ) );
263 aIDFBoard.AddBoardOutline( outline );
278 wxString footprintBasePath = wxEmptyString;
294 footprintBasePath = fpRow->
GetFullURI(
true );
297 if( crefdes.empty() || !crefdes.compare(
"~" ) )
303 if( cvalue.empty() || !cvalue.compare(
"~" ) )
306 crefdes =
"NOREFDES";
319 double scale = aIDFBoard.GetUserScale();
320 IDF3::KEY_PLATING kplate;
326 aIDFBoard.GetUserOffset( dx, dy );
328 for(
auto pad : aFootprint->
Pads() )
330 drill = (double)
pad->GetDrillSize().x *
scale;
331 x =
pad->GetPosition().x *
scale + dx;
332 y = -
pad->GetPosition().y *
scale + dy;
346 if( tstr.empty() || !tstr.compare(
"0" ) || !tstr.compare(
"~" )
347 || ( kplate == IDF3::NPTH )
362 && (
pad->GetDrillSize().x !=
pad->GetDrillSize().y ) )
368 double dlength =
pad->GetDrillSize().y *
scale;
373 double angle =
pad->GetOrientation().AsDegrees();
381 if( dlength < drill )
383 std::swap( drill, dlength );
394 aIDFBoard.AddSlot( drill, dlength, angle, x, y );
398 IDF_DRILL_DATA *dp =
new IDF_DRILL_DATA( drill, x, y, kplate, crefdes,
399 pintype, IDF3::ECAD );
401 if( !aIDFBoard.AddDrill( dp ) )
405 std::ostringstream ostr;
406 ostr << __FILE__ <<
":" << __LINE__ <<
":" << __FUNCTION__;
407 ostr <<
"(): could not add drill";
409 throw std::runtime_error( ostr.str() );
418 IDF3_COMPONENT* comp =
nullptr;
420 auto sM = aFootprint->
Models().begin();
421 auto eM = aFootprint->
Models().end();
434 idfExt = idfFile.GetExt();
436 if( idfExt.Cmp( wxT(
"idf" ) ) && idfExt.Cmp( wxT(
"IDF" ) ) )
450 if( refdes.empty() || !refdes.compare(
"~" ) )
451 refdes = aIDFBoard.GetNewRefDes();
454 IDF3_COMP_OUTLINE* outline;
456 outline = aIDFBoard.GetComponentOutline( idfFile.GetFullPath() );
459 throw( std::runtime_error( aIDFBoard.GetError() ) );
462 double locx = sM->m_Offset.x * 25.4;
463 double locy = sM->m_Offset.y * 25.4;
464 double locz = sM->m_Offset.z * 25.4;
465 double lrot = sM->m_Rotation.z;
467 bool top = ( aFootprint->
GetLayer() ==
B_Cu ) ?
false :
true;
485 while( rotz >= 360.0 ) rotz -= 360.0;
488 while( rotz <= -360.0 ) rotz += 360.0;
491 if( comp ==
nullptr )
492 comp = aIDFBoard.FindComponent( refdes );
494 if( comp ==
nullptr )
496 comp =
new IDF3_COMPONENT( &aIDFBoard );
498 if( comp ==
nullptr )
499 throw( std::runtime_error( aIDFBoard.GetError() ) );
501 comp->SetRefDes( refdes );
507 rotz, IDF3::LYR_TOP );
513 rotz, IDF3::LYR_BOTTOM );
516 comp->SetPlacement( IDF3::PS_ECAD );
518 aIDFBoard.AddComponent( comp );
522 double refX, refY, refA;
523 IDF3::IDF_LAYER side;
525 if( ! comp->GetPosition( refX, refY, refA, side ) )
532 rotz, IDF3::LYR_TOP );
538 rotz, IDF3::LYR_BOTTOM );
541 comp->SetPlacement( IDF3::PS_ECAD );
557 if( ( top && side == IDF3::LYR_BOTTOM ) || ( !top && side == IDF3::LYR_TOP )
558 || ( refA > 0.0001 ) || ( refX > 0.0001 ) )
560 comp->GetPosition( refX, refY, refA, side );
562 std::ostringstream ostr;
563 ostr <<
"* " << __FILE__ <<
":" << __LINE__ <<
":" << __FUNCTION__ <<
"():\n";
564 ostr <<
"* conflicting Reference Designator '" << refdes <<
"'\n";
566 ostr <<
" vs. " << refX <<
"\n";
568 ostr <<
" vs. " << refY <<
"\n";
569 ostr <<
"* angle: " << rotz;
570 ostr <<
" vs. " << refA <<
"\n";
573 ostr <<
"* TOP vs. ";
575 ostr <<
"* BOTTOM vs. ";
577 if( side == IDF3::LYR_TOP )
582 throw( std::runtime_error( ostr.str() ) );
588 IDF3_COMP_OUTLINE_DATA* data =
new IDF3_COMP_OUTLINE_DATA( comp, outline );
590 data->SetOffsets( locx, locy, locz, lrot );
591 comp->AddOutlineData( data );
602 bool aUseThou,
double aXRef,
double aYRef )
604 IDF3_BOARD idfBoard( IDF3::CAD_ELEC );
613 IDF3::IDF_UNIT idfUnit;
617 idfUnit = IDF3::UNIT_THOU;
618 idfBoard.SetUserPrecision( 1 );
622 idfUnit = IDF3::UNIT_MM;
623 idfBoard.SetUserPrecision( 5 );
628 idfBoard.SetUserScale(
scale );
630 idfBoard.SetBoardName(
TO_UTF8( brdName.GetFullName() ) );
631 idfBoard.SetBoardVersion( 0 );
632 idfBoard.SetLibraryVersion( 0 );
634 std::ostringstream ostr;
636 idfBoard.SetIDFSource( ostr.str() );
641 idfBoard.SetUserOffset( -aXRef, aYRef );
650 if( !idfBoard.WriteFile( aFullFileName, idfUnit,
false ) )
653 msg <<
_(
"IDF Export Failed:\n" ) <<
From_UTF8( idfBoard.GetError().c_str() );
662 msg <<
_(
"IDF Export Failed:\n" ) << ioe.
What();
667 catch(
const std::exception& e )
670 msg <<
_(
"IDF Export Failed:\n" ) <<
From_UTF8( e.what() );
constexpr EDA_IU_SCALE pcbIUScale
wxString GetBuildVersion()
Get the full KiCad version string.
int GetBoardThickness() const
The full thickness of the board including copper and masks.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Information pertinent to a Pcbnew printed circuit board.
const BOX2I GetBoardEdgesBoundingBox() const
Return the board bounding box calculated using exclusively the board edges (graphics on Edge....
FOOTPRINTS & Footprints()
const wxString & GetFileName() const
PROJECT * GetProject() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const Vec & GetOrigin() const
const Vec & GetSize() const
EDA_ANGLE GetArcAngle() const
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Provide an extensible class to resolve 3D model paths.
wxString ResolvePath(const wxString &aFileName, const wxString &aWorkingPath)
Determines the full path of the given file name.
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
const FP_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an FP_LIB_TABLE_ROW if aNickName is found in this table or in any chained fall back table frag...
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
bool Export_IDF3(BOARD *aPcb, const wxString &aFullFileName, bool aUseThou, double aXRef, double aYRef)
Create an IDF3 compliant BOARD (*.emn) and LIBRARY (*.emp) file.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
wxString GetShownText(bool aAllowExtraText, int aDepth=0) const override
Return the string actually shown after processing of the base text.
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
FILENAME_RESOLVER * GetResolver() noexcept
@ ARC
use RECTANGLE instead of RECT to avoid collision in a Windows header
static void idf_export_outline(BOARD *aPcb, IDF3_BOARD &aIDFBoard)
Retrieve line segment information from the edge layer and compiles the data into a form which can be ...
static void idf_export_footprint(BOARD *aPcb, FOOTPRINT *aFootprint, IDF3_BOARD &aIDFBoard)
Retrieve information from all board footprints, adds drill holes to the DRILLED_HOLES or BOARD_OUTLIN...
static FILENAME_RESOLVER * resolver
This file contains miscellaneous commonly used macros and functions.
@ NPTH
like PAD_PTH, but not plated mechanical use only, no connection allowed
wxString From_UTF8(const char *cstring)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers