KiCad PCB EDA Suite
dialog_import_gfx.cpp File Reference
#include "dialog_import_gfx.h"
#include <advanced_config.h>
#include <convert_to_biu.h>
#include <kiface_i.h>
#include <pcb_layer_box_selector.h>
#include <wildcards_and_files_ext.h>
#include <class_board.h>
#include <class_module.h>
#include <class_edge_mod.h>
#include <class_text_mod.h>
#include <class_pcb_text.h>

Go to the source code of this file.

Macros

#define IMPORT_GFX_LAYER_OPTION_KEY   "GfxImportBrdLayer"
 
#define IMPORT_GFX_PLACEMENT_INTERACTIVE_KEY   "GfxImportPlacementInteractive"
 
#define IMPORT_GFX_LAST_FILE_KEY   "GfxImportLastFile"
 
#define IMPORT_GFX_POSITION_UNITS_KEY   "GfxImportPositionUnits"
 
#define IMPORT_GFX_POSITION_X_KEY   "GfxImportPositionX"
 
#define IMPORT_GFX_POSITION_Y_KEY   "GfxImportPositionY"
 
#define IMPORT_GFX_LINEWIDTH_UNITS_KEY   "GfxImportLineWidthUnits"
 
#define IMPORT_GFX_LINEWIDTH_KEY   "GfxImportLineWidth"
 

Functions

bool InvokeDialogImportGfxBoard (PCB_BASE_FRAME *aCaller)
 Shows the modal DIALOG_IMPORT_GFX for importing a DXF file to a board. More...
 
bool InvokeDialogImportGfxModule (PCB_BASE_FRAME *aCaller, MODULE *aModule)
 shows the modal DIALOG_IMPORT_GFX for importing a DXF file as footprint outlines. More...
 

Macro Definition Documentation

#define IMPORT_GFX_LAST_FILE_KEY   "GfxImportLastFile"
#define IMPORT_GFX_LAYER_OPTION_KEY   "GfxImportBrdLayer"
#define IMPORT_GFX_LINEWIDTH_KEY   "GfxImportLineWidth"
#define IMPORT_GFX_LINEWIDTH_UNITS_KEY   "GfxImportLineWidthUnits"

Definition at line 51 of file dialog_import_gfx.cpp.

Referenced by DIALOG_IMPORT_GFX::~DIALOG_IMPORT_GFX().

#define IMPORT_GFX_PLACEMENT_INTERACTIVE_KEY   "GfxImportPlacementInteractive"
#define IMPORT_GFX_POSITION_UNITS_KEY   "GfxImportPositionUnits"
#define IMPORT_GFX_POSITION_X_KEY   "GfxImportPositionX"
#define IMPORT_GFX_POSITION_Y_KEY   "GfxImportPositionY"

Function Documentation

bool InvokeDialogImportGfxBoard ( PCB_BASE_FRAME aCaller)

Shows the modal DIALOG_IMPORT_GFX for importing a DXF file to a board.

Parameters
aCalleris the wxTopLevelWindow which is invoking the dialog.
Returns
true if the import was made.

Definition at line 332 of file dialog_import_gfx.cpp.

References BOARD::Add(), BLOCK_PRESELECT_MOVE, EDA_RECT::Centre(), PCB_BASE_FRAME::GetBoard(), EDA_ITEM::GetBoundingBox(), DIALOG_IMPORT_GFX::GetImportedItems(), BLOCK_SELECTOR::GetItems(), EDA_DRAW_FRAME::GetNearestGridPosition(), EDA_RECT::GetOrigin(), PCB_BASE_FRAME::GetScreen(), EDA_RECT::GetSize(), EDA_DRAW_FRAME::HandleBlockBegin(), EDA_DRAW_FRAME::HandleBlockEnd(), IS_MOVED, DIALOG_IMPORT_GFX::IsPlacementInteractive(), BASE_SCREEN::m_BlockLocate, EDA_RECT::Merge(), PCB_BASE_FRAME::OnModify(), PICKED_ITEMS_LIST::PushItem(), PCB_BASE_FRAME::SaveCopyInUndoList(), EDA_ITEM::SetFlags(), ITEM_PICKER::SetItem(), BLOCK_SELECTOR::SetLastCursorPosition(), EDA_RECT::SetOrigin(), EDA_RECT::SetSize(), and UR_NEW.

Referenced by PCB_EDIT_FRAME::Process_Special_Functions().

