KiCad PCB EDA Suite
MWAVE Namespace Reference

Classes

struct  INDUCTOR_PATTERN
 Parameters for construction of a microwave inductor. More...
 

Functions

MODULECreateMicrowaveInductor (INDUCTOR_PATTERN &aPattern, PCB_EDIT_FRAME *aPcbFrame, wxString &aErrorMessage)
 Creates an S-shaped coil footprint for microwave applications. More...
 

Function Documentation

MODULE * MWAVE::CreateMicrowaveInductor ( INDUCTOR_PATTERN aPattern,
PCB_EDIT_FRAME aPcbFrame,
wxString &  aErrorMessage 
)

Creates an S-shaped coil footprint for microwave applications.

Definition at line 263 of file microwave_inductor.cpp.

References BuildCornersList_S_Shape(), MODULE::CalculateBoundingBox(), EDA_ITEM::ClearFlags(), PCB_BASE_FRAME::CreateNewModule(), EuclideanNorm(), g_UserUnit, DRAWSEGMENT::GetEnd(), BOARD_ITEM::GetLayer(), MODULE::GetPosition(), D_PAD::GetPosition(), DRAWSEGMENT::GetStart(), EDA_TEXT::GetTextSize(), MODULE::GraphicalItemsList(), DLIST< T >::Insert(), KiROUND(), MWAVE::INDUCTOR_PATTERN::m_End, MWAVE::INDUCTOR_PATTERN::m_length, MWAVE::INDUCTOR_PATTERN::m_Start, MWAVE::INDUCTOR_PATTERN::m_Width, MOD_CMS, MOD_VIRTUAL, D_PAD::Next(), PAD_ATTRIB_SMD, PAD_SHAPE_CIRCLE, MODULE::PadsList(), DLIST< T >::PushBack(), DLIST< T >::PushFront(), MODULE::Reference(), S_SEGMENT, D_PAD::SetAttribute(), MODULE::SetAttributes(), DRAWSEGMENT::SetEnd(), EDGE_MODULE::SetEnd0(), MODULE::SetFPID(), BOARD_ITEM::SetLayer(), D_PAD::SetLayerSet(), D_PAD::SetName(), D_PAD::SetPos0(), TEXTE_MODULE::SetPosition(), MODULE::SetPosition(), D_PAD::SetPosition(), DRAWSEGMENT::SetShape(), D_PAD::SetShape(), D_PAD::SetSize(), DRAWSEGMENT::SetStart(), EDGE_MODULE::SetStart0(), DRAWSEGMENT::SetWidth(), StringFromValue(), MODULE::Value(), ValueFromString(), wxPoint::x, and wxPoint::y.

Referenced by PCB_EDIT_FRAME::Begin_Self(), and MICROWAVE_TOOL::createInductorBetween().

