Commit 7055a2bc authored by CHARRAS's avatar CHARRAS

zone outlines edition: added drag outline edge

parent a60cbb91
......@@ -351,7 +351,7 @@ bool SnapPoint2( const wxPoint& PosRef, int SearchMask,
switch( STRUCT->m_Orient )
{
case 0: /* HORIZONTAL */
case 0: /* HORIZONTAL Left justified */
x2 += dx; y2 -= dy;
break;
......@@ -359,12 +359,12 @@ bool SnapPoint2( const wxPoint& PosRef, int SearchMask,
x2 -= dy; y2 -= dx;
break;
case 2: /* horizontal inverse */
x2 -= dx; y2 += dy;
case 2: /* horizontal Right justified */
x2 -= dx; y2 -= dy;
break;
case 3: /* vertical DOWN */
x2 += dy; y2 += dx;
x2 -= dy; y2 += dx;
break;
}
......@@ -571,7 +571,7 @@ bool DrawStructInBox( int x1, int y1, int x2, int y2,
switch( STRUCT->m_Orient )
{
case 0: /* HORIZONTAL */
case 0: /* HORIZONTAL Left justified */
xt2 += dx; yt2 -= dy;
break;
......@@ -579,12 +579,12 @@ bool DrawStructInBox( int x1, int y1, int x2, int y2,
xt2 -= dy; yt2 -= dx;
break;
case 2: /* horizontal inverse */
xt2 -= dx; yt2 += dy;
case 2: /* horizontal Right justified */
xt2 -= dx; yt2 -= dy;
break;
case 3: /* vertical DOWN */
xt2 += dy; yt2 += dx;
xt2 -= dy; yt2 += dx;
break;
}
......
......@@ -5,7 +5,7 @@
COMMON_GLOBL wxString g_BuildVersion
#ifdef EDA_BASE
(wxT("(2008-01-22)"))
(wxT("(2008-02-01)"))
#endif
;
......
......@@ -564,8 +564,8 @@ enum main_id {
ID_POPUP_PCB_DELETE_ZONE_CUTOUT,
ID_POPUP_PCB_MOVE_ZONE_OUTLINES,
ID_POPUP_PCB_PLACE_ZONE_OUTLINES,
ID_POPUP_ZONE_UNUSED1,
ID_POPUP_ZONE_UNUSED2,
ID_POPUP_PCB_DRAG_ZONE_OUTLINE_SEGMENT,
ID_POPUP_PCB_PLACE_DRAGGED_ZONE_OUTLINE_SEGMENT,
ID_POPUP_ZONE_UNUSED3,
ID_POPUP_ZONE_UNUSED4,
......
......@@ -560,6 +560,14 @@ public:
int corner_id,
bool IsNewCorner );
/**
* Function Start_Move_Zone_Corner
* Prepares a drag edge in an existing zone outline,
*/
void Start_Move_Zone_Drag_Outline_Edge( wxDC* DC,
ZONE_CONTAINER* zone_container,
int corner_id );
/**
* Function End_Move_Zone_Corner_Or_Outlines
* Terminates a move corner in a zone outline, or a move zone outlines
......
No preview for this file type
This diff is collapsed.
/* XPM */
static const char * drag_outline_segment_xpm[] = {
"16 16 40 1",
" c None",
"! c black",
"# c #C00000",
"$ c #5C6A00",
"% c #800028",
"& c #0D0D1E",
"' c #9B9B9B",
"( c #565656",
") c #32323E",
"* c #DCDCEF",
"+ c #4A4A4A",
", c #D2D2D2",
"- c #84849B",
". c white",
"0 c #F1F1FF",
"1 c #31313D",
"2 c #E7E5FF",
"3 c #646489",
"4 c #232332",
"5 c #FBFBFF",
"6 c #EAEAFF",
"7 c #E2E1FF",
"8 c #DBDBFF",
"9 c #D5D3FF",
": c #CDCDFF",
"; c #C8C6FF",
"< c #C1C1FF",
"= c #9F9DDB",
"> c #30303B",
"? c #7A7A96",
"@ c #D2D0FF",
"A c #5A5981",
"B c #20202F",
"C c #C8C8FF",
"D c #C0BFFF",
"E c #5C5C82",
"F c #B8B8FF",
"G c #56557D",
"H c #9493D6",
"I c #1D1D2C",
" ",
" %%########$ ",
" %%#########$ ",
" %#$ #$",
" %#$''()*)+ ,,,",
" %#$ !-.-!! ",
"%#$ !.! ",
"#$ ! !0! ! ",
"$ 1-!!!2!!!34 ",
" !*506789:;<=!",
" >?!!!@!!!AB ",
" ! !C! !! ",
" ! !D! ! ",
" !EFG!! ",
" BHI! ",
" ! "};
......@@ -564,7 +564,7 @@ void ZONE_CONTAINER::Display_Infos( WinEDA_DrawFrame* frame )
}
/* Geometric transformations: */
/* Geometric transforms: */
/**
* Function Move
......@@ -575,16 +575,40 @@ void ZONE_CONTAINER::Move( const wxPoint& offset )
{
for( unsigned ii = 0; ii < m_Poly->corner.size(); ii++ )
{
m_Poly->corner[ii].x += offset.x;
m_Poly->corner[ii].y += offset.y;
SetCornerPosition(ii, GetCornerPosition(ii) + offset);
}
m_Poly->Hatch();
}
/**
* Function MoveEdge
* Move the outline Edge. m_CornerSelection is the start point of the outline edge
* @param offset = moving vector
*/
void ZONE_CONTAINER::MoveEdge( const wxPoint& offset )
{
int ii = m_CornerSelection;
// Move the start point of the selected edge:
SetCornerPosition(ii, GetCornerPosition(ii) + offset);
// Move the end point of the selected edge:
if ( m_Poly->corner[ii].end_contour || ii == GetNumCorners() - 1)
{
int icont = m_Poly->GetContour( ii );
ii = m_Poly->GetContourStart( icont );
}
else
ii++;
SetCornerPosition(ii, GetCornerPosition(ii) + offset);
m_Poly->Hatch();
}
/**
* Function Move
* Function Rotate
* Move the outlines
* @param centre = rot centre
* @param angle = in 0.1 degree
......
......@@ -147,7 +147,14 @@ public:
void Move( const wxPoint& offset );
/**
* Function Move
* Function MoveEdge
* Move the outline Edge. m_CornerSelection is the start point of the outline edge
* @param offset = moving vector
*/
void MoveEdge( const wxPoint& offset );
/**
* Function Rotate
* Move the outlines
* @param centre = rot centre
* @param angle = in 0.1 degree
......
......@@ -73,6 +73,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_PCB_EDIT_ZONE_PARAMS:
case ID_POPUP_PCB_DELETE_ZONE:
case ID_POPUP_PCB_MOVE_ZONE_CORNER:
case ID_POPUP_PCB_DRAG_ZONE_OUTLINE_SEGMENT:
case ID_POPUP_PCB_MOVE_ZONE_OUTLINES:
case ID_POPUP_PCB_ADD_ZONE_CORNER:
case ID_POPUP_PCB_DELETE_TRACKSEG:
......@@ -379,8 +380,9 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
break;
case ID_POPUP_PCB_PLACE_MICROVIA:
if ( ! GetScreen()->IsMicroViaAcceptable() )
if( !GetScreen()->IsMicroViaAcceptable() )
break;
case ID_POPUP_PCB_PLACE_VIA:
DrawPanel->MouseToCursorSchema();
if( GetCurItem()->m_Flags & IS_DRAGGED )
......@@ -390,7 +392,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
else
{
int v_type = g_DesignSettings.m_CurrentViaType;
if ( id == ID_POPUP_PCB_PLACE_MICROVIA )
if( id == ID_POPUP_PCB_PLACE_MICROVIA )
g_DesignSettings.m_CurrentViaType = VIA_MICROVIA; // place micro via and switch layer
Other_Layer_Route( (TRACK*) GetCurItem(), &dc );
g_DesignSettings.m_CurrentViaType = v_type;
......@@ -476,45 +478,54 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_PCB_DELETE_ZONE_CONTAINER:
case ID_POPUP_PCB_DELETE_ZONE_CUTOUT:
DrawPanel->MouseToCursorSchema();
Delete_Zone_Contour( &dc, (ZONE_CONTAINER*)GetCurItem() );
Delete_Zone_Contour( &dc, (ZONE_CONTAINER*) GetCurItem() );
SetCurItem( NULL );
break;
case ID_POPUP_PCB_DELETE_ZONE_CORNER:
Remove_Zone_Corner( &dc, (ZONE_CONTAINER*)GetCurItem() );
Remove_Zone_Corner( &dc, (ZONE_CONTAINER*) GetCurItem() );
SetCurItem( NULL );
break;
case ID_POPUP_PCB_MOVE_ZONE_CORNER:
{
DrawPanel->MouseToCursorSchema();
ZONE_CONTAINER * zone_cont = (ZONE_CONTAINER*)GetCurItem();
Start_Move_Zone_Corner(&dc, zone_cont, zone_cont->m_CornerSelection, false);
ZONE_CONTAINER* zone_cont = (ZONE_CONTAINER*) GetCurItem();
Start_Move_Zone_Corner( &dc, zone_cont, zone_cont->m_CornerSelection, false );
break;
}
case ID_POPUP_PCB_DRAG_ZONE_OUTLINE_SEGMENT:
{
DrawPanel->MouseToCursorSchema();
ZONE_CONTAINER* zone_cont = (ZONE_CONTAINER*) GetCurItem();
Start_Move_Zone_Drag_Outline_Edge( &dc, zone_cont, zone_cont->m_CornerSelection );
break;
}
case ID_POPUP_PCB_MOVE_ZONE_OUTLINES:
{
DrawPanel->MouseToCursorSchema();
ZONE_CONTAINER * zone_cont = (ZONE_CONTAINER*)GetCurItem();
Start_Move_Zone_Outlines(&dc, zone_cont);
ZONE_CONTAINER* zone_cont = (ZONE_CONTAINER*) GetCurItem();
Start_Move_Zone_Outlines( &dc, zone_cont );
break;
}
case ID_POPUP_PCB_ADD_ZONE_CORNER:
{
DrawPanel->MouseToCursorSchema();
ZONE_CONTAINER * zone_cont = (ZONE_CONTAINER*)GetCurItem();
ZONE_CONTAINER* zone_cont = (ZONE_CONTAINER*) GetCurItem();
wxPoint pos = GetScreen()->m_Curseur;
/* add corner between zone_cont->m_CornerSelection
* and zone_cont->m_CornerSelection+1
* and start move the new corner
*/
zone_cont->Draw(DrawPanel, &dc, wxPoint(0,0), GR_XOR);
zone_cont->Draw( DrawPanel, &dc, wxPoint( 0, 0 ), GR_XOR );
zone_cont->m_Poly->InsertCorner( zone_cont->m_CornerSelection, pos.x, pos.y );
zone_cont->m_CornerSelection++;
zone_cont->Draw(DrawPanel, &dc, wxPoint(0,0), GR_XOR);
Start_Move_Zone_Corner(&dc, zone_cont, zone_cont->m_CornerSelection, true);
zone_cont->Draw( DrawPanel, &dc, wxPoint( 0, 0 ), GR_XOR );
Start_Move_Zone_Corner( &dc, zone_cont, zone_cont->m_CornerSelection, true );
break;
}
......@@ -522,8 +533,8 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_PCB_PLACE_ZONE_CORNER:
{
DrawPanel->MouseToCursorSchema();
ZONE_CONTAINER * zone_cont = (ZONE_CONTAINER*)GetCurItem();
End_Move_Zone_Corner_Or_Outlines(&dc, zone_cont);
ZONE_CONTAINER* zone_cont = (ZONE_CONTAINER*) GetCurItem();
End_Move_Zone_Corner_Or_Outlines( &dc, zone_cont );
break;
}
......@@ -534,7 +545,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_PCB_FILL_ZONE:
DrawPanel->MouseToCursorSchema();
Fill_Zone( &dc, (ZONE_CONTAINER*)GetCurItem() );
Fill_Zone( &dc, (ZONE_CONTAINER*) GetCurItem() );
break;
case ID_PCB_DELETE_ITEM_BUTT:
......@@ -811,7 +822,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
DrawPanel->MouseToCursorSchema();
if( GetCurItem() && (GetCurItem()->m_Flags & IS_NEW) )
{
if ( End_Zone( &dc ) )
if( End_Zone( &dc ) )
SetCurItem( NULL );
}
break;
......@@ -820,8 +831,8 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
DrawPanel->MouseToCursorSchema();
if( GetCurItem() && (GetCurItem()->m_Flags & IS_NEW) )
{
if ( Delete_LastCreatedCorner( &dc ) == 0) // No more segment in outline,
SetCurItem(NULL);
if( Delete_LastCreatedCorner( &dc ) == 0 ) // No more segment in outline,
SetCurItem( NULL );
}
break;
......
......@@ -50,6 +50,7 @@
#include "Width_Net.xpm"
#include "Width_Track_Via.xpm"
#include "Select_Layer_Pair.xpm"
#include "Drag_Outline_Segment.xpm"
#include "Flag.xpm"
......@@ -660,7 +661,13 @@ void WinEDA_PcbFrame::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu
/* Create the wxMenuitem list for zone outlines editing and zone filling
*/
{
if( edge_zone->m_Flags )
if( edge_zone->m_Flags == IS_DRAGGED)
{
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_PLACE_DRAGGED_ZONE_OUTLINE_SEGMENT,
_( "Place Edge Outline" ), apply_xpm );
}
else if( edge_zone->m_Flags )
{
if( (edge_zone->m_Flags & IN_EDIT ) )
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_PLACE_ZONE_CORNER,
......@@ -686,6 +693,8 @@ void WinEDA_PcbFrame::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu
{
ADD_MENUITEM( zones_menu, ID_POPUP_PCB_ADD_ZONE_CORNER,
_( "Create Corner" ), Add_Corner_xpm );
ADD_MENUITEM( zones_menu, ID_POPUP_PCB_DRAG_ZONE_OUTLINE_SEGMENT,
_( "Drag Outline Segment" ), drag_outline_segment_xpm );
}
zones_menu->AppendSeparator();
......
......@@ -14,13 +14,13 @@
#include "protos.h"
#define ROUTER
#define PSCALE 1
/* routines internes */
#ifdef ROUTER
static void Out_Pads( BOARD* Pcb, FILE* outfile );
static int GenEdges( BOARD* Pcb, FILE* outfile );
#endif
static void GenExistantTracks( BOARD* Pcb, FILE* outfile, int current_net_code, int type );
static void ReturnNbViasAndTracks( BOARD* Pcb, int netcode, int* nb_vias, int* nb_tracks );
......@@ -143,7 +143,7 @@ void WinEDA_PcbFrame::GlobalRoute( wxDC* DC )
/************************************************/
static void Out_Pads( BOARD* Pcb, FILE* outfile )
void Out_Pads( BOARD* Pcb, FILE* outfile )
/************************************************/
{
D_PAD* pt_pad;
......@@ -314,7 +314,7 @@ static void Out_Pads( BOARD* Pcb, FILE* outfile )
/**************************************************************************/
static void ReturnNbViasAndTracks( BOARD* Pcb, int netcode, int* nb_vias,
void ReturnNbViasAndTracks( BOARD* Pcb, int netcode, int* nb_vias,
int* nb_tracks )
/**************************************************************************/
......@@ -345,7 +345,7 @@ static void ReturnNbViasAndTracks( BOARD* Pcb, int netcode, int* nb_vias,
/*************************************************************/
static void GenExistantTracks( BOARD* Pcb, FILE* outfile,
void GenExistantTracks( BOARD* Pcb, FILE* outfile,
int current_net_code, int type )
/*************************************************************/
/* generation des pistes existantes */
......@@ -429,7 +429,7 @@ static void GenExistantTracks( BOARD* Pcb, FILE* outfile,
/***********************************************/
static int GenEdges( BOARD* Pcb, FILE* outfile )
int GenEdges( BOARD* Pcb, FILE* outfile )
/***********************************************/
/* Generation des contours (edges).
......
......@@ -37,7 +37,7 @@ bool verbose = false; // false if zone outline diags mst not be shown
// Outline creation:
static void Abort_Zone_Create_Outline( WinEDA_DrawPanel* Panel, wxDC* DC );
static void Show_New_Zone_Edge_While_Move_Mouse( WinEDA_DrawPanel* panel, wxDC* DC, bool erase );
static void Show_New_Edge_While_Move_Mouse( WinEDA_DrawPanel* panel, wxDC* DC, bool erase );
// Corner moving
static void Abort_Zone_Move_Corner_Or_Outlines( WinEDA_DrawPanel* Panel, wxDC* DC );
......@@ -175,8 +175,8 @@ int WinEDA_PcbFrame::Delete_LastCreatedCorner( wxDC* DC )
if( zone->GetNumCorners() > 2 )
{
zone->m_Poly->DeleteCorner( zone->GetNumCorners() - 1 );
if ( DrawPanel->ManageCurseur )
DrawPanel->ManageCurseur(DrawPanel, DC, false);
if( DrawPanel->ManageCurseur )
DrawPanel->ManageCurseur( DrawPanel, DC, false );
}
else
{
......@@ -241,14 +241,34 @@ void WinEDA_PcbFrame::Start_Move_Zone_Corner( wxDC* DC, ZONE_CONTAINER* zone_con
zone_container->m_Flags = IN_EDIT;
DrawPanel->ManageCurseur = Show_Zone_Corner_Or_Outline_While_Move_Mouse;
DrawPanel->ForceCloseManageCurseur = Abort_Zone_Move_Corner_Or_Outlines;
s_CornerInitialPosition.x = zone_container->m_Poly->GetX( corner_id );
s_CornerInitialPosition.y = zone_container->m_Poly->GetY( corner_id );
s_CornerInitialPosition = zone_container->GetCornerPosition( corner_id );
s_CornerIsNew = IsNewCorner;
s_AddCutoutToCurrentZone = false;
s_CurrentZone = NULL;
}
/**************************************************************************************/
void WinEDA_PcbFrame::Start_Move_Zone_Drag_Outline_Edge( wxDC* DC,
ZONE_CONTAINER* zone_container,
int corner_id )
/**************************************************************************************/
/**
* Function Start_Move_Zone_Corner
* Prepares a drag edge for an existing zone outline,
*/
{
zone_container->m_Flags = IS_DRAGGED;
zone_container->m_CornerSelection = corner_id;
DrawPanel->ManageCurseur = Show_Zone_Corner_Or_Outline_While_Move_Mouse;
DrawPanel->ForceCloseManageCurseur = Abort_Zone_Move_Corner_Or_Outlines;
s_CursorLastPosition = s_CornerInitialPosition = GetScreen()->m_Curseur;
s_AddCutoutToCurrentZone = false;
s_CurrentZone = NULL;
}
/*******************************************************************************************************/
void WinEDA_PcbFrame::Start_Move_Zone_Outlines( wxDC* DC, ZONE_CONTAINER* zone_container )
/*******************************************************************************************************/
......@@ -380,6 +400,12 @@ void Abort_Zone_Move_Corner_Or_Outlines( WinEDA_DrawPanel* Panel, wxDC* DC )
offset = s_CornerInitialPosition - s_CursorLastPosition;
zone_container->Move( offset );
}
else if( zone_container->m_Flags == IS_DRAGGED )
{
wxPoint offset;
offset = s_CornerInitialPosition - s_CursorLastPosition;
zone_container->MoveEdge( offset );
}
else
{
if( s_CornerIsNew )
......@@ -411,26 +437,32 @@ void Show_Zone_Corner_Or_Outline_While_Move_Mouse( WinEDA_DrawPanel* Panel, wxDC
*/
{
WinEDA_PcbFrame* pcbframe = (WinEDA_PcbFrame*) Panel->m_Parent;
ZONE_CONTAINER* zone_container = (ZONE_CONTAINER*) pcbframe->GetCurItem();
ZONE_CONTAINER* zone = (ZONE_CONTAINER*) pcbframe->GetCurItem();
if( erase ) /* Undraw edge in old position*/
{
zone_container->Draw( Panel, DC, wxPoint(0,0), GR_XOR );
zone->Draw( Panel, DC, wxPoint( 0, 0 ), GR_XOR );
}
wxPoint pos = pcbframe->GetScreen()->m_Curseur;
if( zone_container->m_Flags == IS_MOVED )
if( zone->m_Flags == IS_MOVED )
{
wxPoint offset;
offset.x = pos.x - s_CursorLastPosition.x;
offset.y = pos.y - s_CursorLastPosition.y;
zone_container->Move( offset );
offset = pos - s_CursorLastPosition;
zone->Move( offset );
s_CursorLastPosition = pos;
}
else if( zone->m_Flags == IS_DRAGGED )
{
wxPoint offset;
offset = pos - s_CursorLastPosition;
zone->MoveEdge( offset );
s_CursorLastPosition = pos;
}
else
zone_container->m_Poly->MoveCorner( zone_container->m_CornerSelection, pos.x, pos.y );
zone->m_Poly->MoveCorner( zone->m_CornerSelection, pos.x, pos.y );
zone_container->Draw( Panel, DC, wxPoint(0,0), GR_XOR );
zone->Draw( Panel, DC, wxPoint( 0, 0 ), GR_XOR );
}
......@@ -531,7 +563,7 @@ int WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
}
SetCurItem( zone );
DrawPanel->ManageCurseur = Show_New_Zone_Edge_While_Move_Mouse;
DrawPanel->ManageCurseur = Show_New_Edge_While_Move_Mouse;
DrawPanel->ForceCloseManageCurseur = Abort_Zone_Create_Outline;
}
// edge in progress:
......@@ -539,7 +571,7 @@ int WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
{
ii = zone->GetNumCorners() - 1;
/* edge in progress : the current corner coordinate was set by Show_New_Zone_Edge_While_Move_Mouse */
/* edge in progress : the current corner coordinate was set by Show_New_Edge_While_Move_Mouse */
if( zone->GetCornerPosition( ii - 1 ) != zone->GetCornerPosition( ii ) )
{
if( Drc_On && m_drc->Drc( zone, ii - 1 ) == OK_DRC ) // Ok, we can add a new corner
......@@ -646,7 +678,7 @@ bool WinEDA_PcbFrame::End_Zone( wxDC* DC )
/******************************************************************************************/
static void Show_New_Zone_Edge_While_Move_Mouse( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
static void Show_New_Edge_While_Move_Mouse( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
/******************************************************************************************/
/* Redraws the edge zone when moving mouse
......
release version:
19 nov 2007
01 feb 2008
files (.zip,.tgz):
kicad-2007-11-19
kicad-2007-02-01
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment