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_GROUP   "ImportGraphics"
 
#define IMPORT_GFX_LAYER_OPTION_KEY   "BoardLayer"
 
#define IMPORT_GFX_PLACEMENT_INTERACTIVE_KEY   "InteractivePlacement"
 
#define IMPORT_GFX_LAST_FILE_KEY   "LastFile"
 
#define IMPORT_GFX_POSITION_UNITS_KEY   "PositionUnits"
 
#define IMPORT_GFX_POSITION_X_KEY   "PositionX"
 
#define IMPORT_GFX_POSITION_Y_KEY   "PositionY"
 
#define IMPORT_GFX_LINEWIDTH_UNITS_KEY   "LineWidthUnits"
 
#define IMPORT_GFX_LINEWIDTH_KEY   "LineWidth"
 

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

◆ IMPORT_GFX_GROUP

#define IMPORT_GFX_GROUP   "ImportGraphics"

Definition at line 45 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_LAST_FILE_KEY

#define IMPORT_GFX_LAST_FILE_KEY   "LastFile"

Definition at line 50 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_LAYER_OPTION_KEY

#define IMPORT_GFX_LAYER_OPTION_KEY   "BoardLayer"

Definition at line 48 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_LINEWIDTH_KEY

#define IMPORT_GFX_LINEWIDTH_KEY   "LineWidth"

Definition at line 55 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_LINEWIDTH_UNITS_KEY

#define IMPORT_GFX_LINEWIDTH_UNITS_KEY   "LineWidthUnits"

Definition at line 54 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_PLACEMENT_INTERACTIVE_KEY

#define IMPORT_GFX_PLACEMENT_INTERACTIVE_KEY   "InteractivePlacement"

Definition at line 49 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_POSITION_UNITS_KEY

#define IMPORT_GFX_POSITION_UNITS_KEY   "PositionUnits"

Definition at line 51 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_POSITION_X_KEY

#define IMPORT_GFX_POSITION_X_KEY   "PositionX"

Definition at line 52 of file dialog_import_gfx.cpp.

◆ IMPORT_GFX_POSITION_Y_KEY

#define IMPORT_GFX_POSITION_Y_KEY   "PositionY"

Definition at line 53 of file dialog_import_gfx.cpp.

Function Documentation

◆ InvokeDialogImportGfxBoard()

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 383 of file dialog_import_gfx.cpp.

384 {
385  DIALOG_IMPORT_GFX dlg( aCaller );
386 
387  if( dlg.ShowModal() != wxID_OK )
388  return false;
389 
390  auto& list = dlg.GetImportedItems();
391 
392  // Ensure the list is not empty:
393  if( list.empty() )
394  {
395  wxMessageBox( _( "No graphic items found in file to import." ) );
396  return false;
397  }
398 
399  PICKED_ITEMS_LIST picklist; // the pick list for undo command
400  ITEM_PICKER item_picker( nullptr, UR_NEW );
401  BOARD* board = aCaller->GetBoard();
402 
403  // Now prepare a block move command to place the new items, if interactive placement,
404  // and prepare the undo command.
405  EDA_RECT bbox; // the new items bounding box, for block move if interactive placement.
406  bool bboxInit = true; // true until the bounding box is initialized
407  BLOCK_SELECTOR& blockmove = aCaller->GetScreen()->m_BlockLocate;
408 
409  if( dlg.IsPlacementInteractive() )
410  aCaller->HandleBlockBegin( NULL, BLOCK_PRESELECT_MOVE, wxPoint( 0, 0 ) );
411 
412  PICKED_ITEMS_LIST& blockitemsList = blockmove.GetItems();
413 
414  for( auto it = list.begin(); it != list.end(); ++it )
415  {
416  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->release() );
417 
418  if( dlg.IsPlacementInteractive() )
419  item->SetFlags( IS_MOVED );
420 
421  board->Add( item );
422 
423  item_picker.SetItem( item );
424  picklist.PushItem( item_picker );
425 
426  if( dlg.IsPlacementInteractive() )
427  {
428  blockitemsList.PushItem( item_picker );
429 
430  if( bboxInit )
431  bbox = item->GetBoundingBox();
432  else
433  bbox.Merge( item->GetBoundingBox() );
434 
435  bboxInit = false;
436  }
437  }
438 
439  aCaller->SaveCopyInUndoList( picklist, UR_NEW, wxPoint( 0, 0 ) );
440  aCaller->OnModify();
441 
442  if( dlg.IsPlacementInteractive() )
443  {
444  // Finish block move command:
445  wxPoint cpos = aCaller->GetNearestGridPosition( bbox.Centre() );
446  blockmove.SetOrigin( bbox.GetOrigin() );
447  blockmove.SetSize( bbox.GetSize() );
448  blockmove.SetLastCursorPosition( cpos );
449  aCaller->HandleBlockEnd( NULL );
450  }
451 
452  return true;
453 }
BLOCK_SELECTOR m_BlockLocate
Block description for block commands.
Definition: base_screen.h:214
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,...
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 SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:259
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_INSERT) override
Adds an item to the container.
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.
wxPoint GetNearestGridPosition(const wxPoint &aPosition, wxRealPoint *aGridSize=NULL) const
Return the nearest aGridSize location to aPosition.
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
Class BOARD holds information pertinent to a Pcbnew printed circuit board.
Definition: class_board.h:170
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.
wxPoint Centre() const
Definition: eda_rect.h:60
PICKED_ITEMS_LIST & GetItems()
BOARD * GetBoard() const
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes.
void SetLastCursorPosition(const wxPoint &aPosition)
Function SetLastCursorPosition sets the last cursor position to aPosition.
const wxSize GetSize() const
Definition: eda_rect.h:101
#define IS_MOVED
Item being moved.
Definition: base_struct.h:113

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().