265 {
266  /* Build a microwave inductor footprint.
267  * - Length Mself.lng
268  * - Extremities Mself.m_Start and Mself.m_End
269  * We must determine:
270  * Mself.nbrin = number of segments perpendicular to the direction
271  * (The coil nbrin will demicercles + 1 + 2 1 / 4 circle)
272  * Mself.lbrin = length of a strand
273  * Mself.radius = radius of rounded parts of the coil
274  * Mself.delta = segments extremities connection between him and the coil even
275  *
276  * The equations are
277  * Mself.m_Size.x = 2 * Mself.radius + Mself.lbrin
278  * Mself.m_Size.y * Mself.delta = 2 + 2 * Mself.nbrin * Mself.radius
279  * Mself.lng = 2 * Mself.delta / / connections to the coil
280  + (Mself.nbrin-2) * Mself.lbrin / / length of the strands except 1st and last
281  + (Mself.nbrin 1) * (PI * Mself.radius) / / length of rounded
282  * Mself.lbrin + / 2 - Melf.radius * 2) / / length of 1st and last bit
283  *
284  * The constraints are:
285  * Nbrin >= 2
286  * Mself.radius < Mself.m_Size.x
287  * Mself.m_Size.y = Mself.radius * 4 + 2 * Mself.raccord
288  * Mself.lbrin> Mself.radius * 2
289  *
290  * The calculation is conducted in the following way:
291  * Initially:
292  * Nbrin = 2
293  * Radius = 4 * m_Size.x (arbitrarily fixed value)
294  * Then:
295  * Increasing the number of segments to the desired length
296  * (Radius decreases if necessary)
297  */
298 
299  D_PAD* pad;
300  int ll;
301  wxString msg;
302 
303  auto pt = inductorPattern.m_End - inductorPattern.m_Start;
304  int min_len = KiROUND( EuclideanNorm( pt ) );
305  inductorPattern.m_length = min_len;
306 
307  // Enter the desired length.
308  msg = StringFromValue( g_UserUnit, inductorPattern.m_length );
309  wxTextEntryDialog dlg( nullptr, wxEmptyString, _( "Length of Trace:" ), msg );
310 
311  if( dlg.ShowModal() != wxID_OK )
312  return nullptr; // canceled by user
313 
314  msg = dlg.GetValue();
315  inductorPattern.m_length = ValueFromString( g_UserUnit, msg );
316 
317  // Control values (ii = minimum length)
318  if( inductorPattern.m_length < min_len )
319  {
320  aErrorMessage = _( "Requested length < minimum length" );
321  return nullptr;
322  }
323 
324  // Calculate the elements.
325  std::vector <wxPoint> buffer;
326  ll = BuildCornersList_S_Shape( buffer, inductorPattern.m_Start,
327  inductorPattern.m_End, inductorPattern.m_length,
328  inductorPattern.m_Width );
329 
330  if( !ll )
331  {
332  aErrorMessage = _( "Requested length too large" );
333  return nullptr;
334  }
335 
336  // Generate footprint. the value is also used as footprint name.
337  msg = "L";
338  wxTextEntryDialog cmpdlg( nullptr, wxEmptyString, _( "Component Value:" ), msg );
339  cmpdlg.SetTextValidator( FILE_NAME_CHAR_VALIDATOR( &msg ) );
340 
341  if( ( cmpdlg.ShowModal() != wxID_OK ) || msg.IsEmpty() )
342  return nullptr; // Aborted by user
343 
344  MODULE* module = aPcbFrame->CreateNewModule( msg );
345 
346  // here the module is already in the BOARD, CreateNewModule() does that.
347  module->SetFPID( LIB_ID( wxString( "mw_inductor" ) ) );
348  module->SetAttributes( MOD_VIRTUAL | MOD_CMS );
349  module->ClearFlags();
350  module->SetPosition( inductorPattern.m_End );
351 
352  // Generate segments
353  for( unsigned jj = 1; jj < buffer.size(); jj++ )
354  {
355  EDGE_MODULE* PtSegm;
356  PtSegm = new EDGE_MODULE( module );
357  PtSegm->SetStart( buffer[jj - 1] );
358  PtSegm->SetEnd( buffer[jj] );
359  PtSegm->SetWidth( inductorPattern.m_Width );
360  PtSegm->SetLayer( module->GetLayer() );
361  PtSegm->SetShape( S_SEGMENT );
362  PtSegm->SetStart0( PtSegm->GetStart() - module->GetPosition() );
363  PtSegm->SetEnd0( PtSegm->GetEnd() - module->GetPosition() );
364  module->GraphicalItemsList().PushBack( PtSegm );
365  }
366 
367  // Place a pad on each end of coil.
368  pad = new D_PAD( module );
369 
370  module->PadsList().PushFront( pad );
371 
372  pad->SetName( "1" );
373  pad->SetPosition( inductorPattern.m_End );
374  pad->SetPos0( pad->GetPosition() - module->GetPosition() );
375 
376  pad->SetSize( wxSize( inductorPattern.m_Width, inductorPattern.m_Width ) );
377 
378  pad->SetLayerSet( LSET( module->GetLayer() ) );
380  pad->SetShape( PAD_SHAPE_CIRCLE );
381 
382  D_PAD* newpad = new D_PAD( *pad );
383 
384  module->PadsList().Insert( newpad, pad->Next() );
385 
386  pad = newpad;
387  pad->SetName( "2" );
388  pad->SetPosition( inductorPattern.m_Start );
389  pad->SetPos0( pad->GetPosition() - module->GetPosition() );
390 
391  // Modify text positions.
392  wxPoint refPos( ( inductorPattern.m_Start.x + inductorPattern.m_End.x ) / 2,
393  ( inductorPattern.m_Start.y + inductorPattern.m_End.y ) / 2 );
394 
395  wxPoint valPos = refPos;
396 
397  refPos.y -= module->Reference().GetTextSize().y;
398  module->Reference().SetPosition( refPos );
399  valPos.y += module->Value().GetTextSize().y;
400  module->Value().SetPosition( valPos );
401 
402  module->CalculateBoundingBox();
403  return module;
404 }
double EuclideanNorm(const wxPoint &vector)
Euclidean norm of a 2D vector.
Definition: trigo.h:104
void SetEnd0(const wxPoint &aPoint)
TEXTE_MODULE & Reference()
Definition: class_module.h:463
void SetShape(STROKE_T aShape)
static int KiROUND(double v)
KiROUND rounds a floating point number to an int using "round halfway cases away from zero"...
Definition: common.h:107
void PushFront(T *aNewElement)
Function PushFront puts aNewElement at front of list sequence.
Definition: dlist.h:240
virtual void SetLayer(PCB_LAYER_ID aLayer)
Function SetLayer sets the layer this item is on.
void CalculateBoundingBox()
Function CalculateBoundingBox calculates the bounding box in board coordinates.
const wxPoint & GetPosition() const override
Definition: class_module.h:155
wxString StringFromValue(EDA_UNITS_T aUnit, int aValue, bool aAddUnitSymbol)
Function StringFromValue returns the string from aValue according to units (inch, mm ...
Definition: base_units.cpp:203
Smd pad, appears on the solder paste layer (default)
Definition: pad_shapes.h:61
Set for modules listed in the automatic insertion list (usually SMD footprints)
Definition: class_module.h:77
void SetPosition(const wxPoint &aPos) override
Definition: class_pad.h:204
usual segment : line with rounded ends
Class LIB_ID.
Definition: lib_id.h:56
MODULE * CreateNewModule(const wxString &aModuleName)
Function CreateNewModule Creates a new module or footprint, at position 0,0 The new module contains o...
Definition: librairi.cpp:747
Class FILE_NAME_CHAR_VALIDATOR.
Definition: validators.h:43
void PushBack(T *aNewElement)
Function PushBack puts aNewElement at the end of the list sequence.
Definition: dlist.h:250
Class LSET is a set of PCB_LAYER_IDs.
const wxPoint & GetEnd() const
Function GetEnd returns the ending point of the graphic.
void SetName(const wxString &aName)
Set the pad name (sometimes called pad number, although it can be an array reference like AA12)...
Definition: class_pad.h:167
TEXTE_MODULE & Value()
read/write accessors:
Definition: class_module.h:462
void SetPos0(const wxPoint &aPos)
Definition: class_pad.h:247
const wxPoint & GetPosition() const override
Definition: class_pad.h:205
int ValueFromString(EDA_UNITS_T aUnits, const wxString &aTextValue)
Function ValueFromString converts aTextValue in aUnits to internal units used by the application...
Definition: base_units.cpp:368
D_PAD * Next() const
Definition: class_pad.h:145
void SetSize(const wxSize &aSize)
Definition: class_pad.h:253
static int BuildCornersList_S_Shape(std::vector< wxPoint > &aBuffer, const wxPoint &aStartPoint, const wxPoint &aEndPoint, int aLength, int aWidth)
Function BuildCornersList_S_Shape Create a path like a S-shaped coil.
virtual void SetPosition(const wxPoint &aPos) override
void SetPosition(const wxPoint &aPos) override
void SetAttribute(PAD_ATTR_T aAttribute)
Definition: class_pad.cpp:392
void SetStart(const wxPoint &aStart)
EDA_UNITS_T g_UserUnit
Global variables definitions.
Definition: common.cpp:56
void SetLayerSet(LSET aLayerMask)
Definition: class_pad.h:376
PCB_LAYER_ID GetLayer() const
Function GetLayer returns the primary layer this item is on.
Virtual component: when created by copper shapes on board (Like edge card connectors, mounting hole...)
Definition: class_module.h:79
void SetStart0(const wxPoint &aPoint)
void SetShape(PAD_SHAPE_T aShape)
Definition: class_pad.h:202
void SetEnd(const wxPoint &aEnd)
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:268
DLIST< BOARD_ITEM > & GraphicalItemsList()
Definition: class_module.h:137
DLIST< D_PAD > & PadsList()
Definition: class_module.h:134
const wxSize & GetTextSize() const
Definition: eda_text.h:215
const wxPoint & GetStart() const
Function GetStart returns the starting point of the graphic.
void SetFPID(const LIB_ID &aFPID)
Definition: class_module.h:165
void Insert(T *aNewElement, T *aElementAfterMe)
Function Insert puts aNewElement just in front of aElementAfterMe in the list sequence.
Definition: dlist.h:200
void SetAttributes(int aAttributes)
Definition: class_module.h:198
void SetWidth(int aWidth)