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 )
158static inline double IU2um(
int kicadDist )
164static inline double mapX(
int x )
170static inline double mapY(
int y )
197 return mapPt( fpRelative );
206 if( aPad->
GetShape() == PAD_SHAPE::CIRCLE )
226 path->AppendPoint( aStart );
227 path->AppendPoint( aEnd );
228 path->SetLayerId( aLayerName.c_str() );
242 std::string uniqifier;
249 int reportedLayers = 0;
256 bool onAllCopperLayers = ( (aPad->
GetLayerSet() & all_cu) == all_cu );
258 if( onAllCopperLayers )
263 for(
int layer=0; layer<copperCount; ++layer )
267 if( onAllCopperLayers || aPad->
IsOnLayer( kilayer ) )
269 layerName[reportedLayers++] =
m_layerIds[layer].c_str();
271 if( !onAllCopperLayers )
275 else if( layer == copperCount - 1 )
278 uniqifier += char(
'0' + layer);
293 dsnOffset =
mapPt( offset );
296 std::snprintf( offsetTxt,
sizeof( offsetTxt ),
"[%.6g,%.6g]", dsnOffset.
x, dsnOffset.
y );
298 uniqifier += offsetTxt;
303 case PAD_SHAPE::CIRCLE:
307 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
311 padstack->
Append( shape );
322 snprintf(
name,
sizeof(
name),
"Round%sPad_%.6g_um",
331 case PAD_SHAPE::RECTANGLE:
336 POINT lowerLeft( -dx, -dy );
337 POINT upperRight( dx, dy );
339 lowerLeft += dsnOffset;
340 upperRight += dsnOffset;
342 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
346 padstack->
Append( shape );
356 snprintf(
name,
sizeof(
name ),
"Rect%sPad_%.6gx%.6g_um", uniqifier.c_str(),
365 case PAD_SHAPE::OVAL:
378 pstart =
POINT( -dr, 0.0 );
379 pstop =
POINT( dr, 0.0 );
386 pstart =
POINT( 0.0, -dr );
387 pstop =
POINT( 0.0, dr );
393 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
399 shape =
new SHAPE( padstack );
401 padstack->
Append( shape );
404 path->aperture_width = 2.0 * radius;
407 snprintf(
name,
sizeof(
name ),
"Oval%sPad_%.6gx%.6g_um", uniqifier.c_str(),
415 case PAD_SHAPE::TRAPEZOID:
424 POINT lowerLeft( -dx - ddy, -dy - ddx );
425 POINT upperLeft( -dx + ddy, +dy + ddx );
426 POINT upperRight( +dx - ddy, +dy - ddx );
427 POINT lowerRight( +dx + ddy, -dy + ddx );
429 lowerLeft += dsnOffset;
430 upperLeft += dsnOffset;
431 upperRight += dsnOffset;
432 lowerRight += dsnOffset;
434 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
438 padstack->
Append( shape );
441 PATH* polygon =
new PATH( shape, T_polygon );
454 snprintf(
name,
sizeof(
name ),
"Trapz%sPad_%.6gx%.6g_%c%.6gx%c%.6g_um", uniqifier.c_str(),
464 case PAD_SHAPE::CHAMFERED_RECT:
465 case PAD_SHAPE::ROUNDRECT:
468 const int circleToSegmentsCount = 36;
480 double correctionFactor = cos( M_PI / (
double) circleToSegmentsCount );
481 int extra_clearance =
KiROUND( rradius * ( 1.0 - correctionFactor ) );
483 psize.
x += extra_clearance * 2;
484 psize.
y += extra_clearance * 2;
485 rradius += extra_clearance;
486 bool doChamfer = aPad->
GetShape() == PAD_SHAPE::CHAMFERED_RECT;
496 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
500 padstack->
Append( shape );
503 PATH* polygon =
new PATH( shape, T_polygon );
512 for(
int idx = 0; idx < polygonal_shape.
PointCount(); idx++ )
520 first_corner = corner;
527 snprintf(
name,
sizeof(
name ),
"RoundRect%sPad_%.6gx%.6g_%.6g_um_%f_%X", uniqifier.c_str(),
538 case PAD_SHAPE::CUSTOM:
540 std::vector<VECTOR2I> polygonal_shape;
544#ifdef EXPORT_CUSTOM_PADS_CONVEX_HULL
549 for(
int ii = 0; ii < p_outline.
PointCount(); ++ii )
550 polygonal_shape.push_back( wxPoint( p_outline.
CPoint( ii ) ) );
554 if( polygonal_shape.front() != polygonal_shape.back() )
555 polygonal_shape.push_back( polygonal_shape.front() );
557 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
561 padstack->
Append( shape );
564 PATH* polygon =
new PATH( shape, T_polygon );
570 for(
unsigned idx = 0; idx < polygonal_shape.size(); idx++ )
572 POINT corner(
scale( polygonal_shape[idx].x ),
scale( -polygonal_shape[idx].y ) );
581 snprintf(
name,
sizeof(
name ),
"Cust%sPad_%.6gx%.6g_%.6gx_%.6g_%d_um_%s",
584 hash.
Format(
true ).c_str() );
615 for(
int p = 0; p < fpItems.
GetCount(); ++p )
622 double diameter =
scale(
pad->GetDrillSize().x );
629 for(
int layer=0; layer<layerCount; ++layer )
633 image->m_keepouts.push_back( keepout );
650 if( !mask_copper_layers.any() )
654 PADSTACKSET::iterator iter =
m_padstackset.find( *padstack );
660 padstack = (
PADSTACK*) *iter.base();
669 padNumber =
pad->GetNumber();
672 if( padNumber != wxEmptyString && pinmap.find( padNumber ) == pinmap.end() )
674 pinmap[ padNumber ] = 0;
678 int duplicates = ++pinmap[ padNumber ];
681 "@" + std::to_string( duplicates );
684 pin->m_kiNetCode =
pad->GetNetCode();
702 for(
int i = 0; i < fpItems.
GetCount(); ++i )
710 case SHAPE_T::SEGMENT:
713 image->Append( outline );
718 path->SetLayerId(
"signal" );
723 case SHAPE_T::CIRCLE:
728 image->Append( outline );
734 path->SetLayerId(
"signal" );
743 for(
int ii = 0; ii < polyline.
PointCount(); ++ii )
746 path->AppendPoint(
mapPt( corner, aFootprint ) );
752 case SHAPE_T::RECTANGLE:
756 image->Append( outline );
761 path->SetLayerId(
"signal" );
763 path->AppendPoint(
mapPt( corner, aFootprint ) );
766 path->AppendPoint(
mapPt( corner, aFootprint ) );
769 path->AppendPoint(
mapPt( corner, aFootprint ) );
772 path->AppendPoint(
mapPt( corner, aFootprint ) );
783 image->Append( outline );
787 path->SetAperture( 0 );
788 path->SetLayerId(
"signal" );
808 arcAngle = -arcAngle;
827 for(
int ii = polyline.
PointCount() - 1; ii >= 0; --ii )
845 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
848 path->AppendPoint(
mapPt( corner, aFootprint ) );
861 if( !zone->GetIsRuleArea() )
865 ZONE untransformedZone( *zone );
877 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
878 keepout_type = T_keepout;
879 else if( zone->GetDoNotAllowVias() )
880 keepout_type = T_via_keepout;
881 else if( zone->GetDoNotAllowTracks() )
882 keepout_type = T_wire_keepout;
884 keepout_type = T_keepout;
890 for(
int layer = 0; layer < copperCount; layer++ )
892 if( layer == copperCount-1 )
899 image->m_keepouts.push_back( keepout );
901 PATH* mainPolygon =
new PATH( keepout, T_polygon );
908 bool is_first_point =
true;
911 for( iterator = untransformedZone.
IterateWithHoles(); iterator; iterator++ )
913 VECTOR2I point( iterator->x, iterator->y );
920 is_first_point =
false;
934 PATH* cutout =
nullptr;
935 bool isStartContour =
true;
938 for( iterator++; iterator; iterator++ )
942 is_first_point =
true;
943 window =
new WINDOW( keepout );
946 cutout =
new PATH( window, T_polygon );
958 VECTOR2I point( iterator->x, iterator->y );
965 is_first_point =
false;
982 int aTopLayer,
int aBotLayer )
986 double dsnDiameter =
scale( aCopperDiameter );
988 for(
int layer=aTopLayer; layer<=aBotLayer; ++layer )
992 padstack->
Append( shape );
1002 snprintf(
name,
sizeof(
name ),
"Via[%d-%d]_%.6g:%.6g_um",
1003 aTopLayer, aBotLayer, dsnDiameter,
1005 IU2um( aDrillDiameter ) );
1019 aVia->
LayerPair( &topLayerNum, &botLayerNum );
1024 if( topLayer > botLayer )
1025 std::swap( topLayer, botLayer );
1037 path->layer_id =
"pcb";
1041 for(
int ii = 0; ii < outline.
PointCount(); ii++ )
1056 PATH* poly_ko =
new PATH(
nullptr, T_polygon );
1064 for(
int jj = 0; jj < hole.
PointCount(); jj++ )
1093 if( footprint->GetReference() == wxEmptyString )
1095 THROW_IO_ERROR( wxString::Format(
_(
"Footprint with value of '%s' has an empty "
1096 "reference designator." ),
1097 footprint->GetValue() ) );
1103 if( !refpair.second )
1105 THROW_IO_ERROR( wxString::Format(
_(
"Multiple footprints have the reference "
1106 "designator '%s'." ),
1107 footprint->GetReference() ) );
1124 for(
int pcbNdx=0; pcbNdx<layerCount; ++pcbNdx )
1137 case LT_SIGNAL: layerType = T_signal;
break;
1138 case LT_POWER: layerType = T_power;
break;
1142 case LT_MIXED: layerType = T_signal;
break;
1143 case LT_JUMPER: layerType = T_jumper;
break;
1150 property->name =
"index";
1151 property->value = std::to_string( pcbNdx );
1181 int defaultTrackWidth = netSettings->m_DefaultNetClass->GetTrackWidth();
1182 int defaultClearance = netSettings->m_DefaultNetClass->GetClearance();
1183 double clearance =
scale( defaultClearance );
1187 std::snprintf( rule,
sizeof( rule ),
"(width %.6g)",
scale( defaultTrackWidth ) );
1188 rules.push_back( rule );
1190 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g)", clearance );
1191 rules.push_back( rule );
1199 double default_smd = clearance;
1201 if( default_smd <= 6.0 )
1204 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g (type default_smd))", default_smd );
1206 rules.push_back( rule );
1211 clearance =
scale( defaultClearance ) / 4;
1213 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g (type smd_smd))", clearance );
1214 rules.push_back( rule );
1220 int netlessZones = 0;
1224 if( zone->GetIsRuleArea() )
1228 if( ! zone->IsOnCopperLayer() )
1235 for(
int layer = 0; layer < copperCount; layer++ )
1237 if( layer == copperCount-1 )
1247 PATH* mainPolygon =
new PATH( plane, T_polygon );
1252 if( plane->
m_name.size() == 0 )
1259 no_net->
m_net_id =
"@:no_net_" + std::to_string( netlessZones++ );
1273 bool is_first_point =
true;
1275 for( iterator = zone->IterateWithHoles(); iterator; iterator++ )
1277 VECTOR2I point( iterator->x, iterator->y );
1279 if( is_first_point )
1282 is_first_point =
false;
1296 WINDOW* window =
nullptr;
1297 PATH* cutout =
nullptr;
1299 bool isStartContour =
true;
1302 for( iterator++; iterator; iterator++ )
1304 if( isStartContour )
1306 is_first_point =
true;
1307 window =
new WINDOW( plane );
1310 cutout =
new PATH( window, T_polygon );
1322 VECTOR2I point( iterator->x, iterator->y );
1324 if( is_first_point )
1327 is_first_point =
false;
1344 if( !zone->GetIsRuleArea() )
1352 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
1353 keepout_type = T_keepout;
1354 else if( zone->GetDoNotAllowVias() )
1355 keepout_type = T_via_keepout;
1356 else if( zone->GetDoNotAllowTracks() )
1357 keepout_type = T_wire_keepout;
1359 keepout_type = T_keepout;
1365 for(
int layer = 0; layer < copperCount; layer++ )
1367 if( layer == copperCount - 1 )
1376 PATH* mainPolygon =
new PATH( keepout, T_polygon );
1383 bool is_first_point =
true;
1386 for( iterator = zone->IterateWithHoles(); iterator; iterator++ )
1388 VECTOR2I point( iterator->x, iterator->y );
1390 if( is_first_point )
1393 is_first_point =
false;
1406 WINDOW* window =
nullptr;
1407 PATH* cutout =
nullptr;
1409 bool isStartContour =
true;
1412 for( iterator++; iterator; iterator++ )
1414 if( isStartContour )
1416 is_first_point =
true;
1417 window =
new WINDOW( keepout );
1420 cutout =
new PATH( window, T_polygon );
1430 VECTOR2I point( iterator->x, iterator->y );
1432 if( is_first_point )
1435 is_first_point =
false;
1451 std::string componentId;
1452 int highestNetCode = 0;
1457 highestNetCode = std::max( highestNetCode, i->GetNetCode() );
1462 m_nets.resize( highestNetCode + 1,
nullptr );
1464 for(
unsigned i = 1 ; i <
m_nets.size(); ++i )
1469 if( i->GetNetCode() > 0 )
1470 m_nets[i->GetNetCode()]->m_net_id =
TO_UTF8( i->GetNetname() );
1479 componentId =
TO_UTF8( footprint->GetReference() );
1487 for(
unsigned p = 0; p <
image->m_pins.size(); ++p )
1490 int netcode =
pin->m_kiNetCode;
1520 place->
SetRotation( footprint->GetOrientationDegrees() );
1526 if( footprint->GetFlag() )
1547 for(
unsigned n = 1; n <
m_nets.size(); ++n )
1573 netSettings->m_DefaultNetClass->GetViaDrill(),
1586 for(
const auto& [
name, netclass ] : netSettings->m_NetClasses )
1588 via =
makeVia( netclass->GetViaDiameter(), netclass->GetViaDrill(),
1602 std::string netname;
1606 int old_netcode = -1;
1612 if( !track->IsType( { PCB_TRACE_T, PCB_ARC_T } ) )
1615 int netcode = track->GetNetCode();
1620 if( old_netcode != netcode
1621 || old_width != track->GetWidth()
1622 || old_layer != track->GetLayer()
1623 || (
path &&
path->points.back() !=
mapPt( track->GetStart() ) ) )
1625 old_width = track->GetWidth();
1626 old_layer = track->GetLayer();
1628 if( old_netcode != netcode )
1630 old_netcode = netcode;
1638 wiring->
wires.push_back( wire );
1641 if( track->IsLocked() )
1646 int kiLayer = track->GetLayer();
1652 path->aperture_width =
scale( old_width );
1653 path->AppendPoint(
mapPt( track->GetStart() ) );
1657 path->AppendPoint(
mapPt( track->GetEnd() ) );
1670 int netcode =
via->GetNetCode();
1695 if(
via->IsLocked() )
1720 for(
const auto& [
name, netclass ] : netSettings->m_NetClasses )
1767 if( net->GetNetClass()->GetName() == clazz->
m_class_id )
1774 int trackWidth = aNetClass->GetTrackWidth();
1775 std::snprintf(
text,
sizeof(
text ),
"(width %.6g)",
scale( trackWidth ) );
1779 int clearance = aNetClass->GetClearance();
1780 std::snprintf(
text,
sizeof(
text ),
"(clearance %.6g)",
scale( clearance ) );
1793 snprintf(
text,
sizeof(
text),
"(use_via %s)",
via->GetPadstackId().c_str() );
1807 footprint->SetFlag( 0 );
1809 if( footprint->GetLayer() ==
B_Cu )
1811 footprint->Flip( footprint->GetPosition(),
false );
1812 footprint->SetFlag( 1 );
1830 if( footprint->GetFlag() )
1832 footprint->Flip( footprint->GetPosition(),
false );
1833 footprint->SetFlag( 0 );
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
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
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr, bool aAllowUseArcsInPolygons=false)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
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.
FOOTPRINTS & Footprints()
int GetCopperLayerCount() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
coord_type GetHeight() const
coord_type GetWidth() const
int GetCount() const
Return the number of objects in the list.
void SetLayerId(const char *aLayerId)
void SetVertex(const POINT &aVertex)
void SetDiameter(double aDiameter)
The <class_descriptor> in the specctra spec.
STRINGS m_circuit
circuit descriptor list
Implement a <component_descriptor> in the specctra dsn spec.
A <plane_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
PADSTACK * LookupVia(PADSTACK *aVia)
Add the via only if one exactly like it does not already exist in the padstack container.
void AppendVia(PADSTACK *aVia)
Add aVia to the internal via container.
IMAGE * LookupIMAGE(IMAGE *aImage)
Add the image only if one exactly like it does not already exist in the image container.
void AddPadstack(PADSTACK *aPadstack)
A <net_descriptor> in the DSN spec.
Hold either a via or a pad definition.
std::string m_padstack_id
void SetPadstackId(const char *aPadstackId)
bool space_in_quoted_tokens
Support both the <path_descriptor> and the <polygon_descriptor> per the specctra dsn spec.
void SetLayerId(const char *aLayerId)
void AppendPoint(const POINT &aPoint)
COMPONENT * LookupCOMPONENT(const std::string &imageName)
Look up a COMPONENT by name.
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 SetCorners(const POINT &aPoint0, const POINT &aPoint1)
void SetLayerId(const char *aLayerId)
A <rule_descriptor> in the specctra dsn spec.
STRINGS 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...
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.
STRINGS m_layerIds
indexed by PCB layer number
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.
static PCB * MakePCB()
Make a PCB with all the default ELEMs and parts on the heap.
std::vector< PCB_LAYER_ID > m_pcbLayer2kicad
maps PCB layer number to BOARD layer numbers
bool BuiltBoardOutlines(BOARD *aBoard)
Build the board outlines and store it in m_brd_outlines.
std::vector< int > m_kicadLayer2pcb
maps BOARD layer number to PCB layer numbers
PADSTACK * makeVia(int aCopperDiameter, int aDrillDiameter, int aTopLayer, int aBotLayer)
Make a round through hole #PADSTACK using the given KiCad diameter in deci-mils.
std::vector< NET * > m_nets
we don't want ownership here permanently, so we don't use boost::ptr_vector
PADSTACKSET m_padstackset
void exportNETCLASS(const std::shared_ptr< NETCLASS > &aNetClass, BOARD *aBoard)
Export aNetClass to the DSN file.
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.
void SetBOUNDARY(BOUNDARY *aBoundary)
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
A <wire_shape_descriptor> in the specctra dsn spec.
void SetShape(ELEM *aShape)
A <wiring_descriptor> in the specctra dsn spec.
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.
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 LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
std::string Format(bool aCompactForm=false)
static const char Default[]
the name of the default NETCLASS
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.
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
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 & GetDrillSize() const
void MergePrimitivesAsPolygon(SHAPE_POLY_SET *aMergedPolygon, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Merge all basic shapes to a SHAPE_POLY_SET.
int GetRoundRectCornerRadius() const
const VECTOR2I & GetOffset() const
const VECTOR2I & GetDelta() const
PAD_SHAPE GetShape() const
int GetChamferPositions() const
const VECTOR2I & GetSize() const
double GetChamferRectRatio() 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.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
int GetWidth() const override
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 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.
void Clear()
Remove all points from the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Base class for iterating over all vertices in a given SHAPE_POLY_SET.
bool IsEndContour() const
Represent a set of closed polygons.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
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(POLYGON_MODE aFastMode)
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFastMo...
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the reference to aHole-th hole in the aIndex-th outline.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) 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 TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
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_180
static constexpr EDA_ANGLE & ANGLE_360
static constexpr EDA_ANGLE & ANGLE_0
a few functions useful in geometry calculations.
#define THROW_IO_ERROR(msg)
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
This source file implements export and import capabilities to the specctra dsn file format.
std::vector< std::string > STRINGS
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.
std::set< std::string > STRINGSET
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.
std::pair< STRINGSET::iterator, bool > STRINGSET_PAIR
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
#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.
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
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".