DXF drawing placement tool for GAL.
This commit is contained in:
parent
445d935880
commit
47f1fec31d
|
@ -109,6 +109,10 @@ TOOL_ACTION COMMON_ACTIONS::placePad( "pcbnew.InteractiveDrawing.placePad",
|
|||
AS_GLOBAL, 0,
|
||||
"Add pads", "Add pads", AF_ACTIVATE );
|
||||
|
||||
TOOL_ACTION COMMON_ACTIONS::placeDXF( "pcbnew.InteractiveDrawing.placeDXF",
|
||||
AS_GLOBAL, 0,
|
||||
"", "", AF_ACTIVATE );
|
||||
|
||||
TOOL_ACTION COMMON_ACTIONS::setAnchor( "pcbnew.InteractiveDrawing.setAnchor",
|
||||
AS_GLOBAL, 0,
|
||||
"Place the footprint anchor", "Place the footprint anchor",
|
||||
|
@ -358,6 +362,9 @@ boost::optional<TOOL_EVENT> COMMON_ACTIONS::TranslateLegacyId( int aId )
|
|||
case ID_MODEDIT_PAD_TOOL:
|
||||
return COMMON_ACTIONS::placePad.MakeEvent();
|
||||
|
||||
case ID_GEN_IMPORT_DXF_FILE:
|
||||
return COMMON_ACTIONS::placeDXF.MakeEvent();
|
||||
|
||||
case ID_MODEDIT_ANCHOR_TOOL:
|
||||
return COMMON_ACTIONS::setAnchor.MakeEvent();
|
||||
|
||||
|
|
|
@ -99,6 +99,9 @@ public:
|
|||
/// Activation of the drawing tool (placing a PAD)
|
||||
static TOOL_ACTION placePad;
|
||||
|
||||
/// Activation of the drawing tool (placing a drawing from DXF file)
|
||||
static TOOL_ACTION placeDXF;
|
||||
|
||||
/// Activation of the drawing tool (placing the footprint anchor)
|
||||
static TOOL_ACTION setAnchor;
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <pcbnew_id.h>
|
||||
#include <confirm.h>
|
||||
#include <dialog_edit_module_text.h>
|
||||
#include <import_dxf/dialog_dxf_import.h>
|
||||
|
||||
#include <view/view_group.h>
|
||||
#include <view/view_controls.h>
|
||||
|
@ -700,6 +701,196 @@ int DRAWING_TOOL::PlacePad( TOOL_EVENT& aEvent )
|
|||
}
|
||||
|
||||
|
||||
int DRAWING_TOOL::PlaceDXF( TOOL_EVENT& aEvent )
|
||||
{
|
||||
DIALOG_DXF_IMPORT dlg( m_frame );
|
||||
int dlgResult = dlg.ShowModal();
|
||||
|
||||
const std::list<BOARD_ITEM*>& list = dlg.GetImportedItems();
|
||||
MODULE* module = m_board->m_Modules;
|
||||
|
||||
if( dlgResult != wxID_OK || module == NULL || list.empty() )
|
||||
{
|
||||
setTransitions();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
VECTOR2I cursorPos = m_controls->GetCursorPosition();
|
||||
VECTOR2I delta = cursorPos - (*list.begin())->GetPosition();
|
||||
|
||||
// Add a VIEW_GROUP that serves as a preview for the new item
|
||||
KIGFX::VIEW_GROUP preview( m_view );
|
||||
|
||||
// Build the undo list & add items to the current view
|
||||
std::list<BOARD_ITEM*>::const_iterator it, itEnd;
|
||||
for( it = list.begin(), itEnd = list.end(); it != itEnd; ++it )
|
||||
{
|
||||
BOARD_ITEM* item = *it;
|
||||
BOARD_ITEM* converted = NULL;
|
||||
|
||||
// Modules use different types for the same things,
|
||||
// so we need to convert imported items to appropriate classes.
|
||||
switch( item->Type() )
|
||||
{
|
||||
case PCB_LINE_T:
|
||||
{
|
||||
if( m_editModules )
|
||||
{
|
||||
converted = new EDGE_MODULE( module );
|
||||
*static_cast<DRAWSEGMENT*>( converted ) = *static_cast<DRAWSEGMENT*>( item );
|
||||
converted->Move( wxPoint( delta.x, delta.y ) );
|
||||
preview.Add( converted );
|
||||
delete item;
|
||||
}
|
||||
else
|
||||
{
|
||||
preview.Add( item );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case PCB_TEXT_T:
|
||||
{
|
||||
if( m_editModules )
|
||||
{
|
||||
converted = new TEXTE_MODULE( module );
|
||||
*static_cast<TEXTE_PCB*>( converted ) = *static_cast<TEXTE_PCB*>( item );
|
||||
converted->Move( wxPoint( delta.x, delta.y ) );
|
||||
preview.Add( converted );
|
||||
delete item;
|
||||
}
|
||||
else
|
||||
{
|
||||
preview.Add( item );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
assert( false ); // there is a type that is currently not handled here
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOARD_ITEM* firstItem = static_cast<BOARD_ITEM*>( *preview.Begin() );
|
||||
m_view->Add( &preview );
|
||||
|
||||
m_toolMgr->RunAction( COMMON_ACTIONS::selectionClear );
|
||||
m_controls->ShowCursor( true );
|
||||
m_controls->SetSnapping( true );
|
||||
|
||||
Activate();
|
||||
|
||||
// Main loop: keep receiving events
|
||||
while( OPT_TOOL_EVENT evt = Wait() )
|
||||
{
|
||||
cursorPos = m_controls->GetCursorPosition();
|
||||
|
||||
if( evt->IsMotion() )
|
||||
{
|
||||
delta = cursorPos - firstItem->GetPosition();
|
||||
|
||||
for( KIGFX::VIEW_GROUP::iter it = preview.Begin(), end = preview.End(); it != end; ++it )
|
||||
static_cast<BOARD_ITEM*>( *it )->Move( wxPoint( delta.x, delta.y ) );
|
||||
|
||||
preview.ViewUpdate();
|
||||
}
|
||||
|
||||
else if( evt->Category() == TC_COMMAND )
|
||||
{
|
||||
if( evt->IsAction( &COMMON_ACTIONS::rotate ) )
|
||||
{
|
||||
for( KIGFX::VIEW_GROUP::iter it = preview.Begin(), end = preview.End(); it != end; ++it )
|
||||
static_cast<BOARD_ITEM*>( *it )->Rotate( wxPoint( cursorPos.x, cursorPos.y ),
|
||||
m_frame->GetRotationAngle() );
|
||||
|
||||
preview.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
|
||||
}
|
||||
else if( evt->IsAction( &COMMON_ACTIONS::flip ) )
|
||||
{
|
||||
for( KIGFX::VIEW_GROUP::iter it = preview.Begin(), end = preview.End(); it != end; ++it )
|
||||
static_cast<BOARD_ITEM*>( *it )->Flip( wxPoint( cursorPos.x, cursorPos.y ) );
|
||||
|
||||
preview.ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
|
||||
}
|
||||
else if( evt->IsCancel() || evt->IsActivate() )
|
||||
{
|
||||
preview.FreeItems();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
else if( evt->IsClick( BUT_LEFT ) )
|
||||
{
|
||||
// Place the drawing
|
||||
|
||||
if( m_editModules )
|
||||
{
|
||||
m_frame->SaveCopyInUndoList( module, UR_MODEDIT );
|
||||
module->SetLastEditTime();
|
||||
|
||||
for( KIGFX::VIEW_GROUP::iter it = preview.Begin(), end = preview.End(); it != end; ++it )
|
||||
{
|
||||
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it );
|
||||
module->Add( item );
|
||||
|
||||
switch( item->Type() )
|
||||
{
|
||||
case PCB_MODULE_TEXT_T:
|
||||
static_cast<TEXTE_MODULE*>( item )->SetLocalCoord();
|
||||
break;
|
||||
|
||||
case PCB_MODULE_EDGE_T:
|
||||
static_cast<EDGE_MODULE*>( item )->SetLocalCoord();
|
||||
break;
|
||||
|
||||
default:
|
||||
assert( false );
|
||||
break;
|
||||
}
|
||||
|
||||
m_view->Add( item );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PICKED_ITEMS_LIST picklist;
|
||||
|
||||
for( KIGFX::VIEW_GROUP::iter it = preview.Begin(), end = preview.End(); it != end; ++it )
|
||||
{
|
||||
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it );
|
||||
m_board->Add( item );
|
||||
|
||||
ITEM_PICKER itemWrapper( item, UR_NEW );
|
||||
picklist.PushItem( itemWrapper );
|
||||
|
||||
m_view->Add( item );
|
||||
}
|
||||
|
||||
m_frame->SaveCopyInUndoList( picklist, UR_NEW );
|
||||
}
|
||||
|
||||
m_frame->OnModify();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
preview.Clear();
|
||||
|
||||
m_controls->ShowCursor( false );
|
||||
m_controls->SetSnapping( false );
|
||||
m_controls->SetAutoPan( false );
|
||||
m_view->Remove( &preview );
|
||||
|
||||
setTransitions();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int DRAWING_TOOL::SetAnchor( TOOL_EVENT& aEvent )
|
||||
{
|
||||
assert( m_editModules );
|
||||
|
@ -1580,5 +1771,6 @@ void DRAWING_TOOL::setTransitions()
|
|||
Go( &DRAWING_TOOL::PlaceTarget, COMMON_ACTIONS::placeTarget.MakeEvent() );
|
||||
Go( &DRAWING_TOOL::PlaceModule, COMMON_ACTIONS::placeModule.MakeEvent() );
|
||||
Go( &DRAWING_TOOL::PlacePad, COMMON_ACTIONS::placePad.MakeEvent() );
|
||||
Go( &DRAWING_TOOL::PlaceDXF, COMMON_ACTIONS::placeDXF.MakeEvent() );
|
||||
Go( &DRAWING_TOOL::SetAnchor, COMMON_ACTIONS::setAnchor.MakeEvent() );
|
||||
}
|
||||
|
|
|
@ -122,10 +122,16 @@ public:
|
|||
|
||||
/**
|
||||
* Function PlacePad()
|
||||
* Places a pad in the module editor.
|
||||
* Places a pad in module editor.
|
||||
*/
|
||||
int PlacePad( TOOL_EVENT& aEvent );
|
||||
|
||||
/**
|
||||
* Function PlaceDXF()
|
||||
* Places a drawing imported from a DXF file in module editor.
|
||||
*/
|
||||
int PlaceDXF( TOOL_EVENT& aEvent );
|
||||
|
||||
/**
|
||||
* Function SetAnchor()
|
||||
* Places the footprint anchor (only in module editor).
|
||||
|
|
Loading…
Reference in New Issue