Added: Delete cutout outline in zone popup menu

This commit is contained in:
CHARRAS 2008-01-05 13:37:51 +00:00
parent 549e5f683f
commit 97be005035
17 changed files with 500 additions and 494 deletions

View File

@ -4,12 +4,21 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2008-jan-05 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
+pcbnew:
Added: Delete cutout outline in zone popup menu
the GUI about zones is now working.
Some work is needed ( a zone in a zone of the same net is not merged )
Currently No DRC for outlines
2008-jan-04 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr> 2008-jan-04 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================ ================================================================================
+pcbnew: +pcbnew:
More about zones: More about zones:
Outlines can be edited. Outlines are merged if needeed. Outlines can be edited. Outlines are merged if needeed.
Current No DRC for outlines Currently No DRC for outlines
2008-jan-01 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr> 2008-jan-01 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>

View File

@ -560,7 +560,7 @@ enum main_id {
ID_POPUP_PCB_PLACE_ZONE_CORNER, ID_POPUP_PCB_PLACE_ZONE_CORNER,
ID_POPUP_PCB_ZONE_ADD_SIMILAR_ZONE, ID_POPUP_PCB_ZONE_ADD_SIMILAR_ZONE,
ID_POPUP_PCB_ZONE_ADD_CUTOUT_ZONE, ID_POPUP_PCB_ZONE_ADD_CUTOUT_ZONE,
ID_POPUP_ZONE_UNUSED1, ID_POPUP_PCB_DELETE_ZONE_CUTOUT,
ID_POPUP_ZONE_UNUSED2, ID_POPUP_ZONE_UNUSED2,
ID_POPUP_ZONE_UNUSED3, ID_POPUP_ZONE_UNUSED3,
ID_POPUP_ZONE_UNUSED4, ID_POPUP_ZONE_UNUSED4,

View File

@ -1,6 +1,6 @@
/***********************************************************/ /***********************************************************/
/* wxstruct.h: */ /* wxPcbStruct.h: */
/* descriptions des principales classes derivees utilisees */ /* Classes used in pcbnew, cvpcb and gerbview */
/***********************************************************/ /***********************************************************/
#ifndef WXPCB_STRUCT_H #ifndef WXPCB_STRUCT_H
@ -14,14 +14,6 @@
#define PCB_INTERNAL_UNIT 10000 #define PCB_INTERNAL_UNIT 10000
#endif #endif
// Option for dialog boxes
// #define DIALOG_STYLE wxDEFAULT_DIALOG_STYLE|wxFRAME_FLOAT_ON_PARENT|wxSTAY_ON_TOP
#define DIALOG_STYLE wxDEFAULT_DIALOG_STYLE | wxFRAME_FLOAT_ON_PARENT | MAYBE_RESIZE_BORDER
#define KICAD_DEFAULT_DRAWFRAME_STYLE wxDEFAULT_FRAME_STYLE|wxWANTS_CHARS
#define EDA_DRAW_PANEL wxScrolledWindow
class wxMyDialogModalData;
/* Forward declarations of classes. */ /* Forward declarations of classes. */
class WinEDA_DrawPanel; class WinEDA_DrawPanel;
@ -29,25 +21,12 @@ class WinEDA_DrawFrame;
#include "base_struct.h" #include "base_struct.h"
class WinEDA_App;
class WinEDA_MsgPanel;
class COMMAND;
class WinEDA_MainFrame;
class BASE_SCREEN;
class SCH_SCREEN;
class PCB_SCREEN; class PCB_SCREEN;
class WinEDA_SchematicFrame; // Schematic main frame
class WinEDA_LibeditFrame; // Component creation and edition main frame
class WinEDA_ViewlibFrame; // Component viewer main frame
class WinEDA_GerberFrame; // GERBER viewer main frame class WinEDA_GerberFrame; // GERBER viewer main frame
class WinEDA_Toolbar; class WinEDA_Toolbar;
class WinEDA_CvpcbFrame; class WinEDA_CvpcbFrame;
class WinEDA_PcbFrame; class WinEDA_PcbFrame;
class WinEDA_ModuleEditFrame; class WinEDA_ModuleEditFrame;
class WinEDAChoiceBox;
#define WinEDA_MenuBar wxMenuBar
#define WinEDA_Menu wxMenu
#define WinEDA_MenuItem wxMenuItem
// Used but not defined here: // Used but not defined here:
class BOARD; class BOARD;
@ -92,7 +71,7 @@ public:
WinEDA_BasePcbFrame( wxWindow* father, WinEDA_App* parent, int idtype, WinEDA_BasePcbFrame( wxWindow* father, WinEDA_App* parent, int idtype,
const wxString& title, const wxString& title,
const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size,
long style = KICAD_DEFAULT_DRAWFRAME_STYLE ); long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
~WinEDA_BasePcbFrame(); ~WinEDA_BasePcbFrame();
@ -175,131 +154,140 @@ public:
*/ */
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide(); GENERAL_COLLECTORS_GUIDE GetCollectorsGuide();
/** /**
* Function CursorGoto * Function CursorGoto
* positions the cursor at a given coordinate and reframes the drawing if the * positions the cursor at a given coordinate and reframes the drawing if the
* requested point is out of view. * requested point is out of view.
* @param aPos The point to go to. * @param aPos The point to go to.
*/ */
void CursorGoto( const wxPoint& aPos ); void CursorGoto( const wxPoint& aPos );
/* Place un repere sur l'ecran au point de coordonnees PCB pos */ /* Place un repere sur l'ecran au point de coordonnees PCB pos */
void place_marqueur( wxDC* DC, const wxPoint& pos, char* pt_bitmap, void place_marqueur( wxDC* DC, const wxPoint& pos, char* pt_bitmap,
int DrawMode, int color, int type ); int DrawMode, int color, int type );
// Gestion des modules // Gestion des modules
void InstallModuleOptionsFrame( MODULE* Module, void InstallModuleOptionsFrame( MODULE* Module,
wxDC* DC, const wxPoint& pos ); wxDC* DC, const wxPoint& pos );
MODULE* Copie_Module( MODULE* module ); MODULE* Copie_Module( MODULE* module );
MODULE* Exchange_Module( wxWindow* winaff, MODULE* old_module, MODULE* new_module ); MODULE* Exchange_Module( wxWindow* winaff,
int Save_1_Module( const wxString& LibName, MODULE* Module, MODULE* old_module,
bool Overwrite, bool DisplayDialog ); MODULE* new_module );
void Archive_Modules( const wxString& LibName, bool NewModulesOnly ); int Save_1_Module( const wxString& LibName, MODULE* Module,
MODULE* Select_1_Module_From_BOARD( BOARD* Pcb ); bool Overwrite, bool DisplayDialog );
MODULE* GetModuleByName(); void Archive_Modules( const wxString& LibName, bool NewModulesOnly );
MODULE* Select_1_Module_From_BOARD( BOARD* Pcb );
MODULE* GetModuleByName();
// Modules (footprints) // Modules (footprints)
MODULE* Create_1_Module( wxDC* DC, const wxString& module_name ); MODULE* Create_1_Module( wxDC* DC, const wxString& module_name );
void Edit_Module( MODULE* module, wxDC* DC ); void Edit_Module( MODULE* module, wxDC* DC );
void Rotate_Module( wxDC* DC, MODULE* module, int angle, bool incremental ); void Rotate_Module( wxDC* DC,
void Change_Side_Module( MODULE* Module, wxDC* DC ); MODULE* module,
void Place_Module( MODULE* module, wxDC* DC ); int angle,
void InstallExchangeModuleFrame( MODULE* ExchangeModuleModule, bool incremental );
wxDC* DC, const wxPoint& pos ); void Change_Side_Module( MODULE* Module, wxDC* DC );
void Place_Module( MODULE* module, wxDC* DC );
void InstallExchangeModuleFrame( MODULE* ExchangeModuleModule,
wxDC* DC, const wxPoint& pos );
// module texts // module texts
void RotateTextModule( TEXTE_MODULE* Text, wxDC* DC ); void RotateTextModule( TEXTE_MODULE* Text, wxDC* DC );
void DeleteTextModule( TEXTE_MODULE* Text, wxDC* DC ); void DeleteTextModule( TEXTE_MODULE* Text, wxDC* DC );
void PlaceTexteModule( TEXTE_MODULE* Text, wxDC* DC ); void PlaceTexteModule( TEXTE_MODULE* Text, wxDC* DC );
void StartMoveTexteModule( TEXTE_MODULE* Text, wxDC* DC ); void StartMoveTexteModule( TEXTE_MODULE* Text, wxDC* DC );
TEXTE_MODULE* CreateTextModule( MODULE* Module, wxDC* DC ); TEXTE_MODULE* CreateTextModule( MODULE* Module, wxDC* DC );
void InstallPadOptionsFrame( D_PAD* pad, wxDC* DC, const wxPoint& pos ); void InstallPadOptionsFrame( D_PAD* pad, wxDC* DC, const wxPoint& pos );
void InstallTextModOptionsFrame( TEXTE_MODULE* TextMod, void InstallTextModOptionsFrame( TEXTE_MODULE* TextMod,
wxDC* DC, const wxPoint& pos ); wxDC* DC, const wxPoint& pos );
// Pads sur modules // Pads sur modules
void AddPad( MODULE* Module, wxDC* DC ); void AddPad( MODULE* Module, wxDC* DC );
void DeletePad( D_PAD* Pad, wxDC* DC ); void DeletePad( D_PAD* Pad, wxDC* DC );
void StartMovePad( D_PAD* Pad, wxDC* DC ); void StartMovePad( D_PAD* Pad, wxDC* DC );
void RotatePad( D_PAD* Pad, wxDC* DC ); void RotatePad( D_PAD* Pad, wxDC* DC );
void PlacePad( D_PAD* Pad, wxDC* DC ); void PlacePad( D_PAD* Pad, wxDC* DC );
void Export_Pad_Settings( D_PAD* pt_pad ); void Export_Pad_Settings( D_PAD* pt_pad );
void Import_Pad_Settings( D_PAD* pt_pad, wxDC* DC ); void Import_Pad_Settings( D_PAD* pt_pad, wxDC* DC );
void Global_Import_Pad_Settings( D_PAD* Pad, wxDC* DC ); void Global_Import_Pad_Settings( D_PAD* Pad, wxDC* DC );
// loading footprints // loading footprints
MODULE* Get_Librairie_Module( wxWindow* winaff, const wxString& library, MODULE* Get_Librairie_Module( wxWindow* winaff,
const wxString& ModuleName, bool show_msg_err ); const wxString& library,
const wxString& ModuleName,
bool show_msg_err );
wxString Select_1_Module_From_List( wxString Select_1_Module_From_List(
WinEDA_DrawFrame* active_window, const wxString& Library, WinEDA_DrawFrame* active_window, const wxString& Library,
const wxString& Mask, const wxString& KeyWord ); const wxString& Mask, const wxString& KeyWord );
MODULE* Load_Module_From_Library( const wxString& library, wxDC* DC ); MODULE* Load_Module_From_Library( const wxString& library, wxDC* DC );
// ratsnest functions // ratsnest functions
void Compile_Ratsnest( wxDC* DC, bool affiche ); /* Recalcul complet du chevelu */ void Compile_Ratsnest( wxDC* DC, bool affiche ); /* Recalcul complet du chevelu */
void ReCompile_Ratsnest_After_Changes( wxDC* DC ); void ReCompile_Ratsnest_After_Changes( wxDC* DC );
int Test_1_Net_Ratsnest( wxDC* DC, int net_code ); int Test_1_Net_Ratsnest( wxDC* DC, int net_code );
char* build_ratsnest_module( wxDC* DC, MODULE* Module ); char* build_ratsnest_module( wxDC* DC, MODULE* Module );
void trace_ratsnest_module( wxDC* DC ); void trace_ratsnest_module( wxDC* DC );
void Build_Board_Ratsnest( wxDC* DC ); void Build_Board_Ratsnest( wxDC* DC );
void DrawGeneralRatsnest( wxDC* DC, int net_code = 0 ); void DrawGeneralRatsnest( wxDC* DC, int net_code = 0 );
void trace_ratsnest_pad( wxDC* DC ); void trace_ratsnest_pad( wxDC* DC );
void recalcule_pad_net_code(); /* compute and update the PAD net codes */ void recalcule_pad_net_code(); /* compute and update the PAD net codes */
void build_liste_pads(); void build_liste_pads();
int* build_ratsnest_pad( EDA_BaseStruct* ref, const wxPoint& refpos, bool init ); int* build_ratsnest_pad( EDA_BaseStruct* ref,
const wxPoint& refpos,
bool init );
void Tst_Ratsnest( wxDC* DC, int ref_netcode ); void Tst_Ratsnest( wxDC* DC, int ref_netcode );
void test_connexions( wxDC* DC ); void test_connexions( wxDC* DC );
void test_1_net_connexion( wxDC* DC, int net_code ); void test_1_net_connexion( wxDC* DC, int net_code );
void reattribution_reference_piste( int affiche ); void reattribution_reference_piste( int affiche );
// Plotting // Plotting
void ToPlotter( wxCommandEvent& event ); void ToPlotter( wxCommandEvent& event );
void Plot_Serigraphie( int format_plot, FILE* File, int masque_layer ); void Plot_Serigraphie( int format_plot, FILE* File, int masque_layer );
void Genere_GERBER( const wxString& FullFileName, int Layer, void Genere_GERBER( const wxString& FullFileName, int Layer,
bool PlotOriginIsAuxAxis ); bool PlotOriginIsAuxAxis );
void Genere_HPGL( const wxString& FullFileName, int Layer ); void Genere_HPGL( const wxString& FullFileName, int Layer );
void Genere_PS( const wxString& FullFileName, int Layer ); void Genere_PS( const wxString& FullFileName, int Layer );
void Plot_Layer_HPGL( FILE* File, int masque_layer, void Plot_Layer_HPGL( FILE* File, int masque_layer,
int garde, int tracevia, int modetrace ); int garde, int tracevia, int modetrace );
void Plot_Layer_GERBER( FILE* File, int masque_layer, void Plot_Layer_GERBER( FILE* File, int masque_layer,
int garde, int tracevia ); int garde, int tracevia );
int Gen_D_CODE_File( FILE* file ); int Gen_D_CODE_File( FILE* file );
void Plot_Layer_PS( FILE* File, int masque_layer, void Plot_Layer_PS( FILE* File, int masque_layer,
int garde, int tracevia, int modetrace ); int garde, int tracevia, int modetrace );
/* Block operations: */ /* Block operations: */
void Block_Delete( wxDC* DC ); void Block_Delete( wxDC* DC );
void Block_Rotate( wxDC* DC ); void Block_Rotate( wxDC* DC );
void Block_Invert( wxDC* DC ); void Block_Invert( wxDC* DC );
void Block_Move( wxDC* DC ); void Block_Move( wxDC* DC );
void Block_Duplicate( wxDC* DC ); void Block_Duplicate( wxDC* DC );
/** /**
* Function DelLimitesZone * Function DelLimitesZone
* deletes the limits of a zone. * deletes the limits of a zone.
* @param DC A wxDC to draw onto. * @param DC A wxDC to draw onto.
* @param Redraw If true, means redraw the pcb without the zone limits * @param Redraw If true, means redraw the pcb without the zone limits
*/ */
void DelLimitesZone( wxDC* DC, bool Redraw ); void DelLimitesZone( wxDC* DC, bool Redraw );
// layerhandling: // layerhandling:
// (See pcbnew/sel_layer.cpp for description of why null_layer parameter is provided) // (See pcbnew/sel_layer.cpp for description of why null_layer parameter is provided)
int SelectLayer( int default_layer, int min_layer, int max_layer, int SelectLayer( int default_layer, int min_layer, int max_layer,
bool null_layer = false ); bool null_layer = false );
void SelectLayerPair(); void SelectLayerPair();
virtual void SwitchLayer( wxDC* DC, int layer ); virtual void SwitchLayer( wxDC* DC, int layer );
// divers // divers
void AddHistory( int value, KICAD_T type ); // Add value in data list history void AddHistory( int value, KICAD_T type ); // Add value in data list history
void InstallGridFrame( const wxPoint& pos ); void InstallGridFrame( const wxPoint& pos );
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
@ -321,10 +309,10 @@ private:
wxMenu* m_FilesMenu; wxMenu* m_FilesMenu;
DRC* m_drc; ///< the DRC controller, see drc.cpp DRC* m_drc; ///< the DRC controller, see drc.cpp
// we'll use lower case function names for private member functions. // we'll use lower case function names for private member functions.
void createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu* aPopMenu ); void createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu* aPopMenu );
void createPopUpMenuForFootprints( MODULE* aModule, wxMenu* aPopMenu ); void createPopUpMenuForFootprints( MODULE* aModule, wxMenu* aPopMenu );
void createPopUpMenuForFpTexts( TEXTE_MODULE* aText, wxMenu* aPopMenu ); void createPopUpMenuForFpTexts( TEXTE_MODULE* aText, wxMenu* aPopMenu );
void createPopUpMenuForFpPads( D_PAD* aPad, wxMenu* aPopMenu ); void createPopUpMenuForFpPads( D_PAD* aPad, wxMenu* aPopMenu );
@ -335,7 +323,7 @@ private:
public: public:
WinEDA_PcbFrame( wxWindow* father, WinEDA_App* parent, const wxString& title, WinEDA_PcbFrame( wxWindow* father, WinEDA_App* parent, const wxString& title,
const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size,
long style = KICAD_DEFAULT_DRAWFRAME_STYLE ); long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
~WinEDA_PcbFrame(); ~WinEDA_PcbFrame();
@ -445,7 +433,7 @@ public:
// Track and via edition: // Track and via edition:
void DisplayTrackSettings(); void DisplayTrackSettings();
/** /**
* Function Other_Layer_Route * Function Other_Layer_Route
* operates in one of two ways. If argument track is NULL, then swap the active * operates in one of two ways. If argument track is NULL, then swap the active
@ -457,7 +445,7 @@ public:
* @param DC A device context to draw on. * @param DC A device context to draw on.
* @return bool - true if the operation was successful, else false such as * @return bool - true if the operation was successful, else false such as
* the case where DRC would not allow a via. * the case where DRC would not allow a via.
*/ */
bool Other_Layer_Route( TRACK* track, wxDC* DC ); bool Other_Layer_Route( TRACK* track, wxDC* DC );
void Affiche_PadsNoConnect( wxDC* DC ); void Affiche_PadsNoConnect( wxDC* DC );
void Affiche_Status_Net( wxDC* DC ); void Affiche_Status_Net( wxDC* DC );
@ -483,97 +471,114 @@ public:
bool Genere_Pad_Connexion( wxDC* DC, int layer ); bool Genere_Pad_Connexion( wxDC* DC, int layer );
// zone handling // zone handling
/** Function Delete_Zone
* Remove the zone which include the segment aZone, or the zone which have the given time stamp. /** Function Delete_Zone_Fill
* A zone is a group of segments which have the same TimeStamp * Remove the zone filling which include the segment aZone, or the zone which have the given time stamp.
* @param DC = current Device Context (can be NULL) * A zone is a group of segments which have the same TimeStamp
* @param aZone = zone segment within the zone to delete. Can be NULL * @param DC = current Device Context (can be NULL)
* @param aTimestamp = Timestamp for the zone to delete, used if aZone == NULL * @param aZone = zone segment within the zone to delete. Can be NULL
*/ * @param aTimestamp = Timestamp for the zone to delete, used if aZone == NULL
void Delete_Zone( wxDC* DC, SEGZONE* Track, long aTimestamp = 0 ); */
void Delete_Zone_Fill( wxDC* DC, SEGZONE* Track, long aTimestamp = 0 );
EDGE_ZONE* Del_SegmEdgeZone( wxDC* DC, EDGE_ZONE* edge_zone ); EDGE_ZONE* Del_SegmEdgeZone( wxDC* DC, EDGE_ZONE* edge_zone );
/** /**
* Function Begin_Zone * Function Begin_Zone
* initiates a zone edge creation process, * initiates a zone edge creation process,
* or terminates the current zone edge and creates a new zone edge stub * or terminates the current zone edge and creates a new zone edge stub
*/ */
EDGE_ZONE* Begin_Zone( wxDC* DC ); EDGE_ZONE* Begin_Zone( wxDC* DC );
/** /**
* Function End_Zone * Function End_Zone
* terminates the zone edge creation process * terminates the zone edge creation process
* @param DC = current Device Context * @param DC = current Device Context
*/ */
void End_Zone( wxDC* DC ); void End_Zone( wxDC* DC );
/** Function Fill_Zone()
* Calculate the zone filling for the outline zone_container
* The zone outline is a frontier, and can be complex (with holes)
* The filling starts from starting points like pads, tracks.
* If exists the old filling is removed
* @param DC = current Device Context
* @param zone_container = zone to fill
* @param verbose = true to show error messages
* @return error level (0 = no error)
*/
int Fill_Zone( wxDC* DC, ZONE_CONTAINER * zone_container, bool verbose = TRUE );
/** Function Fill_All_Zones() /** Function Fill_Zone()
* Fill all zones on the board * Calculate the zone filling for the outline zone_container
* The old fillings are removed * The zone outline is a frontier, and can be complex (with holes)
* @param frame = reference to the main frame * The filling starts from starting points like pads, tracks.
* @param DC = current Device Context * If exists the old filling is removed
* @param verbose = true to show error messages * @param DC = current Device Context
* @return error level (0 = no error) * @param zone_container = zone to fill
*/ * @param verbose = true to show error messages
int Fill_All_Zones( wxDC* DC, bool verbose = TRUE ); * @return error level (0 = no error)
*/
int Fill_Zone( wxDC* DC, ZONE_CONTAINER* zone_container, bool verbose = TRUE );
/** Function Fill_All_Zones()
* Fill all zones on the board
* The old fillings are removed
* @param frame = reference to the main frame
* @param DC = current Device Context
* @param verbose = true to show error messages
* @return error level (0 = no error)
*/
int Fill_All_Zones( wxDC* DC, bool verbose = TRUE );
/** /**
* Function Add_Zone_Cutout * Function Add_Zone_Cutout
* Add a cutout zone to a given zone outline * Add a cutout zone to a given zone outline
* @param DC = current Device Context * @param DC = current Device Context
* @param zone_container = parent zone outline * @param zone_container = parent zone outline
*/ */
void Add_Zone_Cutout( wxDC* DC , ZONE_CONTAINER * zone_container ); void Add_Zone_Cutout( wxDC* DC, ZONE_CONTAINER* zone_container );
/** /**
* Function Add_Similar_Zone * Function Add_Similar_Zone
* Add a zone to a given zone outline. * Add a zone to a given zone outline.
* if the zones are overlappeing they will be merged * if the zones are overlappeing they will be merged
* @param DC = current Device Context * @param DC = current Device Context
* @param zone_container = parent zone outline * @param zone_container = parent zone outline
*/ */
void Add_Similar_Zone( wxDC* DC , ZONE_CONTAINER * zone_container ); void Add_Similar_Zone( wxDC* DC, ZONE_CONTAINER* zone_container );
/** /**
* Function Edit_Zone_Params * Function Edit_Zone_Params
* Edit params (layer, clearance, ...) for a zone outline * Edit params (layer, clearance, ...) for a zone outline
*/ */
void Edit_Zone_Params( wxDC* DC , ZONE_CONTAINER * zone_container ); void Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* zone_container );
/** /**
* Function Start_Move_Zone_Corner * Function Start_Move_Zone_Corner
* Prepares a move corner in a zone outline, * Prepares a move corner in a zone outline,
* called from a move corner command (IsNewCorner = false), * called from a move corner command (IsNewCorner = false),
* or a create new cornet command (IsNewCorner = true ) * or a create new cornet command (IsNewCorner = true )
*/ */
void Start_Move_Zone_Corner( wxDC* DC , ZONE_CONTAINER * zone_container, int corner_id, bool IsNewCorner ); void Start_Move_Zone_Corner( wxDC* DC,
/** ZONE_CONTAINER* zone_container,
* Function End_Move_Zone_Corner int corner_id,
* Terminates a move corner in a zone outline bool IsNewCorner );
*/
void End_Move_Zone_Corner( wxDC* DC , ZONE_CONTAINER * zone_container );
/** /**
* Function End_Move_Zone_Corner * Function End_Move_Zone_Corner
* Remove the currently selected corner in a zone outline * Terminates a move corner in a zone outline
* the .m_CornerSelection is used as corner selection */
*/ void End_Move_Zone_Corner( wxDC* DC, ZONE_CONTAINER* zone_container );
void Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER * zone_container );
// Target handling /**
* Function End_Move_Zone_Corner
* Remove the currently selected corner in a zone outline
* the .m_CornerSelection is used as corner selection
*/
void Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER* zone_container );
/** Function Delete_Zone
* Remove the zone which include the segment aZone, or the zone which have the given time stamp.
* A zone is a group of segments which have the same TimeStamp
* @param DC = current Device Context (can be NULL)
* @param zone_container = zone to modify
* the member .m_CornerSelection is used to find the outline to remove.
* if the outline is the main outline, all the zone is removed
* otherwise, the hole is deleted
*/
void Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* zone_container );
// Target handling
MIREPCB* Create_Mire( wxDC* DC ); MIREPCB* Create_Mire( wxDC* DC );
void Delete_Mire( MIREPCB* MirePcb, wxDC* DC ); void Delete_Mire( MIREPCB* MirePcb, wxDC* DC );
void StartMove_Mire( MIREPCB* MirePcb, wxDC* DC ); void StartMove_Mire( MIREPCB* MirePcb, wxDC* DC );
@ -618,7 +623,7 @@ public:
void GlobalRoute( wxDC* DC ); void GlobalRoute( wxDC* DC );
// divers // divers
void Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC ); void Show_1_Ratsnest( EDA_BaseStruct* item, wxDC* DC );
void Ratsnest_On_Off( wxDC* DC ); void Ratsnest_On_Off( wxDC* DC );
void Clean_Pcb( wxDC* DC ); void Clean_Pcb( wxDC* DC );
BOARD_ITEM* SaveItemEfface( BOARD_ITEM* PtItem, int nbitems ); BOARD_ITEM* SaveItemEfface( BOARD_ITEM* PtItem, int nbitems );
@ -660,7 +665,7 @@ private:
public: public:
WinEDA_GerberFrame( wxWindow* father, WinEDA_App* parent, const wxString& title, WinEDA_GerberFrame( wxWindow* father, WinEDA_App* parent, const wxString& title,
const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size,
long style = KICAD_DEFAULT_DRAWFRAME_STYLE ); long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
~WinEDA_GerberFrame(); ~WinEDA_GerberFrame();
@ -766,7 +771,7 @@ public:
WinEDA_ModuleEditFrame( wxWindow* father, WinEDA_App* parent, WinEDA_ModuleEditFrame( wxWindow* father, WinEDA_App* parent,
const wxString& title, const wxString& title,
const wxPoint& pos, const wxSize& size, const wxPoint& pos, const wxSize& size,
long style = KICAD_DEFAULT_DRAWFRAME_STYLE ); long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
~WinEDA_ModuleEditFrame(); ~WinEDA_ModuleEditFrame();
@ -795,7 +800,7 @@ public:
BOARD_ITEM* ModeditLocateAndDisplay( int aHotKeyCode = 0 ); BOARD_ITEM* ModeditLocateAndDisplay( int aHotKeyCode = 0 );
/* Undo and redo functions */ /* Undo and redo functions */
public: public:
void SaveCopyInUndoList( EDA_BaseStruct* ItemToCopy, int flag_type_command = 0 ); void SaveCopyInUndoList( EDA_BaseStruct* ItemToCopy, int flag_type_command = 0 );

Binary file not shown.

View File

@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kicad\n" "Project-Id-Version: kicad\n"
"POT-Creation-Date: \n" "POT-Creation-Date: \n"
"PO-Revision-Date: 2008-01-01 17:55+0100\n" "PO-Revision-Date: 2008-01-05 14:17+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: kicad team <jean-pierre.charras@ujf-grenoble.fr>\n" "Language-Team: kicad team <jean-pierre.charras@ujf-grenoble.fr>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -639,7 +639,7 @@ msgstr "Cuivre"
#: pcbnew/classpcb.cpp:210 #: pcbnew/classpcb.cpp:210
#: pcbnew/class_track.cpp:806 #: pcbnew/class_track.cpp:806
#: pcbnew/class_module.cpp:1217 #: pcbnew/class_module.cpp:1217
#: pcbnew/class_zone.cpp:407 #: pcbnew/class_zone.cpp:441
#: gerbview/affiche.cpp:109 #: gerbview/affiche.cpp:109
msgid "Layer" msgid "Layer"
msgstr "Couche" msgstr "Couche"
@ -1357,7 +1357,7 @@ msgstr "Module"
#: pcbnew/classpcb.cpp:194 #: pcbnew/classpcb.cpp:194
#: pcbnew/class_marker.cpp:112 #: pcbnew/class_marker.cpp:112
#: pcbnew/class_track.cpp:750 #: pcbnew/class_track.cpp:750
#: pcbnew/class_zone.cpp:388 #: pcbnew/class_zone.cpp:422
#: gerbview/affiche.cpp:93 #: gerbview/affiche.cpp:93
msgid "Type" msgid "Type"
msgstr "Type" msgstr "Type"
@ -1629,11 +1629,11 @@ msgstr "Hauteur Texte Module"
msgid "Text Module Size H" msgid "Text Module Size H"
msgstr "Largeur Texte Module" msgstr "Largeur Texte Module"
#: pcbnew/zone_filling_algorithm.cpp:156 #: pcbnew/zone_filling_algorithm.cpp:155
msgid "No pads or starting point found to fill this zone outline" msgid "No pads or starting point found to fill this zone outline"
msgstr "Pas de pads ou de points de départ pour remplir ce contour de zone" msgstr "Pas de pads ou de points de départ pour remplir ce contour de zone"
#: pcbnew/zone_filling_algorithm.cpp:194 #: pcbnew/zone_filling_algorithm.cpp:193
msgid "Ok" msgid "Ok"
msgstr "Ok" msgstr "Ok"
@ -1911,8 +1911,8 @@ msgstr "Garder"
#: pcbnew/dialog_netlist.cpp:143 #: pcbnew/dialog_netlist.cpp:143
#: pcbnew/onrightclick.cpp:589 #: pcbnew/onrightclick.cpp:589
#: pcbnew/onrightclick.cpp:749 #: pcbnew/onrightclick.cpp:754
#: pcbnew/onrightclick.cpp:846 #: pcbnew/onrightclick.cpp:851
#: eeschema/edit_component_in_lib.cpp:239 #: eeschema/edit_component_in_lib.cpp:239
#: eeschema/edit_component_in_lib.cpp:320 #: eeschema/edit_component_in_lib.cpp:320
msgid "Delete" msgid "Delete"
@ -2086,7 +2086,7 @@ msgid "Add Drawing"
msgstr "Ajout d'éléments graphiques" msgstr "Ajout d'éléments graphiques"
#: pcbnew/modedit.cpp:424 #: pcbnew/modedit.cpp:424
#: pcbnew/edit.cpp:536 #: pcbnew/edit.cpp:518
#: eeschema/schedit.cpp:455 #: eeschema/schedit.cpp:455
#: eeschema/libframe.cpp:579 #: eeschema/libframe.cpp:579
msgid "Delete item" msgid "Delete item"
@ -2144,8 +2144,8 @@ msgid "Delete Block (shift+ctrl + drag mouse)"
msgstr "Effacement Bloc (shift+ctrl + drag mouse)" msgstr "Effacement Bloc (shift+ctrl + drag mouse)"
#: pcbnew/modedit_onclick.cpp:252 #: pcbnew/modedit_onclick.cpp:252
#: pcbnew/onrightclick.cpp:743 #: pcbnew/onrightclick.cpp:748
#: pcbnew/onrightclick.cpp:840 #: pcbnew/onrightclick.cpp:845
msgid "Rotate" msgid "Rotate"
msgstr "Rotation" msgstr "Rotation"
@ -2170,17 +2170,17 @@ msgid "Move Pad"
msgstr "Déplace Pad" msgstr "Déplace Pad"
#: pcbnew/modedit_onclick.cpp:274 #: pcbnew/modedit_onclick.cpp:274
#: pcbnew/onrightclick.cpp:782 #: pcbnew/onrightclick.cpp:787
msgid "Edit Pad" msgid "Edit Pad"
msgstr "Edit Pad" msgstr "Edit Pad"
#: pcbnew/modedit_onclick.cpp:276 #: pcbnew/modedit_onclick.cpp:276
#: pcbnew/onrightclick.cpp:786 #: pcbnew/onrightclick.cpp:791
msgid "New Pad Settings" msgid "New Pad Settings"
msgstr "Nouvelles Caract. Pads" msgstr "Nouvelles Caract. Pads"
#: pcbnew/modedit_onclick.cpp:278 #: pcbnew/modedit_onclick.cpp:278
#: pcbnew/onrightclick.cpp:788 #: pcbnew/onrightclick.cpp:793
msgid "Export Pad Settings" msgid "Export Pad Settings"
msgstr "Exporte Caract. Pads" msgstr "Exporte Caract. Pads"
@ -2189,7 +2189,7 @@ msgid "delete Pad"
msgstr "Supprimer Pad" msgstr "Supprimer Pad"
#: pcbnew/modedit_onclick.cpp:285 #: pcbnew/modedit_onclick.cpp:285
#: pcbnew/onrightclick.cpp:793 #: pcbnew/onrightclick.cpp:798
msgid "Global Pad Settings" msgid "Global Pad Settings"
msgstr "Edition Globale des pads" msgstr "Edition Globale des pads"
@ -2222,9 +2222,9 @@ msgid "Place edge"
msgstr "Place contour" msgstr "Place contour"
#: pcbnew/modedit_onclick.cpp:317 #: pcbnew/modedit_onclick.cpp:317
#: pcbnew/onrightclick.cpp:711 #: pcbnew/onrightclick.cpp:716
#: pcbnew/onrightclick.cpp:745 #: pcbnew/onrightclick.cpp:750
#: pcbnew/onrightclick.cpp:842 #: pcbnew/onrightclick.cpp:847
#: eeschema/onrightclick.cpp:313 #: eeschema/onrightclick.cpp:313
msgid "Edit" msgid "Edit"
msgstr "Editer" msgstr "Editer"
@ -2565,7 +2565,7 @@ msgid "Footprint name:"
msgstr "Nom Module: " msgstr "Nom Module: "
#: pcbnew/modules.cpp:281 #: pcbnew/modules.cpp:281
#: pcbnew/onrightclick.cpp:717 #: pcbnew/onrightclick.cpp:722
msgid "Delete Module" msgid "Delete Module"
msgstr "Supprimer Module" msgstr "Supprimer Module"
@ -3212,7 +3212,6 @@ msgid "Add Similar Zone"
msgstr "Addition d'une Zone Semblable" msgstr "Addition d'une Zone Semblable"
#: pcbnew/onrightclick.cpp:664 #: pcbnew/onrightclick.cpp:664
#, fuzzy
msgid "Add Cutout Area" msgid "Add Cutout Area"
msgstr "Addition d'une Zone Interdite" msgstr "Addition d'une Zone Interdite"
@ -3224,44 +3223,48 @@ msgstr "Remplir Zone"
msgid "Edit Zone Params" msgid "Edit Zone Params"
msgstr "Editer Paramètres de la Zone" msgstr "Editer Paramètres de la Zone"
#: pcbnew/onrightclick.cpp:673 #: pcbnew/onrightclick.cpp:675
msgid "Delete Cutout"
msgstr "Supprimer Zone Interdite"
#: pcbnew/onrightclick.cpp:678
msgid "Delete Zone Outline" msgid "Delete Zone Outline"
msgstr "Supprimer Contour de Zone" msgstr "Supprimer Contour de Zone"
#: pcbnew/onrightclick.cpp:695 #: pcbnew/onrightclick.cpp:700
#: pcbnew/onrightclick.cpp:740 #: pcbnew/onrightclick.cpp:745
#: pcbnew/onrightclick.cpp:778 #: pcbnew/onrightclick.cpp:783
#: pcbnew/onrightclick.cpp:837 #: pcbnew/onrightclick.cpp:842
msgid "Move" msgid "Move"
msgstr "Move" msgstr "Move"
#: pcbnew/onrightclick.cpp:698 #: pcbnew/onrightclick.cpp:703
#: pcbnew/onrightclick.cpp:780 #: pcbnew/onrightclick.cpp:785
msgid "Drag" msgid "Drag"
msgstr "Drag" msgstr "Drag"
#: pcbnew/onrightclick.cpp:702 #: pcbnew/onrightclick.cpp:707
msgid "Rotate +" msgid "Rotate +"
msgstr "Rotation +" msgstr "Rotation +"
#: pcbnew/onrightclick.cpp:706 #: pcbnew/onrightclick.cpp:711
#: eeschema/onrightclick.cpp:301 #: eeschema/onrightclick.cpp:301
msgid "Rotate -" msgid "Rotate -"
msgstr "Rotation -" msgstr "Rotation -"
#: pcbnew/onrightclick.cpp:707 #: pcbnew/onrightclick.cpp:712
msgid "Flip" msgid "Flip"
msgstr "Change côté" msgstr "Change côté"
#: pcbnew/onrightclick.cpp:797 #: pcbnew/onrightclick.cpp:802
msgid "delete" msgid "delete"
msgstr "Effacer" msgstr "Effacer"
#: pcbnew/onrightclick.cpp:804 #: pcbnew/onrightclick.cpp:809
msgid "Autoroute Pad" msgid "Autoroute Pad"
msgstr "Autoroute Pad" msgstr "Autoroute Pad"
#: pcbnew/onrightclick.cpp:805 #: pcbnew/onrightclick.cpp:810
msgid "Autoroute Net" msgid "Autoroute Net"
msgstr "Autoroute Net" msgstr "Autoroute Net"
@ -3612,11 +3615,11 @@ msgstr "Pcb Graphic"
#: pcbnew/class_board_item.cpp:59 #: pcbnew/class_board_item.cpp:59
#: pcbnew/class_board_item.cpp:68 #: pcbnew/class_board_item.cpp:68
#: pcbnew/class_board_item.cpp:145 #: pcbnew/class_board_item.cpp:145
#: pcbnew/class_board_item.cpp:164 #: pcbnew/class_board_item.cpp:169
#: pcbnew/class_board_item.cpp:180 #: pcbnew/class_board_item.cpp:185
#: pcbnew/class_board_item.cpp:207 #: pcbnew/class_board_item.cpp:212
#: pcbnew/class_board_item.cpp:224 #: pcbnew/class_board_item.cpp:229
#: pcbnew/class_board_item.cpp:230 #: pcbnew/class_board_item.cpp:235
msgid " on " msgid " on "
msgstr " sur " msgstr " sur "
@ -3659,46 +3662,51 @@ msgid "Length:"
msgstr "Long.:" msgstr "Long.:"
#: pcbnew/class_board_item.cpp:152 #: pcbnew/class_board_item.cpp:152
#: pcbnew/class_zone.cpp:385 #: pcbnew/class_zone.cpp:416
msgid "Zone Outline" msgid "Zone Outline"
msgstr "Contour de Zone" msgstr "Contour de Zone"
#: pcbnew/class_board_item.cpp:168 #: pcbnew/class_board_item.cpp:156
#: pcbnew/class_zone.cpp:419
msgid "(Cutout)"
msgstr "(Cutout)"
#: pcbnew/class_board_item.cpp:173
#: pcbnew/class_track.cpp:743 #: pcbnew/class_track.cpp:743
msgid "Zone" msgid "Zone"
msgstr "Zone" msgstr "Zone"
#: pcbnew/class_board_item.cpp:186 #: pcbnew/class_board_item.cpp:191
#: pcbnew/pcbframe.cpp:479 #: pcbnew/pcbframe.cpp:479
msgid "Via" msgid "Via"
msgstr "Via" msgstr "Via"
#: pcbnew/class_board_item.cpp:190 #: pcbnew/class_board_item.cpp:195
msgid "Blind" msgid "Blind"
msgstr "Enterrée" msgstr "Enterrée"
#: pcbnew/class_board_item.cpp:192 #: pcbnew/class_board_item.cpp:197
msgid "Buried" msgid "Buried"
msgstr "Borgne" msgstr "Borgne"
#: pcbnew/class_board_item.cpp:214 #: pcbnew/class_board_item.cpp:219
#: pcbnew/class_marker.cpp:112 #: pcbnew/class_marker.cpp:112
msgid "Marker" msgid "Marker"
msgstr "Marqueur" msgstr "Marqueur"
#: pcbnew/class_board_item.cpp:219 #: pcbnew/class_board_item.cpp:224
msgid "Dimension" msgid "Dimension"
msgstr "Dimension" msgstr "Dimension"
#: pcbnew/class_board_item.cpp:224 #: pcbnew/class_board_item.cpp:229
msgid "Target" msgid "Target"
msgstr "Mire" msgstr "Mire"
#: pcbnew/class_board_item.cpp:225 #: pcbnew/class_board_item.cpp:230
msgid "size" msgid "size"
msgstr "dimension" msgstr "dimension"
#: pcbnew/class_board_item.cpp:230 #: pcbnew/class_board_item.cpp:235
msgid "Edge Zone" msgid "Edge Zone"
msgstr "Contour Zone" msgstr "Contour Zone"
@ -3874,13 +3882,13 @@ msgstr "Pads"
#: pcbnew/class_track.cpp:765 #: pcbnew/class_track.cpp:765
#: pcbnew/zones.cpp:873 #: pcbnew/zones.cpp:873
#: pcbnew/zones_by_polygon.cpp:705 #: pcbnew/zones_by_polygon.cpp:831
#: pcbnew/class_zone.cpp:398 #: pcbnew/class_zone.cpp:432
msgid "NetName" msgid "NetName"
msgstr "NetName" msgstr "NetName"
#: pcbnew/class_track.cpp:770 #: pcbnew/class_track.cpp:770
#: pcbnew/class_zone.cpp:403 #: pcbnew/class_zone.cpp:437
msgid "NetCode" msgid "NetCode"
msgstr "NetCode" msgstr "NetCode"
@ -4433,73 +4441,30 @@ msgid "Delete Current Zone Edges"
msgstr "Effacer contour zone courant" msgstr "Effacer contour zone courant"
#: pcbnew/zones.cpp:871 #: pcbnew/zones.cpp:871
#: pcbnew/zones_by_polygon.cpp:703 #: pcbnew/zones_by_polygon.cpp:829
msgid "No Net" msgid "No Net"
msgstr "No Net" msgstr "No Net"
#: pcbnew/dsn.cpp:456 #: pcbnew/specctra.cpp:1015
msgid "Line length exceeded" #: pcbnew/specctra.cpp:1022
msgstr "Longueur de ligne dépassée"
#: pcbnew/dsn.cpp:518
msgid "'quoted text delimiter'"
msgstr "'delimiteur de texte balisé'"
#: pcbnew/dsn.cpp:524
msgid "'symbol'"
msgstr "'symbole'"
#: pcbnew/dsn.cpp:527
msgid "'number'"
msgstr "'nombre'"
#: pcbnew/dsn.cpp:536
msgid "\"quoted string\""
msgstr "\"chaîne entre quotes\""
#: pcbnew/dsn.cpp:539
msgid "'end of file'"
msgstr "fin de fichier'"
#: pcbnew/dsn.cpp:556
msgid "in file"
msgstr "dans le fichier"
#: pcbnew/dsn.cpp:557
msgid "on line"
msgstr "en ligne"
#: pcbnew/dsn.cpp:558
msgid "at offset"
msgstr "a l'offset"
#: pcbnew/dsn.cpp:597
msgid "String delimiter must be a single character of ', \", or $"
msgstr "Le caractère de délimitation de ligne doit être un seul caractère ', \", or $"
#: pcbnew/dsn.cpp:676
msgid "Un-terminated delimited string"
msgstr "Ligne délimitée non terminée"
#: pcbnew/specctra.cpp:271
#: pcbnew/specctra.cpp:280
msgid "Expecting" msgid "Expecting"
msgstr "Attendu" msgstr "Attendu"
#: pcbnew/specctra.cpp:300 #: pcbnew/specctra.cpp:1031
#: pcbnew/specctra.cpp:1038
msgid "Unexpected"
msgstr "Inattendu"
#: pcbnew/specctra.cpp:1059
#: pcbnew/specctra.cpp:1817
#, c-format #, c-format
msgid "Unable to open file \"%s\"" msgid "Unable to open file \"%s\""
msgstr "Ne peut pas ouvrirle fichier \"%s\"" msgstr "Ne peut pas ouvrirle fichier \"%s\""
#: pcbnew/specctra.cpp:401 #: pcbnew/specctra.cpp:1792
#: pcbnew/specctra.cpp:467 #, c-format
#: pcbnew/specctra.cpp:474 msgid "System file error writing to file \"%s\""
msgid "on or off" msgstr "Erreur système sur écriture fichier \"%s\""
msgstr "on ou off"
#: pcbnew/specctra.cpp:452
msgid "testpoint, guides, or image_conductor"
msgstr "testpoint, guides, ou image_conductor"
#: pcbnew/move_or_drag_track.cpp:714 #: pcbnew/move_or_drag_track.cpp:714
msgid "Unable to drag this segment: too many segments connected" msgid "Unable to drag this segment: too many segments connected"
@ -4545,6 +4510,30 @@ msgstr "Erreur. Vous devez choisir une couche"
msgid "Error : you must choose a net name" msgid "Error : you must choose a net name"
msgstr "Erreur. Vous devez choisir une équipotentielle" msgstr "Erreur. Vous devez choisir une équipotentielle"
#: pcbnew/dsn.cpp:467
msgid "Line length exceeded"
msgstr "Longueur de ligne dépassée"
#: pcbnew/dsn.cpp:577
msgid "in file"
msgstr "dans le fichier"
#: pcbnew/dsn.cpp:578
msgid "on line"
msgstr "en ligne"
#: pcbnew/dsn.cpp:579
msgid "at offset"
msgstr "a l'offset"
#: pcbnew/dsn.cpp:618
msgid "String delimiter must be a single character of ', \", or $"
msgstr "Le caractère de délimitation de ligne doit être un seul caractère ', \", or $"
#: pcbnew/dsn.cpp:697
msgid "Un-terminated delimited string"
msgstr "Ligne délimitée non terminée"
#: pcbnew/initpcb.cpp:125 #: pcbnew/initpcb.cpp:125
msgid "Current Board will be lost ?" msgid "Current Board will be lost ?"
msgstr "Le C.I. courant sera perdu ?" msgstr "Le C.I. courant sera perdu ?"
@ -4860,11 +4849,11 @@ msgstr "Fichier rapport termin
msgid "DRC Report file" msgid "DRC Report file"
msgstr "Fichier rapport de contrôle DRC:" msgstr "Fichier rapport de contrôle DRC:"
#: pcbnew/class_zone.cpp:411 #: pcbnew/class_zone.cpp:445
msgid "Corners" msgid "Corners"
msgstr "Sommets" msgstr "Sommets"
#: pcbnew/class_zone.cpp:415 #: pcbnew/class_zone.cpp:449
msgid "Hatch lines" msgid "Hatch lines"
msgstr "Lignes de Hachure" msgstr "Lignes de Hachure"

View File

@ -150,6 +150,11 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
case TYPEZONE_CONTAINER: case TYPEZONE_CONTAINER:
text = _( "Zone Outline" ); text = _( "Zone Outline" );
{
ZONE_CONTAINER* area = (ZONE_CONTAINER*) this;
int ncont = area->m_Poly->GetContour(area->m_CornerSelection);
if ( ncont ) text << wxT(" ") << _("(Cutout)");
}
text << wxT( " " ); text << wxT( " " );
{ {
wxString TimeStampText; wxString TimeStampText;

View File

@ -331,6 +331,7 @@ int ZONE_CONTAINER::HitTestForCorner( const wxPoint& refPos )
int dist; int dist;
unsigned item_pos, lim; unsigned item_pos, lim;
lim = m_Poly->corner.size(); lim = m_Poly->corner.size();
m_CornerSelection = -1;
// Min distance to hit = MIN_DIST_IN_PIXELS pixels : // Min distance to hit = MIN_DIST_IN_PIXELS pixels :
WinEDA_BasePcbFrame* frame = ((BOARD*)GetParent())->m_PcbFrame; WinEDA_BasePcbFrame* frame = ((BOARD*)GetParent())->m_PcbFrame;
@ -340,7 +341,10 @@ int ZONE_CONTAINER::HitTestForCorner( const wxPoint& refPos )
{ {
dist = abs( m_Poly->corner[item_pos].x - refPos.x ) + abs( m_Poly->corner[item_pos].y - refPos.y ); dist = abs( m_Poly->corner[item_pos].x - refPos.x ) + abs( m_Poly->corner[item_pos].y - refPos.y );
if( dist <= min_dist ) if( dist <= min_dist )
{
m_CornerSelection = item_pos;
return item_pos; return item_pos;
}
} }
return -1; return -1;
@ -366,6 +370,7 @@ int ZONE_CONTAINER::HitTestForEdge( const wxPoint& refPos )
/* Test for an entire segment */ /* Test for an entire segment */
unsigned first_corner_pos = 0, end_segm; unsigned first_corner_pos = 0, end_segm;
m_CornerSelection = -1;
for ( item_pos = 0; item_pos < lim; item_pos++ ) for ( item_pos = 0; item_pos < lim; item_pos++ )
{ {
@ -389,7 +394,10 @@ int ZONE_CONTAINER::HitTestForEdge( const wxPoint& refPos )
m_Poly->corner[end_segm].x, m_Poly->corner[end_segm].x,
m_Poly->corner[end_segm].y ); m_Poly->corner[end_segm].y );
if( dist <= min_dist ) if( dist <= min_dist )
{
m_CornerSelection = item_pos;
return item_pos; return item_pos;
}
} }
return -1; return -1;
@ -407,6 +415,9 @@ void ZONE_CONTAINER::Display_Infos( WinEDA_DrawFrame* frame )
msg = _( "Zone Outline" ); msg = _( "Zone Outline" );
int ncont = m_Poly->GetContour(m_CornerSelection);
if ( ncont ) msg << wxT(" ") << _("(Cutout)");
text_pos = 1; text_pos = 1;
Affiche_1_Parametre( frame, text_pos, _( "Type" ), msg, DARKCYAN ); Affiche_1_Parametre( frame, text_pos, _( "Type" ), msg, DARKCYAN );

View File

@ -441,7 +441,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
if( GetCurItem() == NULL ) if( GetCurItem() == NULL )
break; break;
Delete_Zone( &dc, (SEGZONE*) GetCurItem() ); Delete_Zone_Fill( &dc, (SEGZONE*) GetCurItem() );
SetCurItem( NULL ); SetCurItem( NULL );
break; break;
@ -460,15 +460,11 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event )
break; break;
case ID_POPUP_PCB_DELETE_ZONE_CONTAINER: case ID_POPUP_PCB_DELETE_ZONE_CONTAINER:
{ case ID_POPUP_PCB_DELETE_ZONE_CUTOUT:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ZONE_CONTAINER * zone_cont = (ZONE_CONTAINER*)GetCurItem(); Delete_Zone_Contour( &dc, (ZONE_CONTAINER*)GetCurItem() );
zone_cont->Draw(DrawPanel,&dc, wxPoint(0,0), GR_XOR);
Delete_Zone( &dc, NULL, zone_cont->m_TimeStamp );
m_Pcb->Delete( zone_cont );
SetCurItem( NULL ); SetCurItem( NULL );
break; break;
}
case ID_POPUP_PCB_DELETE_ZONE_CORNER: case ID_POPUP_PCB_DELETE_ZONE_CORNER:
Remove_Zone_Corner( &dc, (ZONE_CONTAINER*)GetCurItem() ); Remove_Zone_Corner( &dc, (ZONE_CONTAINER*)GetCurItem() );
@ -1010,7 +1006,7 @@ void WinEDA_PcbFrame::RemoveStruct( BOARD_ITEM* Item, wxDC* DC )
break; break;
case TYPEZONE: case TYPEZONE:
Delete_Zone( DC, (SEGZONE*) Item ); Delete_Zone_Fill( DC, (SEGZONE*) Item );
break; break;
case TYPEMARKER: case TYPEMARKER:

View File

@ -639,37 +639,42 @@ void WinEDA_PcbFrame::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu
} }
else else
{ {
edge_zone->m_CornerSelection = -1; wxMenu * zones_menu = new wxMenu();
ADD_MENUITEM_WITH_SUBMENU( aPopMenu, zones_menu,
-1, _( "Zones" ), add_zone_xpm );
int index; int index;
if( ( index = edge_zone->HitTestForCorner( GetScreen()->m_Curseur ) ) >= 0 ) if( ( index = edge_zone->HitTestForCorner( GetScreen()->m_Curseur ) ) >= 0 )
{ {
edge_zone->m_CornerSelection = index; ADD_MENUITEM( zones_menu, ID_POPUP_PCB_MOVE_ZONE_CORNER,
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_MOVE_ZONE_CORNER,
_( "Move Corner" ), move_xpm ); _( "Move Corner" ), move_xpm );
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_DELETE_ZONE_CORNER, ADD_MENUITEM( zones_menu, ID_POPUP_PCB_DELETE_ZONE_CORNER,
_( "Delete Corner" ), delete_xpm ); _( "Delete Corner" ), delete_xpm );
} }
else if( ( index = edge_zone->HitTestForEdge( GetScreen()->m_Curseur ) ) >= 0 ) else if( ( index = edge_zone->HitTestForEdge( GetScreen()->m_Curseur ) ) >= 0 )
{ {
edge_zone->m_CornerSelection = index; ADD_MENUITEM( zones_menu, ID_POPUP_PCB_ADD_ZONE_CORNER,
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_ADD_ZONE_CORNER,
_( "Create Corner" ), Add_Corner_xpm ); _( "Create Corner" ), Add_Corner_xpm );
} }
aPopMenu->AppendSeparator(); zones_menu->AppendSeparator();
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_ZONE_ADD_SIMILAR_ZONE, ADD_MENUITEM( zones_menu, ID_POPUP_PCB_ZONE_ADD_SIMILAR_ZONE,
_( "Add Similar Zone" ), add_zone_xpm ); _( "Add Similar Zone" ), add_zone_xpm );
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_ZONE_ADD_CUTOUT_ZONE, ADD_MENUITEM( zones_menu, ID_POPUP_PCB_ZONE_ADD_CUTOUT_ZONE,
_( "Add Cutout Area" ), add_zone_cutout ); _( "Add Cutout Area" ), add_zone_cutout );
aPopMenu->AppendSeparator(); zones_menu->AppendSeparator();
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_FILL_ZONE, ADD_MENUITEM( zones_menu, ID_POPUP_PCB_FILL_ZONE,
_( "Fill Zone" ), fill_zone_xpm ); _( "Fill Zone" ), fill_zone_xpm );
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_EDIT_ZONE_PARAMS, ADD_MENUITEM( zones_menu, ID_POPUP_PCB_EDIT_ZONE_PARAMS,
_( "Edit Zone Params" ), edit_xpm ); _( "Edit Zone Params" ), edit_xpm );
ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_DELETE_ZONE_CONTAINER,
if ( index >= 0 && edge_zone->m_Poly->IsCutoutContour( edge_zone->m_CornerSelection ) )
ADD_MENUITEM( zones_menu, ID_POPUP_PCB_DELETE_ZONE_CUTOUT,
_( "Delete Cutout" ), delete_xpm );
ADD_MENUITEM( zones_menu, ID_POPUP_PCB_DELETE_ZONE_CONTAINER,
_( "Delete Zone Outline" ), delete_xpm ); _( "Delete Zone Outline" ), delete_xpm );
} }
} }