◆ InvokeDialogImportGfxModule()

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 457 of file dialog_import_gfx.cpp.

458 {
459  if( !aModule )
460  return false;
461 
462  DIALOG_IMPORT_GFX dlg( aCaller, true );
463 
464  if( dlg.ShowModal() != wxID_OK )
465  return false;
466 
467  auto& list = dlg.GetImportedItems();
468 
469  // Ensure the list is not empty:
470  if( list.empty() )
471  {
472  wxMessageBox( _( "No graphic items found in file to import" ) );
473  return false;
474  }
475 
476  aCaller->SaveCopyInUndoList( aModule, UR_CHANGED );
477 
478  PICKED_ITEMS_LIST picklist; // the pick list for undo command
479  ITEM_PICKER item_picker( nullptr, UR_NEW );
480 
481  // Now prepare a block move command to place the new items, if interactive placement,
482  // and prepare the undo command.
483  EDA_RECT bbox; // the new items bounding box, for block move if interactive placement.
484  bool bboxInit = true; // true until the bounding box is initialized
485  BLOCK_SELECTOR& blockmove = aCaller->GetScreen()->m_BlockLocate;
486 
487  if( dlg.IsPlacementInteractive() )
488  aCaller->HandleBlockBegin( nullptr, BLOCK_PRESELECT_MOVE, wxPoint( 0, 0 ) );
489 
490  PICKED_ITEMS_LIST& blockitemsList = blockmove.GetItems();
491 
492  for( auto it = list.begin(); it != list.end(); ++it )
493  {
494  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->release() );
495  aModule->Add( item );
496 
497  if( dlg.IsPlacementInteractive() )
498  {
499  item->SetFlags( IS_MOVED );
500  item_picker.SetItem( item );
501  blockitemsList.PushItem( item_picker );
502 
503  if( bboxInit )
504  bbox = item->GetBoundingBox();
505  else
506  bbox.Merge( item->GetBoundingBox() );
507 
508  bboxInit = false;
509  }
510  }
511 
512  aCaller->OnModify();
513 
514  if( dlg.IsPlacementInteractive() )
515  {
516  // Finish block move command:
517  wxPoint cpos = aCaller->GetNearestGridPosition( bbox.Centre() );
518  blockmove.SetOrigin( bbox.GetOrigin() );
519  blockmove.SetSize( bbox.GetSize() );
520  blockmove.SetLastCursorPosition( cpos );
521  aCaller->HandleBlockEnd( NULL );
522  }
523 
524  return true;
525 }
BLOCK_SELECTOR m_BlockLocate
Block description for block commands.
Definition: base_screen.h:214
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,...
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:259
const wxPoint GetOrigin() const
Definition: eda_rect.h:112
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.
wxPoint GetNearestGridPosition(const wxPoint &aPosition, wxRealPoint *aGridSize=NULL) const
Return the nearest aGridSize location to aPosition.
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
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.
wxPoint Centre() const
Definition: eda_rect.h:60
PICKED_ITEMS_LIST & GetItems()
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes.
void SetLastCursorPosition(const wxPoint &aPosition)
Function SetLastCursorPosition sets the last cursor position to aPosition.
const wxSize GetSize() const
Definition: eda_rect.h:101
#define IS_MOVED
Item being moved.
Definition: base_struct.h:113

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().