333 {
334  DIALOG_IMPORT_GFX dlg( aCaller );
335 
336  if( dlg.ShowModal() != wxID_OK )
337  return false;
338 
339  auto& list = dlg.GetImportedItems();
340 
341  // Ensure the list is not empty:
342  if( list.empty() )
343  {
344  wxMessageBox( _( "No graphic items found in file to import") );
345  return false;
346  }
347 
348  PICKED_ITEMS_LIST picklist; // the pick list for undo command
349  ITEM_PICKER item_picker( nullptr, UR_NEW );
350  BOARD* board = aCaller->GetBoard();
351 
352  // Now prepare a block move command to place the new items, if interactive placement,
353  // and prepare the undo command.
354  EDA_RECT bbox; // the new items bounding box, for block move if interactive placement.
355  bool bboxInit = true; // true until the bounding box is initialized
356  BLOCK_SELECTOR& blockmove = aCaller->GetScreen()->m_BlockLocate;
357 
358  if( dlg.IsPlacementInteractive() )
359  aCaller->HandleBlockBegin( NULL, BLOCK_PRESELECT_MOVE, wxPoint( 0, 0) );
360 
361  PICKED_ITEMS_LIST& blockitemsList = blockmove.GetItems();
362 
363  for( auto it = list.begin(); it != list.end(); ++it )
364  {
365  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->release() );
366 
367  if( dlg.IsPlacementInteractive() )
368  item->SetFlags( IS_MOVED );
369 
370  board->Add( item );
371 
372  item_picker.SetItem( item );
373  picklist.PushItem( item_picker );
374 
375  if( dlg.IsPlacementInteractive() )
376  {
377  blockitemsList.PushItem( item_picker );
378 
379  if( bboxInit )
380  bbox = item->GetBoundingBox();
381  else
382  bbox.Merge( item->GetBoundingBox() );
383 
384  bboxInit = false;
385  }
386  }
387 
388  aCaller->SaveCopyInUndoList( picklist, UR_NEW, wxPoint( 0, 0 ) );
389  aCaller->OnModify();
390 
391  if( dlg.IsPlacementInteractive() )
392  {
393  // Finish block move command:
394  wxPoint cpos = aCaller->GetNearestGridPosition( bbox.Centre() );
395  blockmove.SetOrigin( bbox.GetOrigin() );
396  blockmove.SetSize( bbox.GetSize() );
397  blockmove.SetLastCursorPosition( cpos );
398  aCaller->HandleBlockEnd( NULL );
399  }
400 
401  return true;
402 }
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
BLOCK_SELECTOR m_BlockLocate
Block description for block commands.
Definition: base_screen.h:214
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
void Merge(const EDA_RECT &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect...
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
const wxSize GetSize() const
Definition: eda_rect.h:101
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:124
BOARD * GetBoard() const
void PushItem(const ITEM_PICKER &aItem)
Function PushItem pushes aItem to the top of the list.
virtual bool HandleBlockBegin(wxDC *aDC, EDA_KEY aKey, const wxPoint &aPosition, int aExplicitCommand=0)
Initialize a block command.
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:256
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_INSERT) override
Adds an item to the container.
wxPoint Centre() const
Definition: eda_rect.h:60
Class PICKED_ITEMS_LIST is a holder to handle information on schematic or board items.
virtual bool HandleBlockEnd(wxDC *DC)
Handle the "end" of a block command, i.e.
virtual void OnModify()
Function OnModify Virtual Must be called after a change in order to set the "modify" flag of the curr...
void SetSize(const wxSize &size)
Definition: eda_rect.h:126
wxPoint GetNearestGridPosition(const wxPoint &aPosition, wxRealPoint *aGridSize=NULL) const
Return the nearest aGridSize location to aPosition.
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:171
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
virtual void SaveCopyInUndoList(BOARD_ITEM *aItemToCopy, UNDO_REDO_T aTypeCommand, const wxPoint &aTransformPoint=wxPoint(0, 0))=0
Function SaveCopyInUndoList (virtual pure) Creates a new entry in undo list of commands.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
PICKED_ITEMS_LIST & GetItems()
void SetLastCursorPosition(const wxPoint &aPosition)
Function SetLastCursorPosition sets the last cursor position to aPosition.
#define IS_MOVED
Item being moved.
Definition: base_struct.h:113
bool InvokeDialogImportGfxModule ( PCB_BASE_FRAME aCaller,
MODULE aModule 
)

shows the modal DIALOG_IMPORT_GFX for importing a DXF file as footprint outlines.

Parameters
aCalleris the wxTopLevelWindow which is invoking the dialog.
aModuleis the footprint currently edited.
Returns
true if the import was made.

Definition at line 406 of file dialog_import_gfx.cpp.

References MODULE::Add(), BLOCK_PRESELECT_MOVE, EDA_RECT::Centre(), EDA_ITEM::GetBoundingBox(), DIALOG_IMPORT_GFX::GetImportedItems(), BLOCK_SELECTOR::GetItems(), EDA_DRAW_FRAME::GetNearestGridPosition(), EDA_RECT::GetOrigin(), PCB_BASE_FRAME::GetScreen(), EDA_RECT::GetSize(), EDA_DRAW_FRAME::HandleBlockBegin(), EDA_DRAW_FRAME::HandleBlockEnd(), IS_MOVED, DIALOG_IMPORT_GFX::IsPlacementInteractive(), BASE_SCREEN::m_BlockLocate, EDA_RECT::Merge(), PCB_BASE_FRAME::OnModify(), PICKED_ITEMS_LIST::PushItem(), PCB_BASE_FRAME::SaveCopyInUndoList(), EDA_ITEM::SetFlags(), ITEM_PICKER::SetItem(), BLOCK_SELECTOR::SetLastCursorPosition(), EDA_RECT::SetOrigin(), EDA_RECT::SetSize(), UR_CHANGED, and UR_NEW.