View File

@ -48,7 +48,7 @@ int ZONE_CONTAINER::Fill_Zone( WinEDA_PcbFrame* frame, wxDC* DC, bool verbose )
s_TimeStamp = m_TimeStamp; s_TimeStamp = m_TimeStamp;
// Delete the old filling, if any : // Delete the old filling, if any :
frame->Delete_Zone( DC, NULL, m_TimeStamp ); frame->Delete_Zone_Fill( DC, NULL, m_TimeStamp );
// calculate the fixed step of the routing matrix as 5 mils or more // calculate the fixed step of the routing matrix as 5 mils or more
E_scale = g_GridRoutingSize / 50; E_scale = g_GridRoutingSize / 50;

View File

@ -104,11 +104,11 @@ void WinEDA_PcbFrame::Add_Zone_Cutout( wxDC* DC, ZONE_CONTAINER* zone_container
/*****************************************************************************/ /*****************************************************************************/
void WinEDA_PcbFrame::Delete_Zone( wxDC* DC, SEGZONE* aZone, long aTimestamp ) void WinEDA_PcbFrame::Delete_Zone_Fill( wxDC* DC, SEGZONE* aZone, long aTimestamp )
/******************************************************************************/ /******************************************************************************/
/** Function Delete_Zone /** Function Delete_Zone_Fill
* Remove the zone which include the segment aZone, or the zone which have the given time stamp. * Remove the zone fillig which include the segment aZone, or the zone which have the given time stamp.
* A zone is a group of segments which have the same TimeStamp * A zone is a group of segments which have the same TimeStamp
* @param DC = current Device Context (can be NULL) * @param DC = current Device Context (can be NULL)
* @param aZone = zone segment within the zone to delete. Can be NULL * @param aZone = zone segment within the zone to delete. Can be NULL
@ -257,14 +257,13 @@ void WinEDA_PcbFrame::Start_Move_Zone_Corner( wxDC* DC, ZONE_CONTAINER* zone_con
*/ */
{ {
/* Show the Net */ /* Show the Net */
if( (g_HightLigth_NetCode > 0) && (g_HightLigth_NetCode != s_NetcodeSelection) ) if( g_HightLigt_Status )
{ {
Hight_Light( DC ); // Remove old hightlight selection Hight_Light( DC ); // Remove old hightlight selection
} }
g_HightLigth_NetCode = s_NetcodeSelection; g_HightLigth_NetCode = s_NetcodeSelection = zone_container->GetNet();
if( !g_HightLigt_Status ) Hight_Light( DC );
Hight_Light( DC );
zone_container->m_Flags = IN_EDIT; zone_container->m_Flags = IN_EDIT;
DrawPanel->ManageCurseur = Show_Zone_Corner_While_Move_Mouse; DrawPanel->ManageCurseur = Show_Zone_Corner_While_Move_Mouse;
@ -327,7 +326,7 @@ void WinEDA_PcbFrame::Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER * zone_contai
{ {
if ( zone_container->m_Poly->GetNumCorners() <= 3 ) if ( zone_container->m_Poly->GetNumCorners() <= 3 )
{ {
Delete_Zone( DC, NULL, zone_container->m_TimeStamp ); Delete_Zone_Fill( DC, NULL, zone_container->m_TimeStamp );
m_Pcb->Delete( zone_container ); m_Pcb->Delete( zone_container );
return; return;
} }
@ -466,7 +465,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
s_Zone_Hatching = s_CurrentZone->m_Poly->GetHatchStyle(); s_Zone_Hatching = s_CurrentZone->m_Poly->GetHatchStyle();
} }
/* Show the Net */ /* Show the Net */
if( (g_HightLigth_NetCode > 0) && (g_HightLigth_NetCode != s_NetcodeSelection) ) if( g_HightLigt_Status && (g_HightLigth_NetCode != s_NetcodeSelection) )
{ {
Hight_Light( DC ); // Remove old hightlight selection Hight_Light( DC ); // Remove old hightlight selection
} }
@ -474,8 +473,7 @@ EDGE_ZONE* WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
if( s_CurrentZone ) if( s_CurrentZone )
s_NetcodeSelection = s_CurrentZone->GetNet(); s_NetcodeSelection = s_CurrentZone->GetNet();
g_HightLigth_NetCode = s_NetcodeSelection; g_HightLigth_NetCode = s_NetcodeSelection;
if( !g_HightLigt_Status ) Hight_Light( DC );
Hight_Light( DC );
if( !s_AddCutoutToCurrentZone ) if( !s_AddCutoutToCurrentZone )
s_CurrentZone = NULL; // the zone is used only once s_CurrentZone = NULL; // the zone is used only once
@ -742,6 +740,39 @@ void WinEDA_PcbFrame::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* zone_container
GetScreen()->SetModify(); GetScreen()->SetModify();
} }
/************************************************************************************/
void WinEDA_PcbFrame::Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* zone_container )
/************************************************************************************/
/** Function Delete_Zone_Contour
* Remove the zone which include the segment aZone, or the zone which have the given time stamp.
* A zone is a group of segments which have the same TimeStamp
* @param DC = current Device Context (can be NULL)
* @param zone_container = zone to modify
* the member .m_CornerSelection is used to find the outline to remove.
* if the outline is the main outline, all the zone_container is removed (deleted)
* otherwise, the hole is deleted
*/
{
int ncont = zone_container->m_Poly->GetContour(zone_container->m_CornerSelection);
if ( DC )
zone_container->Draw(DrawPanel, DC, wxPoint(0,0), GR_XOR);
Delete_Zone_Fill( DC, NULL, zone_container->m_TimeStamp ); // Remove fill segments
if ( ncont == 0 ) // This is the main outline: remove all
m_Pcb->Delete( zone_container );
else
{
zone_container->m_Poly->RemoveContour( ncont );
if ( DC )
zone_container->Draw(DrawPanel, DC, wxPoint(0,0), GR_OR);
}
GetScreen()->SetModify();
}
/***************************************************************************************/ /***************************************************************************************/
int WinEDA_PcbFrame::Fill_Zone( wxDC* DC, ZONE_CONTAINER* zone_container, bool verbose ) int WinEDA_PcbFrame::Fill_Zone( wxDC* DC, ZONE_CONTAINER* zone_container, bool verbose )
@ -770,13 +801,13 @@ int WinEDA_PcbFrame::Fill_Zone( wxDC* DC, ZONE_CONTAINER* zone_container, bool v
/* Show the Net */ /* Show the Net */
s_NetcodeSelection = zone_container->GetNet(); s_NetcodeSelection = zone_container->GetNet();
if( (g_HightLigth_NetCode > 0) && (g_HightLigth_NetCode != s_NetcodeSelection) && DC ) if( g_HightLigt_Status && (g_HightLigth_NetCode != s_NetcodeSelection) && DC )
{ {
Hight_Light( DC ); // Remove old hightlight selection Hight_Light( DC ); // Remove old hightlight selection
} }
g_HightLigth_NetCode = s_NetcodeSelection; g_HightLigth_NetCode = s_NetcodeSelection;
if( !g_HightLigt_Status && DC ) if( DC )
Hight_Light( DC ); Hight_Light( DC );
if( g_HightLigth_NetCode > 0 ) if( g_HightLigth_NetCode > 0 )

View File

@ -20,12 +20,6 @@ bool bDontShowIntersectionArcsWarning;
bool bDontShowIntersectionWarning; bool bDontShowIntersectionWarning;
#define poly m_Poly
// carea: describes a copper area
#define carea ZONE_CONTAINER
/** /**
* Function AddArea * Function AddArea
* add empty copper area to net * add empty copper area to net
@ -69,7 +63,7 @@ ZONE_CONTAINER* BOARD::InsertArea( int netcode, int iarea, int layer, int x, int
else else
m_ZoneDescriptorList.push_back( new_area ); m_ZoneDescriptorList.push_back( new_area );
new_area->poly->Start( layer, 1, 10 * NM_PER_MIL, x, y, new_area->m_Poly->Start( layer, 1, 10 * NM_PER_MIL, x, y,
hatch ); hatch );
return new_area; return new_area;
} }
@ -85,9 +79,9 @@ ZONE_CONTAINER* BOARD::InsertArea( int netcode, int iarea, int layer, int x, int
*/ */
int BOARD::CompleteArea( ZONE_CONTAINER* area_to_complete, int style ) int BOARD::CompleteArea( ZONE_CONTAINER* area_to_complete, int style )
{ {
if( area_to_complete->poly->GetNumCorners() > 2 ) if( area_to_complete->m_Poly->GetNumCorners() > 2 )
{ {
area_to_complete->poly->Close( style ); area_to_complete->m_Poly->Close( style );
return 1; return 1;
} }
else else
@ -111,7 +105,7 @@ int BOARD::CompleteArea( ZONE_CONTAINER* area_to_complete, int style )
*/ */
int BOARD::TestAreaPolygon( ZONE_CONTAINER* CurrArea ) int BOARD::TestAreaPolygon( ZONE_CONTAINER* CurrArea )
{ {
CPolyLine* p = CurrArea->poly; CPolyLine* p = CurrArea->m_Poly;
// first, check for sides intersecting other sides, especially arcs // first, check for sides intersecting other sides, especially arcs
bool bInt = false; bool bInt = false;
@ -234,7 +228,7 @@ int BOARD::TestAreaPolygon( ZONE_CONTAINER* CurrArea )
int BOARD::ClipAreaPolygon( ZONE_CONTAINER* CurrArea, int BOARD::ClipAreaPolygon( ZONE_CONTAINER* CurrArea,
bool bMessageBoxArc, bool bMessageBoxInt, bool bRetainArcs ) bool bMessageBoxArc, bool bMessageBoxInt, bool bRetainArcs )
{ {
CPolyLine* p = CurrArea->poly; CPolyLine* p = CurrArea->m_Poly;
int test = TestAreaPolygon( CurrArea ); // this sets utility2 flag int test = TestAreaPolygon( CurrArea ); // this sets utility2 flag
if( test == -1 && !bRetainArcs ) if( test == -1 && !bRetainArcs )
@ -284,7 +278,7 @@ int BOARD::ClipAreaPolygon( ZONE_CONTAINER* CurrArea,
{ {
std::vector<CPolyLine*> * pa = new std::vector<CPolyLine*>; std::vector<CPolyLine*> * pa = new std::vector<CPolyLine*>;
p->Undraw(); p->Undraw();
int n_poly = CurrArea->poly->NormalizeWithGpc( pa, bRetainArcs ); int n_poly = CurrArea->m_Poly->NormalizeWithGpc( pa, bRetainArcs );
if( n_poly > 1 ) // i.e if clippinf has created some polygons, we must add these new copper areas if( n_poly > 1 ) // i.e if clippinf has created some polygons, we must add these new copper areas
{ {
for( int ip = 1; ip < n_poly; ip++ ) for( int ip = 1; ip < n_poly; ip++ )
@ -295,9 +289,9 @@ int BOARD::ClipAreaPolygon( ZONE_CONTAINER* CurrArea,
// remove the poly that was automatically created for the new area // remove the poly that was automatically created for the new area
// and replace it with a poly from NormalizeWithGpc // and replace it with a poly from NormalizeWithGpc
delete CurrArea->poly; delete CurrArea->m_Poly;
CurrArea->poly = new_p; CurrArea->m_Poly = new_p;
CurrArea->poly->Draw(); CurrArea->m_Poly->Draw();
CurrArea->utility = 1; CurrArea->utility = 1;
} }
} }
@ -368,15 +362,15 @@ int BOARD::CombineAllAreasInNet( int aNetCode, bool bMessageBox, bool bUseUtilit
continue; continue;
// legal polygon // legal polygon
CRect b1 = curr_area->poly->GetCornerBounds(); CRect b1 = curr_area->m_Poly->GetCornerBounds();
bool mod_ia1 = false; bool mod_ia1 = false;
for( unsigned ia2 = m_ZoneDescriptorList.size() - 1; ia2 > ia1; ia2-- ) for( unsigned ia2 = m_ZoneDescriptorList.size() - 1; ia2 > ia1; ia2-- )
{ {
ZONE_CONTAINER* area2 = m_ZoneDescriptorList[ia2]; ZONE_CONTAINER* area2 = m_ZoneDescriptorList[ia2];
if( curr_area->poly->GetLayer() == area2->poly->GetLayer() if( curr_area->GetLayer() == area2->GetLayer()
&& curr_area->utility2 != -1 && area2->utility2 != -1 ) && curr_area->utility2 != -1 && area2->utility2 != -1 )
{ {
CRect b2 = area2->poly->GetCornerBounds(); CRect b2 = area2->m_Poly->GetCornerBounds();
if( !( b1.left > b2.right || b1.right < b2.left if( !( b1.left > b2.right || b1.right < b2.left
|| b1.bottom > b2.top || b1.top < b2.bottom ) ) || b1.bottom > b2.top || b1.top < b2.bottom ) )
{ {
@ -443,7 +437,7 @@ int BOARD::CombineAllAreasInNet( int aNetCode, bool bMessageBox, bool bUseUtilit
*/ */
bool BOARD::TestAreaIntersections( ZONE_CONTAINER* area_to_test ) bool BOARD::TestAreaIntersections( ZONE_CONTAINER* area_to_test )
{ {
CPolyLine* poly1 = area_to_test->poly; CPolyLine* poly1 = area_to_test->m_Poly;
for( unsigned ia2 = 0; ia2 < m_ZoneDescriptorList.size(); ia2++ ) for( unsigned ia2 = 0; ia2 < m_ZoneDescriptorList.size(); ia2++ )
{ {
@ -456,7 +450,7 @@ bool BOARD::TestAreaIntersections( ZONE_CONTAINER* area_to_test )
if( area_to_test->GetLayer() != area2->GetLayer() ) if( area_to_test->GetLayer() != area2->GetLayer() )
continue; continue;
CPolyLine* poly2 = area2->poly; CPolyLine* poly2 = area2->m_Poly;
// test bounding rects // test bounding rects
CRect b1 = poly1->GetCornerBounds(); CRect b1 = poly1->GetCornerBounds();
@ -488,7 +482,7 @@ bool BOARD::TestAreaIntersections( ZONE_CONTAINER* area_to_test )
yf1 = poly1->GetY( is1 ); yf1 = poly1->GetY( is1 );
} }
style1 = poly1->GetSideStyle( ic1 ); style1 = poly1->GetSideStyle( ic1 );
for( int icont2 = 0; icont2<poly2->GetNumContours(); icont2++ ) for( int icont2 = 0; icont2 < poly2->GetNumContours(); icont2++ )
{ {
int is2 = poly2->GetContourStart( icont2 ); int is2 = poly2->GetContourStart( icont2 );
int ie2 = poly2->GetContourEnd( icont2 ); int ie2 = poly2->GetContourEnd( icont2 );
@ -539,8 +533,8 @@ int BOARD::TestAreaIntersection( ZONE_CONTAINER* area_ref, ZONE_CONTAINER* area_
if( area_ref->GetLayer() != area_to_test->GetLayer() ) if( area_ref->GetLayer() != area_to_test->GetLayer() )
return 0; return 0;
CPolyLine* poly1 = area_ref->poly; CPolyLine* poly1 = area_ref->m_Poly;
CPolyLine* poly2 = area_to_test->poly; CPolyLine* poly2 = area_to_test->m_Poly;
// test bounding rects // test bounding rects
CRect b1 = poly1->GetCornerBounds(); CRect b1 = poly1->GetCornerBounds();
@ -647,8 +641,8 @@ int BOARD::CombineAreas( ZONE_CONTAINER* area_ref, ZONE_CONTAINER* area_to_combi
#endif #endif
// polygons intersect, combine them // polygons intersect, combine them
CPolyLine* poly1 = area_ref->poly; CPolyLine* poly1 = area_ref->m_Poly;
CPolyLine* poly2 = area_to_combine->poly; CPolyLine* poly2 = area_to_combine->m_Poly;
std::vector<CArc> arc_array1; std::vector<CArc> arc_array1;
std::vector<CArc> arc_array2; std::vector<CArc> arc_array2;
poly1->MakeGpcPoly( -1, &arc_array1 ); poly1->MakeGpcPoly( -1, &arc_array1 );
@ -747,7 +741,7 @@ void dra_areas( CDlgLog* log, int copper_layers,
// now iterate through all areas // now iterate through all areas
for( int ia = 0; ia<net->nareas; ia++ ) for( int ia = 0; ia<net->nareas; ia++ )
{ {
carea* a = &net->area[ia]; ZONE_CONTAINER* a = &net->area[ia];
// iterate through all nets again // iterate through all nets again
POSITION pos2 = pos; POSITION pos2 = pos;
@ -759,17 +753,17 @@ void dra_areas( CDlgLog* log, int copper_layers,
cnet* net2 = (cnet*) ptr2; cnet* net2 = (cnet*) ptr2;
for( int ia2 = 0; ia2<net2->nareas; ia2++ ) for( int ia2 = 0; ia2<net2->nareas; ia2++ )
{ {
carea* a2 = &net2->area[ia2]; ZONE_CONTAINER* a2 = &net2->area[ia2];
// test for same layer // test for same layer
if( a->poly->GetLayer() == a2->poly->GetLayer() ) if( a->m_Poly->GetLayer() == a2->m_Poly->GetLayer() )
{ {
// test for points inside one another // test for points inside one another
for( int ic = 0; ic<a->poly->GetNumCorners(); ic++ ) for( int ic = 0; ic<a->m_Poly->GetNumCorners(); ic++ )
{ {
int x = a->poly->GetX( ic ); int x = a->m_Poly->GetX( ic );
int y = a->poly->GetY( ic ); int y = a->m_Poly->GetY( ic );
if( a2->poly->TestPointInside( x, y ) ) if( a2->m_Poly->TestPointInside( x, y ) )
{ {
// COPPERAREA_COPPERAREA error // COPPERAREA_COPPERAREA error
id id_a = net->id; id id_a = net->id;
@ -804,11 +798,11 @@ void dra_areas( CDlgLog* log, int copper_layers,
} }
} }
for( int ic2 = 0; ic2<a2->poly->GetNumCorners(); ic2++ ) for( int ic2 = 0; ic2<a2->m_Poly->GetNumCorners(); ic2++ )
{ {
int x = a2->poly->GetX( ic2 ); int x = a2->m_Poly->GetX( ic2 );
int y = a2->poly->GetY( ic2 ); int y = a2->m_Poly->GetY( ic2 );
if( a->poly->TestPointInside( x, y ) ) if( a->m_Poly->TestPointInside( x, y ) )
{ {
// COPPERAREA_COPPERAREA error // COPPERAREA_COPPERAREA error
id id_a = net2->id; id id_a = net2->id;
@ -841,10 +835,10 @@ void dra_areas( CDlgLog* log, int copper_layers,
} }
// now test spacing between areas // now test spacing between areas
for( int icont = 0; icont<a->poly->GetNumContours(); icont++ ) for( int icont = 0; icont<a->m_Poly->GetNumContours(); icont++ )
{ {
int ic_start = a->poly->GetContourStart( icont ); int ic_start = a->m_Poly->GetContourStart( icont );
int ic_end = a->poly->GetContourEnd( icont ); int ic_end = a->m_Poly->GetContourEnd( icont );
for( int ic = ic_start; ic<=ic_end; ic++ ) for( int ic = ic_start; ic<=ic_end; ic++ )
{ {
id id_a = net->id; id id_a = net->id;
@ -852,24 +846,24 @@ void dra_areas( CDlgLog* log, int copper_layers,
id_a.i = ia; id_a.i = ia;
id_a.sst = ID_SIDE; id_a.sst = ID_SIDE;
id_a.ii = ic; id_a.ii = ic;
int ax1 = a->poly->GetX( ic ); int ax1 = a->m_Poly->GetX( ic );
int ay1 = a->poly->GetY( ic ); int ay1 = a->m_Poly->GetY( ic );
int ax2, ay2; int ax2, ay2;
if( ic == ic_end ) if( ic == ic_end )
{ {
ax2 = a->poly->GetX( ic_start ); ax2 = a->m_Poly->GetX( ic_start );
ay2 = a->poly->GetY( ic_start ); ay2 = a->m_Poly->GetY( ic_start );
} }
else else
{ {
ax2 = a->poly->GetX( ic + 1 ); ax2 = a->m_Poly->GetX( ic + 1 );
ay2 = a->poly->GetY( ic + 1 ); ay2 = a->m_Poly->GetY( ic + 1 );
} }
int astyle = a->poly->GetSideStyle( ic ); int astyle = a->m_Poly->GetSideStyle( ic );
for( int icont2 = 0; icont2<a2->poly->GetNumContours(); icont2++ ) for( int icont2 = 0; icont2<a2->m_Poly->GetNumContours(); icont2++ )
{ {
int ic_start2 = a2->poly->GetContourStart( icont2 ); int ic_start2 = a2->m_Poly->GetContourStart( icont2 );
int ic_end2 = a2->poly->GetContourEnd( icont2 ); int ic_end2 = a2->m_Poly->GetContourEnd( icont2 );
for( int ic2 = ic_start2; ic2<=ic_end2; ic2++ ) for( int ic2 = ic_start2; ic2<=ic_end2; ic2++ )
{ {
id id_b = net2->id; id id_b = net2->id;
@ -877,20 +871,20 @@ void dra_areas( CDlgLog* log, int copper_layers,
id_b.i = ia2; id_b.i = ia2;
id_b.sst = ID_SIDE; id_b.sst = ID_SIDE;
id_b.ii = ic2; id_b.ii = ic2;
int bx1 = a2->poly->GetX( ic2 ); int bx1 = a2->m_Poly->GetX( ic2 );
int by1 = a2->poly->GetY( ic2 ); int by1 = a2->m_Poly->GetY( ic2 );
int bx2, by2; int bx2, by2;
if( ic2 == ic_end2 ) if( ic2 == ic_end2 )
{ {
bx2 = a2->poly->GetX( ic_start2 ); bx2 = a2->m_Poly->GetX( ic_start2 );
by2 = a2->poly->GetY( ic_start2 ); by2 = a2->m_Poly->GetY( ic_start2 );
} }
else else
{ {
bx2 = a2->poly->GetX( ic2 + 1 ); bx2 = a2->m_Poly->GetX( ic2 + 1 );
by2 = a2->poly->GetY( ic2 + 1 ); by2 = a2->m_Poly->GetY( ic2 + 1 );
} }
int bstyle = a2->poly->GetSideStyle( ic2 ); int bstyle = a2->m_Poly->GetSideStyle( ic2 );
int x, y; int x, y;
int d = ::GetClearanceBetweenSegments( bx1, int d = ::GetClearanceBetweenSegments( bx1,
by1, by1,

View File

@ -59,7 +59,7 @@ CPolyLine::~CPolyLine()
// If bRetainArcs == TRUE, try to retain arcs in polys // If bRetainArcs == TRUE, try to retain arcs in polys
// Returns number of external contours, or -1 if error // Returns number of external contours, or -1 if error
// //
int CPolyLine::NormalizeWithGpc( std::vector<CPolyLine*> * pa, BOOL bRetainArcs ) int CPolyLine::NormalizeWithGpc( std::vector<CPolyLine*> * pa, bool bRetainArcs )
{ {
std::vector<CArc> arc_array; std::vector<CArc> arc_array;
@ -495,7 +495,7 @@ int CPolyLine::RestoreArcs( std::vector<CArc> * arc_array, std::vector<CPolyLine
} }
// find arcs and replace them // find arcs and replace them
BOOL bFound; bool bFound;
int arc_start; int arc_start;
int arc_end; int arc_end;
for( unsigned iarc=0; iarc<arc_array->size(); iarc++ ) for( unsigned iarc=0; iarc<arc_array->size(); iarc++ )
@ -637,7 +637,7 @@ void CPolyLine::Start( int layer, int w, int sel_box, int x, int y,
// add a corner to unclosed polyline // add a corner to unclosed polyline
// //
void CPolyLine::AppendCorner( int x, int y, int style, BOOL bDraw ) void CPolyLine::AppendCorner( int x, int y, int style, bool bDraw )
{ {
Undraw(); Undraw();
CPolyPt poly_pt( x, y ); CPolyPt poly_pt( x, y );
@ -663,7 +663,7 @@ void CPolyLine::AppendCorner( int x, int y, int style, BOOL bDraw )
// close last polyline contour // close last polyline contour
// //
void CPolyLine::Close( int style, BOOL bDraw ) void CPolyLine::Close( int style, bool bDraw )
{ {
if( GetClosed() ) if( GetClosed() )
ASSERT(0); ASSERT(0);
@ -686,13 +686,13 @@ void CPolyLine::MoveCorner( int ic, int x, int y )
// delete corner and adjust arrays // delete corner and adjust arrays
// //
void CPolyLine::DeleteCorner( int ic, BOOL bDraw ) void CPolyLine::DeleteCorner( int ic, bool bDraw )
{ {
Undraw(); Undraw();
int icont = GetContour( ic ); int icont = GetContour( ic );
int istart = GetContourStart( icont ); int istart = GetContourStart( icont );
int iend = GetContourEnd( icont ); int iend = GetContourEnd( icont );
BOOL bClosed = icont < GetNumContours()-1 || GetClosed(); bool bClosed = icont < GetNumContours()-1 || GetClosed();
if( !bClosed ) if( !bClosed )
{ {
@ -719,7 +719,14 @@ void CPolyLine::DeleteCorner( int ic, BOOL bDraw )
Draw(); Draw();
} }
/******************************************/
void CPolyLine::RemoveContour( int icont ) void CPolyLine::RemoveContour( int icont )
/******************************************/
/**
* Function RemoveContour
* @param icont = contour number to remove
* remove a contour only if there is more than 1 contour
*/
{ {
Undraw(); Undraw();
int istart = GetContourStart( icont ); int istart = GetContourStart( icont );
@ -733,8 +740,8 @@ void CPolyLine::RemoveContour( int icont )
else if( icont == GetNumContours()-1 ) else if( icont == GetNumContours()-1 )
{ {
// remove last contour // remove last contour
corner.erase( corner.begin() + icont, corner.end() ); corner.erase( corner.begin() + istart, corner.end() );
side_style.erase( side_style.begin() + icont, side_style.end() ); side_style.erase( side_style.begin() + istart, side_style.end() );
} }
else else
{ {
@ -749,7 +756,9 @@ void CPolyLine::RemoveContour( int icont )
} }
/******************************************/
void CPolyLine::RemoveAllContours( void ) void CPolyLine::RemoveAllContours( void )
/******************************************/
/** /**
* function RemoveAllContours * function RemoveAllContours
* removes all corners from the lists. * removes all corners from the lists.
@ -1162,11 +1171,6 @@ int CPolyLine::GetW()
return m_Width; return m_Width;
} }
int CPolyLine::GetSelBoxSize()
{
return m_sel_box;
}
int CPolyLine::GetNumContours() int CPolyLine::GetNumContours()
{ {
int ncont = 0; int ncont = 0;
@ -1462,7 +1466,7 @@ void CPolyLine::Hatch()
// test to see if a point is inside polyline // test to see if a point is inside polyline
// //
BOOL CPolyLine::TestPointInside( int x, int y ) bool CPolyLine::TestPointInside( int x, int y )
{ {
enum { MAXPTS = 100 }; enum { MAXPTS = 100 };
if( !GetClosed() ) if( !GetClosed() )
@ -1538,7 +1542,7 @@ BOOL CPolyLine::TestPointInside( int x, int y )
// test to see if a point is inside polyline contour // test to see if a point is inside polyline contour
// //
BOOL CPolyLine::TestPointInsideContour( int icont, int x, int y ) bool CPolyLine::TestPointInsideContour( int icont, int x, int y )
{ {
if( icont >= GetNumContours() ) if( icont >= GetNumContours() )
return FALSE; return FALSE;
@ -1662,25 +1666,6 @@ int CPolyLine::TestIntersection( CPolyLine * poly )
return 0; return 0;
} }
// set selection box size
//
void CPolyLine::SetSelBoxSize( int sel_box )
{
// Undraw();
m_sel_box = sel_box;
// Draw();
}
// set pointer to display list, and draw into display list
//
void CPolyLine::SetDisplayList( CDisplayList * dl )
{
if( m_dlist )
Undraw();
m_dlist = dl;
if( m_dlist )
Draw();
}
// copy data from another poly, but don't draw it // copy data from another poly, but don't draw it
// //
@ -1701,6 +1686,20 @@ void CPolyLine::Copy( CPolyLine * src )
FreeGpcPoly(); FreeGpcPoly();
} }
/*******************************************/
bool CPolyLine::IsCutoutContour( int icont )
/*******************************************/
/*
* return true if the corner icont is inside the outline (i.e it is a hole)
*/
{
int ncont = GetContour( icont );
if ( ncont == 0 ) // the first contour is the main outline, not an hole
return false;
return true;
}
void CPolyLine::MoveOrigin( int x_off, int y_off ) void CPolyLine::MoveOrigin( int x_off, int y_off )
{ {
Undraw(); Undraw();
@ -1719,7 +1718,11 @@ void CPolyLine::MoveOrigin( int x_off, int y_off )
// //
void CPolyLine::SetX( int ic, int x ) { corner[ic].x = x; } void CPolyLine::SetX( int ic, int x ) { corner[ic].x = x; }
void CPolyLine::SetY( int ic, int y ) { corner[ic].y = y; } void CPolyLine::SetY( int ic, int y ) { corner[ic].y = y; }
void CPolyLine::SetEndContour( int ic, BOOL end_contour ) { corner[ic].end_contour = end_contour; }
void CPolyLine::SetEndContour( int ic, bool end_contour )
{
corner[ic].end_contour = end_contour;
}
// Create CPolyLine for a pad // Create CPolyLine for a pad
// //
@ -1750,7 +1753,7 @@ CPolyLine * CPolyLine::MakePolylineForPad( int type, int x, int y, int w, int l,
// //
void CPolyLine::AddContourForPadClearance( int type, int x, int y, int w, void CPolyLine::AddContourForPadClearance( int type, int x, int y, int w,
int l, int r, int angle, int fill_clearance, int l, int r, int angle, int fill_clearance,
int hole_w, int hole_clearance, BOOL bThermal, int spoke_w ) int hole_w, int hole_clearance, bool bThermal, int spoke_w )
{ {
int dx = l/2; int dx = l/2;
int dy = w/2; int dy = w/2;

View File

@ -46,17 +46,17 @@ public:
int style; int style;
int xi, yi, xf, yf; int xi, yi, xf, yf;
int n_steps; // number of straight-line segments in gpc_poly int n_steps; // number of straight-line segments in gpc_poly
BOOL bFound; bool bFound;
}; };
class CPolyPt class CPolyPt
{ {
public: public:
CPolyPt( int qx=0, int qy=0, BOOL qf=FALSE ) CPolyPt( int qx=0, int qy=0, bool qf=FALSE )
{ x=qx; y=qy; end_contour=qf; utility = 0; }; { x=qx; y=qy; end_contour=qf; utility = 0; };
int x; int x;
int y; int y;
BOOL end_contour; bool end_contour;
int utility; int utility;
}; };
@ -75,11 +75,11 @@ public:
// functions for modifying polyline // functions for modifying polyline
void Start( int layer, int w, int sel_box, int x, int y, void Start( int layer, int w, int sel_box, int x, int y,
int hatch ); int hatch );
void AppendCorner( int x, int y, int style = STRAIGHT, BOOL bDraw=TRUE ); void AppendCorner( int x, int y, int style = STRAIGHT, bool bDraw=TRUE );
void InsertCorner( int ic, int x, int y ); void InsertCorner( int ic, int x, int y );
void DeleteCorner( int ic, BOOL bDraw=TRUE ); void DeleteCorner( int ic, bool bDraw=TRUE );
void MoveCorner( int ic, int x, int y ); void MoveCorner( int ic, int x, int y );
void Close( int style = STRAIGHT, BOOL bDraw=TRUE ); void Close( int style = STRAIGHT, bool bDraw=TRUE );
void RemoveContour( int icont ); void RemoveContour( int icont );
void RemoveAllContours( void ); void RemoveAllContours( void );
@ -93,7 +93,7 @@ public:
void Undraw(); void Undraw();
void Draw( CDisplayList * dl = NULL ); void Draw( CDisplayList * dl = NULL );
void Hatch(); void Hatch();
void MakeVisible( BOOL visible = TRUE ); void MakeVisible( bool visible = TRUE );
void MoveOrigin( int x_off, int y_off ); void MoveOrigin( int x_off, int y_off );
// misc. functions // misc. functions
@ -101,8 +101,9 @@ public:
CRect GetCornerBounds(); CRect GetCornerBounds();
CRect GetCornerBounds( int icont ); CRect GetCornerBounds( int icont );
void Copy( CPolyLine * src ); void Copy( CPolyLine * src );
BOOL TestPointInside( int x, int y ); bool TestPointInside( int x, int y );
BOOL TestPointInsideContour( int icont, int x, int y ); bool TestPointInsideContour( int icont, int x, int y );
bool IsCutoutContour( int icont );
int TestIntersection( CPolyLine * poly ); int TestIntersection( CPolyLine * poly );
void AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int num ); void AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int num );
@ -124,30 +125,25 @@ public:
void SetUtility( int ic, int utility ){ corner[ic].utility = utility; }; void SetUtility( int ic, int utility ){ corner[ic].utility = utility; };
int GetW(); int GetW();
int GetSideStyle( int is ); int GetSideStyle( int is );
id GetId();
int GetSelBoxSize();
CDisplayList * GetDisplayList(){ return m_dlist; };
int GetHatchStyle(){ return m_HatchStyle; } int GetHatchStyle(){ return m_HatchStyle; }
void SetHatch( int hatch ){ Undraw(); m_HatchStyle = hatch; Draw(); }; void SetHatch( int hatch ){ Undraw(); m_HatchStyle = hatch; Draw(); };
void SetX( int ic, int x ); void SetX( int ic, int x );
void SetY( int ic, int y ); void SetY( int ic, int y );
void SetEndContour( int ic, BOOL end_contour ); void SetEndContour( int ic, bool end_contour );
// void SetLayer( int layer ); // void SetLayer( int layer );
void SetW( int w ); void SetW( int w );
void SetSideStyle( int is, int style ); void SetSideStyle( int is, int style );
void SetSelBoxSize( int sel_box );
void SetDisplayList( CDisplayList * dl );
// GPC functions // GPC functions
int MakeGpcPoly( int icontour=0, std::vector<CArc> * arc_array=NULL ); int MakeGpcPoly( int icontour=0, std::vector<CArc> * arc_array=NULL );
int FreeGpcPoly(); int FreeGpcPoly();
gpc_polygon * GetGpcPoly(){ return m_gpc_poly; }; gpc_polygon * GetGpcPoly(){ return m_gpc_poly; };
int NormalizeWithGpc( std::vector<CPolyLine*> * pa=NULL, BOOL bRetainArcs=FALSE ); int NormalizeWithGpc( std::vector<CPolyLine*> * pa=NULL, bool bRetainArcs=FALSE );
int RestoreArcs( std::vector<CArc> * arc_array, std::vector<CPolyLine*> * pa=NULL ); int RestoreArcs( std::vector<CArc> * arc_array, std::vector<CPolyLine*> * pa=NULL );
CPolyLine * MakePolylineForPad( int type, int x, int y, int w, int l, int r, int angle ); CPolyLine * MakePolylineForPad( int type, int x, int y, int w, int l, int r, int angle );
void AddContourForPadClearance( int type, int x, int y, int w, void AddContourForPadClearance( int type, int x, int y, int w,
int l, int r, int angle, int fill_clearance, int l, int r, int angle, int fill_clearance,
int hole_w, int hole_clearance, BOOL bThermal=FALSE, int spoke_w=0 ); int hole_w, int hole_clearance, bool bThermal=FALSE, int spoke_w=0 );
void ClipGpcPolygon( gpc_op op, CPolyLine * poly ); void ClipGpcPolygon( gpc_op op, CPolyLine * poly );
// PHP functions // PHP functions
@ -174,7 +170,7 @@ public:
private: private:
gpc_polygon * m_gpc_poly; // polygon in gpc format gpc_polygon * m_gpc_poly; // polygon in gpc format
polygon * m_php_poly; polygon * m_php_poly;
BOOL bDrawn; bool bDrawn;
}; };
#endif // #ifndef POLYLINE_H #endif // #ifndef POLYLINE_H

View File

@ -31,31 +31,6 @@ enum
PAD_OCTAGON PAD_OCTAGON
}; };
/*
enum
{
// visible layers
LAY_SELECTION = 0,
LAY_BACKGND,
LAY_VISIBLE_GRID,
LAY_HILITE,
LAY_DRC_ERROR,
LAY_BOARD_OUTLINE,
LAY_RAT_LINE,
LAY_SILK_TOP,
LAY_SILK_BOTTOM,
LAY_SM_TOP,
LAY_SM_BOTTOM,
LAY_PAD_THRU,
LAY_TOP_COPPER,
LAY_BOTTOM_COPPER,
// invisible layers
LAY_MASK_TOP = -100,
LAY_MASK_BOTTOM = -101,
LAY_PASTE_TOP = -102,
LAY_PASTE_BOTTOM = -103
};
*/
#define LAY_SELECTION 0 #define LAY_SELECTION 0
#define LAY_TOP_COPPER 0 #define LAY_TOP_COPPER 0

View File

@ -2,25 +2,10 @@
#include "PolyLine.h" #include "PolyLine.h"
dl_element * CDisplayList::Add( id id, void * ptr, int glayer, int gtype, int visible,
int w, int holew, int x, int y, int xf, int yf, int xo, int yo,
int radius, int orig_layer )
{
return NULL;
}
dl_element * CDisplayList::AddSelector( id id, void * ptr, int glayer, int gtype, int visible,
int w, int holew, int x, int y, int xf, int yf, int xo, int yo, int radius )
{
return NULL;
}
void CDisplayList::Set_visible( dl_element * el, int visible ) void CDisplayList::Set_visible( dl_element * el, int visible )
{ {
} }
int CDisplayList::StopDragging() int CDisplayList::StopDragging()
{ {
return 0; return 0;
@ -31,10 +16,6 @@ int CDisplayList::CancelHighLight()
return 0; return 0;
} }
void CDisplayList::Set_id( dl_element * el, id * id )
{
}
id CDisplayList::Remove( dl_element * element ) id CDisplayList::Remove( dl_element * element )
{ {
return 0; return 0;
@ -83,3 +64,4 @@ int CDisplayList::StartDraggingArc( CDC * pDC, int style, int x, int y, int xi,
{ {
return 0; return 0;
} }

View File

@ -656,10 +656,15 @@ BOOL polygon::isInside( vertex * v )
int winding_number3 = 0; int winding_number3 = 0;
int winding_number4 = 0; int winding_number4 = 0;
//** vertex * point_at_infinity = new vertex(-10000000,v->Y()); // Create point at infinity //** vertex * point_at_infinity = new vertex(-10000000,v->Y()); // Create point at infinity
vertex * point_at_infinity = new vertex(-1000000000,-50000000); // Create point at infinity /* vertex * point_at_infinity = new vertex(-1000000000,-50000000); // Create point at infinity
vertex * point_at_infinity2 = new vertex(1000000000,+50000000); // Create point at infinity vertex * point_at_infinity2 = new vertex(1000000000,+50000000); // Create point at infinity
vertex * point_at_infinity3 = new vertex(500000000,1000000000); // Create point at infinity vertex * point_at_infinity3 = new vertex(500000000,1000000000); // Create point at infinity
vertex * point_at_infinity4 = new vertex(-500000000,1000000000); // Create point at infinity vertex * point_at_infinity4 = new vertex(-500000000,1000000000); // Create point at infinity
*/
vertex point_at_infinity(-1000000000,-50000000); // Create point at infinity
vertex point_at_infinity2(1000000000,+50000000); // Create point at infinity
vertex point_at_infinity3(500000000,1000000000); // Create point at infinity
vertex point_at_infinity4(-500000000,1000000000); // Create point at infinity
vertex * q = m_first; // End vertex of a line segment in polygon vertex * q = m_first; // End vertex of a line segment in polygon
do do
{ {
@ -667,20 +672,20 @@ BOOL polygon::isInside( vertex * v )
{ {
int n; int n;
double x[2], y[2], aP[2], aQ[2]; double x[2], y[2], aP[2], aQ[2];
if( ints( point_at_infinity, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) ) if( ints( &point_at_infinity, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) )
winding_number += n; // Add number of intersections found winding_number += n; // Add number of intersections found
if( ints( point_at_infinity2, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) ) if( ints( &point_at_infinity2, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) )
winding_number2 += n; // Add number of intersections found winding_number2 += n; // Add number of intersections found
if( ints( point_at_infinity3, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) ) if( ints( &point_at_infinity3, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) )
winding_number3 += n; // Add number of intersections found winding_number3 += n; // Add number of intersections found
if( ints( point_at_infinity4, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) ) if( ints( &point_at_infinity4, v, q, nxt(q->Next()), &n, x, y, aP, aQ ) )
winding_number4 += n; // Add number of intersections found winding_number4 += n; // Add number of intersections found
} }
q = q->Next(); q = q->Next();
} }
while( q->id() != m_first->id() ); while( q->id() != m_first->id() );
delete point_at_infinity; // delete point_at_infinity;
delete point_at_infinity2; // delete point_at_infinity2;
if( winding_number%2 != winding_number2%2 if( winding_number%2 != winding_number2%2
|| winding_number3%2 != winding_number4%2 || winding_number3%2 != winding_number4%2
|| winding_number%2 != winding_number3%2 ) || winding_number%2 != winding_number3%2 )