70#define EXPORT_CUSTOM_PADS_CONVEX_HULL
89 errorText = ioe.
What();
98 SetStatusText( wxString(
_(
"BOARD exported OK." ) ) );
119 wxLogWarning(
_(
"Board outline is malformed. Run DRC for a full analysis." ) );
150static inline double scale(
int kicadDist )
153 return kicadDist / (
pcbIUScale.IU_PER_MM / 1000.0 );
158static inline double IU2um(
int kicadDist )
160 return kicadDist * ( 1000.0 /
pcbIUScale.IU_PER_MM );
164static inline double mapX(
int x )
170static inline double mapY(
int y )
197 return mapPt( fpRelative );
227 path->AppendPoint( aStart );
228 path->AppendPoint( aEnd );
229 path->SetLayerId( aLayerName );
242 std::string uniqifier;
253 int reportedLayers = 0;
254 std::vector<std::string> layerName( copperCount );
256 bool onAllCopperLayers = ( (aPad->
GetLayerSet() & all_cu) == all_cu );
258 if( onAllCopperLayers )
261 for(
int layer=0; layer < copperCount; ++layer )
265 if( onAllCopperLayers || aPad->
IsOnLayer( kilayer ) )
267 layerName[reportedLayers++] =
m_layerIds[layer];
269 if( !onAllCopperLayers )
273 else if( layer == copperCount - 1 )
276 uniqifier += char(
'0' + layer);
289 if( offset.
x || offset.
y )
291 dsnOffset =
mapPt( offset );
293 std::ostringstream oss;
294 oss.imbue( std::locale::classic() );
295 oss << std::fixed << std::setprecision( 6 )
296 <<
'[' << dsnOffset.
x <<
',' << dsnOffset.
y <<
']';
297 uniqifier += oss.str();
304 double diameter =
scale( padSize.
x );
306 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
310 padstack->
Append( shape );
316 circle->SetLayerId( layerName[ndx] );
317 circle->SetDiameter( diameter );
318 circle->SetVertex( dsnOffset );
321 std::ostringstream oss;
322 oss <<
"Round" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
323 <<
IU2um( padSize.
x ) <<
"_um";
331 double dx =
scale( padSize.
x ) / 2.0;
332 double dy =
scale( padSize.
y ) / 2.0;
334 POINT lowerLeft( -dx, -dy );
335 POINT upperRight( dx, dy );
337 lowerLeft += dsnOffset;
338 upperRight += dsnOffset;
340 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
344 padstack->
Append( shape );
354 std::ostringstream oss;
355 oss <<
"Rect" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
356 <<
IU2um( padSize.
x ) <<
"x" <<
IU2um( padSize.
y ) <<
"_um";
364 double dx =
scale( padSize.
x ) / 2.0;
365 double dy =
scale( padSize.
y ) / 2.0;
375 pstart =
POINT( -dr, 0.0 );
376 pstop =
POINT( dr, 0.0 );
383 pstart =
POINT( 0.0, -dr );
384 pstop =
POINT( 0.0, dr );
390 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
396 shape =
new SHAPE( padstack );
398 padstack->
Append( shape );
404 std::ostringstream oss;
405 oss <<
"Oval" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
406 <<
IU2um( padSize.
x ) <<
"x" <<
IU2um( padSize.
y ) <<
"_um";
414 double dx =
scale( padSize.
x ) / 2.0;
415 double dy =
scale( padSize.
y ) / 2.0;
423 POINT lowerLeft( -dx - ddy, -dy - ddx );
424 POINT upperLeft( -dx + ddy, +dy + ddx );
425 POINT upperRight( +dx - ddy, +dy - ddx );
426 POINT lowerRight( +dx + ddy, -dy + ddx );
428 lowerLeft += dsnOffset;
429 upperLeft += dsnOffset;
430 upperRight += dsnOffset;
431 lowerRight += dsnOffset;
433 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
437 padstack->
Append( shape );
440 PATH* polygon =
new PATH( shape, T_polygon );
453 std::ostringstream oss;
454 oss <<
"Trapz" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
455 <<
IU2um( padSize.
x ) <<
"x" <<
IU2um( padSize.
y ) <<
"_"
467 const int circleToSegmentsCount = 36;
479 double correctionFactor = cos(
M_PI / (
double) circleToSegmentsCount );
480 int extra_clearance =
KiROUND( rradius * ( 1.0 - correctionFactor ) );
482 psize.
x += extra_clearance * 2;
483 psize.
y += extra_clearance * 2;
484 rradius += extra_clearance;
494 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
498 padstack->
Append( shape );
501 PATH* polygon =
new PATH( shape, T_polygon );
510 for(
int idx = 0; idx < polygonal_shape.
PointCount(); idx++ )
518 first_corner = corner;
525 std::ostringstream oss;
526 oss <<
"RoundRect" << uniqifier <<
"Pad_"
527 << std::fixed << std::setprecision(6)
528 <<
IU2um( padSize.
x ) <<
'x'
529 <<
IU2um( padSize.
y ) <<
'_'
530 <<
IU2um( rradius ) <<
"_um_"
532 << std::hex << std::uppercase
541 std::vector<VECTOR2I> polygonal_shape;
545#ifdef EXPORT_CUSTOM_PADS_CONVEX_HULL
550 for(
int ii = 0; ii < p_outline.
PointCount(); ++ii )
551 polygonal_shape.push_back( wxPoint( p_outline.
CPoint( ii ) ) );
555 if( polygonal_shape.front() != polygonal_shape.back() )
556 polygonal_shape.push_back( polygonal_shape.front() );
558 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
562 padstack->
Append( shape );
565 PATH* polygon =
new PATH( shape, T_polygon );
571 for(
const VECTOR2I& pt : polygonal_shape )
583 std::ostringstream oss;
584 oss <<
"Cust" << uniqifier <<
"Pad_"
585 << std::fixed << std::setprecision(6)
586 <<
IU2um( padSize.
x ) <<
'x' <<
IU2um( padSize.
y ) <<
'_'
588 << polygonal_shape.size() <<
"_um_"
619 for(
int p = 0; p < fpItems.
GetCount(); ++p )
626 double diameter =
scale(
pad->GetDrillSize().x );
633 for(
int layer=0; layer<layerCount; ++layer )
637 image->m_keepouts.push_back( keepout );
643 circle->SetDiameter( diameter );
644 circle->SetVertex( vertex );
654 if( !mask_copper_layers.any() )
664 padstack = (
PADSTACK*) *iter.base();
673 padNumber =
pad->GetNumber();
676 if( padNumber != wxEmptyString && pinmap.find( padNumber ) == pinmap.end() )
678 pinmap[ padNumber ] = 0;
682 int duplicates = ++pinmap[ padNumber ];
685 "@" + std::to_string( duplicates );
688 pin->m_kiNetCode =
pad->GetNetCode();
713 image->Append( outline );
718 path->SetAperture( 0 );
719 path->SetLayerId(
"signal" );
721 for(
int ii = 0; ii <
chain.PointCount(); ++ii )
724 path->AppendPoint(
mapPt( corner, aFootprint ) );
732 for(
int i = 0; i < fpItems.
GetCount(); ++i )
746 image->Append( outline );
751 path->SetLayerId(
"signal" );
761 image->Append( outline );
767 path->SetLayerId(
"signal" );
776 for(
int ii = 0; ii < polyline.
PointCount(); ++ii )
779 path->AppendPoint(
mapPt( corner, aFootprint ) );
789 image->Append( outline );
794 path->SetLayerId(
"signal" );
796 path->AppendPoint(
mapPt( corner, aFootprint ) );
799 path->AppendPoint(
mapPt( corner, aFootprint ) );
802 path->AppendPoint(
mapPt( corner, aFootprint ) );
805 path->AppendPoint(
mapPt( corner, aFootprint ) );
808 path->AppendPoint(
mapPt( corner, aFootprint ) );
820 image->Append( outline );
821 path =
new PATH( outline, T_polygon );
824 path->SetAperture( 0 );
825 path->SetLayerId(
"signal" );
833 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
836 path->AppendPoint(
mapPt( corner, aFootprint ) );
849 if( !zone->GetIsRuleArea() )
853 ZONE untransformedZone( *zone );
865 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
866 keepout_type = T_keepout;
867 else if( zone->GetDoNotAllowVias() )
868 keepout_type = T_via_keepout;
869 else if( zone->GetDoNotAllowTracks() )
870 keepout_type = T_wire_keepout;
872 keepout_type = T_keepout;
881 image->m_keepouts.push_back( keepout );
883 PATH* mainPolygon =
new PATH( keepout, T_polygon );
890 bool is_first_point =
true;
893 for( iterator = untransformedZone.
IterateWithHoles(); iterator; iterator++ )
902 is_first_point =
false;
916 PATH* cutout =
nullptr;
917 bool isStartContour =
true;
920 for( iterator++; iterator; iterator++ )
924 is_first_point =
true;
925 window =
new WINDOW( keepout );
928 cutout =
new PATH( window, T_polygon );
947 is_first_point =
false;
964 int aTopLayer,
int aBotLayer )
968 double dsnDiameter =
scale( aCopperDiameter );
970 for(
int layer=aTopLayer; layer<=aBotLayer; ++layer )
974 padstack->
Append( shape );
980 circle->SetDiameter( dsnDiameter );
984 snprintf(
name,
sizeof(
name ),
"Via[%d-%d]_%.6g:%.6g_um",
985 aTopLayer, aBotLayer, dsnDiameter,
987 IU2um( aDrillDiameter ) );
1001 aVia->
LayerPair( &topLayerNum, &botLayerNum );
1006 if( topLayer > botLayer )
1007 std::swap( topLayer, botLayer );
1011 topLayer, botLayer );
1021 path->layer_id =
"pcb";
1025 for(
int ii = 0; ii < outline.
PointCount(); ii++ )
1040 PATH* poly_ko =
new PATH(
nullptr, T_polygon );
1044 m_pcb->m_structure->m_keepouts.push_back( keepout );
1048 for(
int jj = 0; jj < hole.
PointCount(); jj++ )
1066 wxString ret = aValue;
1067 ret.Replace( wxT(
"\"" ), wxT(
"''" ) );
1080 std::map<FOOTPRINT*, std::string> componentIds;
1082 std::set<wxString> used;
1086 wxString ref = footprint->GetReference();
1089 ref = wxT(
"REF**" );
1091 wxString unique = ref;
1093 for(
int suffix = 1; !used.insert( unique.Lower() ).second; ++suffix )
1094 unique = wxString::Format( wxT(
"%s_%d" ), ref, suffix );
1096 componentIds[footprint] =
TO_UTF8( unique );
1112 for(
int pcbNdx=0; pcbNdx<layerCount; ++pcbNdx )
1116 m_pcb->m_structure->m_layers.push_back( layer );
1125 case LT_SIGNAL: layerType = T_signal;
break;
1126 case LT_POWER: layerType = T_power;
break;
1130 case LT_MIXED: layerType = T_signal;
break;
1131 case LT_JUMPER: layerType = T_jumper;
break;
1138 property->name =
"index";
1139 property->value = std::to_string( pcbNdx );
1144 m_pcb->m_parser->space_in_quoted_tokens =
true;
1151 m_pcb->m_unit->units = T_um;
1152 m_pcb->m_resolution->units = T_um;
1153 m_pcb->m_resolution->value = 10;
1162 m_pcb->m_structure->SetBOUNDARY( boundary );
1169 int defaultTrackWidth = netSettings->GetDefaultNetclass()->GetTrackWidth();
1170 int defaultClearance = netSettings->GetDefaultNetclass()->GetClearance();
1173 std::vector<std::string>& rules =
m_pcb->m_structure->m_rules->m_rules;
1175 std::snprintf( rule,
sizeof( rule ),
"(width %.6g)",
scale( defaultTrackWidth ) );
1176 rules.push_back( rule );
1178 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g)",
clearance );
1179 rules.push_back( rule );
1186 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g (type smd_smd))",
clearance );
1187 rules.push_back( rule );
1194 int netlessZones = 0;
1199 if( aChain.PointCount() < 3 )
1202 for(
int v = 0; v < aChain.PointCount(); v++ )
1210 if( zone->GetIsRuleArea() || !zone->IsOnCopperLayer() )
1214 wxCHECK2( zoneOutline && zoneOutline->
OutlineCount() > 0,
continue );
1219 wxCHECK2( zoneOutlineFractured.
OutlineCount() == 1,
continue );
1224 std::string netId = zone->GetNetname().utf8_string();
1229 no_net->
m_net_id =
"@:no_net_" + std::to_string( netlessZones++ );
1230 m_pcb->m_network->m_nets.push_back( no_net );
1241 wiring->
wires.push_back( wire );
1245 PATH* mainPolygon =
new PATH( wire, T_polygon );
1248 appendClosedChain( mainPolygon, zoneOutlineFractured.
COutline( 0 ) );
1252 if( !zoneFill || zoneFill->
IsEmpty() )
1271 PATH* cutout =
new PATH( window, T_polygon );
1274 appendClosedChain( cutout, hole );
1284 if( !zone->GetIsRuleArea() )
1292 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
1293 keepout_type = T_keepout;
1294 else if( zone->GetDoNotAllowVias() )
1295 keepout_type = T_via_keepout;
1296 else if( zone->GetDoNotAllowTracks() )
1297 keepout_type = T_wire_keepout;
1299 keepout_type = T_keepout;
1308 m_pcb->m_structure->m_keepouts.push_back( keepout );
1310 PATH* mainPolygon =
new PATH( keepout, T_polygon );
1317 bool is_first_point =
true;
1320 for( iterator = zone->IterateWithHoles(); iterator; iterator++ )
1324 if( is_first_point )
1327 is_first_point =
false;
1340 WINDOW* window =
nullptr;
1341 PATH* cutout =
nullptr;
1343 bool isStartContour =
true;
1346 for( iterator++; iterator; iterator++ )
1348 if( isStartContour )
1350 is_first_point =
true;
1351 window =
new WINDOW( keepout );
1354 cutout =
new PATH( window, T_polygon );
1366 if( is_first_point )
1369 is_first_point =
false;
1385 std::string componentId;
1386 int highestNetCode = 0;
1391 highestNetCode = std::max( highestNetCode, i->GetNetCode() );
1396 m_nets.resize( highestNetCode + 1,
nullptr );
1398 for(
unsigned i = 1 ; i <
m_nets.size(); ++i )
1403 if( i->GetNetCode() > 0 )
1413 componentId = componentIds[footprint];
1423 int netcode =
pin.m_kiNetCode;
1451 comp->m_places.push_back( place );
1453 place->
SetRotation( footprint->GetOrientationDegrees() );
1459 if( footprint->GetFlag() )
1472 boost::ptr_set<PADSTACK>::auto_type ps =
m_padstackset.release( i );
1475 m_pcb->m_library->AddPadstack( padstack );
1479 for(
unsigned n = 1; n <
m_nets.size(); ++n )
1486 m_pcb->m_network->m_nets.push_back( net );
1493 std::unordered_map<wxString, NETCLASS*> netclassesInUse;
1497 NETCLASS* netclass = net->GetNetClass();
1504 if( !netclassesInUse.contains(
name ) )
1505 netclassesInUse[
name] = netclass;
1527 wxASSERT(
m_pcb->m_library->m_vias.size() == 0 );
1528 m_pcb->m_library->AppendVia(
via );
1534 for(
const auto& [
name, netclass] : netclassesInUse )
1555 if( !track->IsType( { PCB_TRACE_T, PCB_ARC_T } ) )
1558 int netcode = track->GetNetCode();
1568 wiring->
wires.push_back( wire );
1571 if( track->IsLocked() )
1582 path->aperture_width =
scale( track->GetWidth() );
1583 path->AppendPoint(
mapPt( track->GetStart() ) );
1584 path->AppendPoint(
mapPt( track->GetEnd() ) );
1597 int netcode =
via->GetNetCode();
1612 m_pcb->m_wiring->wire_vias.push_back( dsnVia );
1622 if(
via->IsLocked() )
1637 VIA* vias =
m_pcb->m_structure->m_via;
1639 for(
unsigned viaNdx = 0; viaNdx <
m_pcb->m_library->m_vias.size(); ++viaNdx )
1640 vias->
AppendVia(
m_pcb->m_library->m_vias[viaNdx].m_padstack_id.c_str() );
1646 exportNETCLASS( netSettings->GetDefaultNetclass().get(), aBoard );
1648 for(
const auto& [
name, netclass] : netclassesInUse )
1687 m_pcb->m_network->m_classes.push_back( clazz );
1693 if( net->GetNetClass()->GetName() == clazz->
m_class_id )
1701 std::snprintf(
text,
sizeof(
text ),
"(width %.6g)",
scale( trackWidth ) );
1721 snprintf(
text,
sizeof(
text ),
"(use_via \"%s\")",
via->GetPadstackId().c_str() );
1735 footprint->SetFlag( 0 );
1737 if( footprint->GetLayer() ==
B_Cu )
1740 footprint->SetFlag( 1 );
1758 if( footprint->GetFlag() )
1761 footprint->SetFlag( 0 );
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Handles how to draw a screen (a board, a schematic ...)
bool IsContentModified() const
void SetContentModified(bool aModified=true)
std::shared_ptr< NET_SETTINGS > m_NetSettings
Information pertinent to a Pcbnew printed circuit board.
const NETINFO_LIST & GetNetInfo() const
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
const ZONES & Zones() const
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Return the type of the copper layer given by aLayer.
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
int GetCopperLayerCount() const
const FOOTPRINTS & Footprints() const
const TRACKS & Tracks() const
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, bool aInferOutlineIfNecessary, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr, bool aAllowUseArcsInPolygons=false, bool aIncludeNPTHAsOutlines=false)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
constexpr size_type GetWidth() const
constexpr size_type GetHeight() const
int GetCount() const
Return the number of objects in the list.
The <class_descriptor> in the specctra spec.
std::vector< std::string > m_circuit
circuit descriptor list
std::vector< std::string > m_net_ids
Implement a <component_descriptor> in the specctra dsn spec.
Used for <keepout_descriptor> and <plane_descriptor>.
void AddWindow(WINDOW *aWindow)
void SetShape(ELEM *aShape)
DSN_T layer_type
one of: T_signal, T_power, T_mixed, T_jumper
A <net_descriptor> in the DSN spec.
std::vector< PIN_REF > m_pins
Hold either a via or a pad definition.
std::string m_padstack_id
void SetPadstackId(const char *aPadstackId)
Support both the <path_descriptor> and the <polygon_descriptor> per the specctra dsn spec.
void SetLayerId(const std::string &aLayerId)
void AppendPoint(const POINT &aPoint)
Implement a <placement_reference> in the specctra dsn spec.
void SetVertex(const POINT &aVertex)
void SetRotation(double aRotation)
std::string m_part_number
std::string m_component_id
reference designator
void SetLayerId(std::string &aLayerId)
void SetCorners(const POINT &aPoint0, const POINT &aPoint1)
std::vector< std::string > m_rules
rules are saved in std::string form.
A "(shape ..)" element in the specctra dsn spec.
A DSN data tree, usually coming from a DSN file.
int m_top_via_layer
specctra cu layers, 0 based index:
IMAGE * makeIMAGE(BOARD *aBoard, FOOTPRINT *aFootprint)
Allocates an I#MAGE on the heap and creates all the PINs according to the PADs in the FOOTPRINT.
void buildLayerMaps(BOARD *aBoard)
Create a few data translation structures for layer name and number mapping between the DSN::PCB struc...
std::map< int, PCB_LAYER_ID > m_pcbLayer2kicad
maps PCB layer number to BOARD layer numbers
void ExportPCB(const wxString &aFilename, bool aNameChange=false)
Write the internal PCB instance out as a SPECTRA DSN format file.
SHAPE_POLY_SET m_brd_outlines
void FlipFOOTPRINTs(BOARD *aBoard)
Flip the footprints which are on the back side of the board to the front.
bool m_footprintsAreFlipped
void deleteNETs()
Delete all the NETs that may be in here.
void fillBOUNDARY(BOARD *aBoard, BOUNDARY *aBoundary)
Make the board perimeter for the DSN file by filling the BOUNDARY element in the specctra element tre...
PADSTACK * makePADSTACK(BOARD *aBoard, PAD *aPad)
Create a PADSTACK which matches the given pad.
void SetPCB(PCB *aPcb)
Delete any existing PCB and replaces it with the given one.
std::vector< std::string > m_layerIds
indexed by PCB layer number
static PCB * MakePCB()
Make a PCB with all the default ELEMs and parts on the heap.
bool BuiltBoardOutlines(BOARD *aBoard)
Build the board outlines and store it in m_brd_outlines.
void exportNETCLASS(const NETCLASS *aNetClass, const BOARD *aBoard)
Export aNetClass to the DSN file.
PADSTACK * makeVia(int aCopperDiameter, int aDrillDiameter, int aTopLayer, int aBotLayer)
Make a round through hole PADSTACK using the given KiCad diameter in deci-mils.
boost::ptr_set< PADSTACK > m_padstackset
std::map< PCB_LAYER_ID, int > m_kicadLayer2pcb
maps BOARD layer number to PCB layer numbers
std::vector< NET * > m_nets
we don't want ownership here permanently, so we don't use boost::ptr_vector
void FromBOARD(BOARD *aBoard)
Add the entire BOARD to the PCB but does not write it out.
void RevertFOOTPRINTs(BOARD *aBoard)
Flip the footprints which were on the back side of the board back to the back.
A <via_descriptor> in the specctra dsn spec.
void AppendVia(const char *aViaName)
void SetShape(ELEM *aShape)
A <wire_via_descriptor> in the specctra dsn spec.
std::string m_padstack_id
std::vector< POINT > m_vertexes
A <wire_shape_descriptor> in the specctra dsn spec.
void AddWindow(WINDOW *aWindow)
void SetShape(ELEM *aShape)
A <wiring_descriptor> in the specctra dsn spec.
boost::ptr_vector< WIRE > wires
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
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()
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
LSEQ CuStack() const
Return a sequence of copper layers in starting from the front/top and extending to the back/bottom.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
A collection of nets and the parameters used to route or test these nets.
int GetViaDiameter() const
static const char Default[]
the name of the default NETCLASS
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
int GetTrackWidth() const
Handle the data for a net.
const wxString & GetNetname() const
Wrapper class, so you can iterate through NETINFO_ITEM*s, not std::pair<int/wxString,...
Container for NETINFO_ITEM elements, which are the nets.
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
void MergePrimitivesAsPolygon(PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aMergedPolygon, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Merge all basic shapes to a SHAPE_POLY_SET.
int GetRoundRectCornerRadius(PCB_LAYER_ID aLayer) const
const BOX2I GetBoundingBox() const override
The bounding box is cached, so this will be efficient most of the time.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetOffset(PCB_LAYER_ID aLayer) const
VECTOR2I GetDrillSize() const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
VECTOR2I GetSize(PCB_LAYER_ID aLayer) const
int GetChamferPositions(PCB_LAYER_ID aLayer) const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
bool ExportSpecctraFile(const wxString &aFullFilename)
Export the current BOARD to a specctra dsn file.
int GetWidth() const override
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Collect all BOARD_ITEM objects of a given set of KICAD_T type(s).
void Collect(BOARD_ITEM *aBoard, const std::vector< KICAD_T > &aTypes)
Collect BOARD_ITEM objects using this class's Inspector method, which does the collection.
int GetWidth() const override
int GetDrillValue() const
Calculate the drill value for vias (m_drill if > 0, or default drill value for the board).
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Return the 2 layers used by the via (the via actually uses all layers between these 2 layers)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
bool IsEndContour() const
Represent a set of closed polygons.
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
int FullPointCount() const
Return the number of points in the shape poly set.
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
void Simplify()
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections)
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
void Unfracture()
Convert a single outline slitted ("fractured") polygon into a set ouf outlines with holes.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int OutlineCount() const
Return the number of outlines in the set.
void Fracture(bool aSimplify=true)
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
const std::vector< POLYGON > & CPolygons() const
const char * c_str() const
Handle a list of polygons defining a copper zone.
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Return an iterator to visit all points of the zone's main outline with holes.
void Rotate(const VECTOR2I &aCentre, const EDA_ANGLE &aAngle) override
Rotate the outlines.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
int ConvertArcToPolyline(SHAPE_LINE_CHAIN &aPolyline, VECTOR2I aCenter, int aRadius, const EDA_ANGLE &aStartAngleDeg, const EDA_ANGLE &aArcAngleDeg, double aAccuracy, ERROR_LOC aErrorLoc)
Generate a polyline to approximate a arc.
void TransformRoundChamferedRectToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aPosition, const VECTOR2I &aSize, const EDA_ANGLE &aRotation, int aCornerRadius, double aChamferRatio, int aChamferCorners, int aInflate, int aError, ERROR_LOC aErrorLoc)
Convert a rectangle with rounded corners and/or chamfered corners to a polygon.
void BuildConvexHull(std::vector< VECTOR2I > &aResult, const std::vector< VECTOR2I > &aPoly)
Calculate the convex hull of a list of points in counter-clockwise order.
static bool empty(const wxTextEntryBase *aCtrl)
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_360
static constexpr EDA_ANGLE ANGLE_180
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
a few functions useful in geometry calculations.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
This source file implements export and import capabilities to the specctra dsn file format.
std::map< wxString, int > PINMAP
data type used to ensure unique-ness of pin names, holding (wxString and int)
static double mapX(int x)
static double mapY(int y)
static double IU2um(int kicadDist)
static POINT mapPt(const VECTOR2I &pt)
Convert a KiCad point into a DSN file point.
static bool isRoundKeepout(PAD *aPad)
Decide if the pad is a copper-less through hole which needs to be made into a round keepout.
static std::string sanitizeForDSNString(const wxString &aValue)
static double scale(int kicadDist)
Convert a distance from Pcbnew internal units to the reported Specctra DSN units in floating point fo...
void ExportBoardToSpecctraFile(BOARD *aBoard, const wxString &aFullFilename)
Helper method to export board to DSN file.
static PATH * makePath(const POINT &aStart, const POINT &aEnd, const std::string &aLayerName)
Create a PATH element with a single straight line, a pair of vertices.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NET
This item represents a net.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
A <pin_reference> definition in the specctra dsn spec.
A point in the SPECCTRA DSN coordinate system.
void FixNegativeZero()
Change negative zero to positive zero in the IEEE floating point storage format.
A storage class for 128-bit hash value.
std::string ToString() const
const SHAPE_LINE_CHAIN chain
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
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
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_PAD_T
class PAD, a pad in a footprint
VECTOR2< int32_t > VECTOR2I