Referenced by FOOTPRINT_EDIT_FRAME::Process_Special_Functions().

407 {
408  if( !aModule )
409  return false;
410 
411  DIALOG_IMPORT_GFX dlg( aCaller, true );
412 
413  if( dlg.ShowModal() != wxID_OK )
414  return false;
415 
416  auto& list = dlg.GetImportedItems();
417 
418  // Ensure the list is not empty:
419  if( list.empty() )
420  {
421  wxMessageBox( _( "No graphic items found in file to import") );
422  return false;
423  }
424 
425  aCaller->SaveCopyInUndoList( aModule, UR_CHANGED );
426 
427  PICKED_ITEMS_LIST picklist; // the pick list for undo command
428  ITEM_PICKER item_picker( nullptr, UR_NEW );
429 
430  // Now prepare a block move command to place the new items, if interactive placement,
431  // and prepare the undo command.
432  EDA_RECT bbox; // the new items bounding box, for block move if interactive placement.
433  bool bboxInit = true; // true until the bounding box is initialized
434  BLOCK_SELECTOR& blockmove = aCaller->GetScreen()->m_BlockLocate;
435 
436  if( dlg.IsPlacementInteractive() )
437  aCaller->HandleBlockBegin( nullptr, BLOCK_PRESELECT_MOVE, wxPoint( 0, 0) );
438 
439  PICKED_ITEMS_LIST& blockitemsList = blockmove.GetItems();
440 
441  for( auto it = list.begin(); it != list.end(); ++it )
442  {
443  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->release() );
444  aModule->Add( item );
445 
446  if( dlg.IsPlacementInteractive() )
447  {
448  item->SetFlags( IS_MOVED );
449  item_picker.SetItem( item );
450  blockitemsList.PushItem( item_picker );
451 
452  if( bboxInit )
453  bbox = item->GetBoundingBox();
454  else
455  bbox.Merge( item->GetBoundingBox() );
456 
457  bboxInit = false;
458  }
459  }
460 
461  aCaller->OnModify();
462 
463  if( dlg.IsPlacementInteractive() )
464  {
465  // Finish block move command:
466  wxPoint cpos = aCaller->GetNearestGridPosition( bbox.Centre() );
467  blockmove.SetOrigin( bbox.GetOrigin() );
468  blockmove.SetSize( bbox.GetSize() );
469  blockmove.SetLastCursorPosition( cpos );
470  aCaller->HandleBlockEnd( NULL );
471  }
472 
473  return true;
474 }
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes...
BLOCK_SELECTOR m_BlockLocate
Block description for block commands.
Definition: base_screen.h:214
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
void Merge(const EDA_RECT &aRect)
Function Merge modifies the position and size of the rectangle in order to contain aRect...
Class BOARD_ITEM is a base class for any item which can be embedded within the BOARD container class...
const wxSize GetSize() const
Definition: eda_rect.h:101
void SetOrigin(const wxPoint &pos)
Definition: eda_rect.h:124
void PushItem(const ITEM_PICKER &aItem)
Function PushItem pushes aItem to the top of the list.
virtual bool HandleBlockBegin(wxDC *aDC, EDA_KEY aKey, const wxPoint &aPosition, int aExplicitCommand=0)
Initialize a block command.
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_INSERT) override
>
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:256
wxPoint Centre() const
Definition: eda_rect.h:60
Class PICKED_ITEMS_LIST is a holder to handle information on schematic or board items.
virtual bool HandleBlockEnd(wxDC *DC)
Handle the "end" of a block command, i.e.
virtual void OnModify()
Function OnModify Virtual Must be called after a change in order to set the "modify" flag of the curr...
void SetSize(const wxSize &size)
Definition: eda_rect.h:126
wxPoint GetNearestGridPosition(const wxPoint &aPosition, wxRealPoint *aGridSize=NULL) const
Return the nearest aGridSize location to aPosition.
Class EDA_RECT handles the component boundary box.
Definition: eda_rect.h:44
virtual void SaveCopyInUndoList(BOARD_ITEM *aItemToCopy, UNDO_REDO_T aTypeCommand, const wxPoint &aTransformPoint=wxPoint(0, 0))=0
Function SaveCopyInUndoList (virtual pure) Creates a new entry in undo list of commands.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
PICKED_ITEMS_LIST & GetItems()
void SetLastCursorPosition(const wxPoint &aPosition)
Function SetLastCursorPosition sets the last cursor position to aPosition.
#define IS_MOVED
Item being moved.
Definition: base_struct.h:113