This commit is contained in:
parent
9022898040
commit
ef2e41e347
|
@ -4,6 +4,14 @@ KiCad ChangeLog 2009
|
||||||
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.
|
||||||
|
|
||||||
|
2009-sept-10 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||||
|
================================================================================
|
||||||
|
++pcbnew
|
||||||
|
Work on undo/redo in pcbnew finished.
|
||||||
|
Used kbool V2.0. This version solves some problems in zones calculationsb but not all.
|
||||||
|
The Kbool author, Klaas Holveda, is still working on these problems
|
||||||
|
Thanks to Klaas
|
||||||
|
|
||||||
2009-aug-23 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
2009-aug-23 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||||
================================================================================
|
================================================================================
|
||||||
++pcbnew
|
++pcbnew
|
||||||
|
|
|
@ -185,7 +185,7 @@ int MarkItemsInBloc( EDA_LibComponentStruct* LibComponent,
|
||||||
case COMPONENT_FIELD_DRAW_TYPE:
|
case COMPONENT_FIELD_DRAW_TYPE:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
defualt:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ void WinEDA_LibeditFrame::OnImportPart( wxCommandEvent& event )
|
||||||
wxFileName fn;
|
wxFileName fn;
|
||||||
LibraryStruct* LibTmp;
|
LibraryStruct* LibTmp;
|
||||||
LibCmpEntry* LibEntry;
|
LibCmpEntry* LibEntry;
|
||||||
bool entryLoaded;
|
bool entryLoaded = false;
|
||||||
|
|
||||||
LibItemToRepeat = NULL;
|
LibItemToRepeat = NULL;
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,6 @@ private:
|
||||||
|
|
||||||
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 );
|
||||||
|
@ -262,6 +261,12 @@ public:
|
||||||
* @param aQuery = true to prompt user for confirmation, false to initialize silently
|
* @param aQuery = true to prompt user for confirmation, false to initialize silently
|
||||||
*/
|
*/
|
||||||
bool Clear_Pcb( bool aQuery );
|
bool Clear_Pcb( bool aQuery );
|
||||||
|
|
||||||
|
// Drc control
|
||||||
|
/* function GetDrcController
|
||||||
|
* @return the DRC controller
|
||||||
|
*/
|
||||||
|
DRC* GetDrcController() {return m_drc;} ///< return the DRC controller, see drc.cpp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function RecreateBOMFileFromBoard
|
* Function RecreateBOMFileFromBoard
|
||||||
|
@ -426,8 +431,8 @@ public:
|
||||||
* @param aDC = the current device context (can be NULL)
|
* @param aDC = the current device context (can be NULL)
|
||||||
* @param aNewTrack = the new created track (a pointer to a segment of the track list)
|
* @param aNewTrack = the new created track (a pointer to a segment of the track list)
|
||||||
* @param aNewTrackSegmentsCount = number of segments in this new track
|
* @param aNewTrackSegmentsCount = number of segments in this new track
|
||||||
* @param aItemsListPicker = the list picker to use for an undo command (can be NULL)
|
* @param aItemsListPicker = the list picker to use for an undo command (can be NULL)
|
||||||
*/
|
*/
|
||||||
int EraseRedundantTrack( wxDC* aDC, TRACK* aNewTrack, int aNewTrackSegmentsCount,
|
int EraseRedundantTrack( wxDC* aDC, TRACK* aNewTrack, int aNewTrackSegmentsCount,
|
||||||
PICKED_ITEMS_LIST* aItemsListPicker );
|
PICKED_ITEMS_LIST* aItemsListPicker );
|
||||||
|
|
||||||
|
|
Binary file not shown.
1657
internat/fr/kicad.po
1657
internat/fr/kicad.po
File diff suppressed because it is too large
Load Diff
|
@ -16,13 +16,6 @@ set(PCBNEW_SRCS
|
||||||
board.cpp
|
board.cpp
|
||||||
board_undo_redo.cpp
|
board_undo_redo.cpp
|
||||||
build_BOM_from_board.cpp
|
build_BOM_from_board.cpp
|
||||||
# class_board_item.cpp
|
|
||||||
# class_drawsegment.cpp
|
|
||||||
# class_edge_mod.cpp
|
|
||||||
# class_equipot.cpp
|
|
||||||
# class_module.cpp
|
|
||||||
# class_text_mod.cpp
|
|
||||||
# class_track.cpp
|
|
||||||
clean.cpp
|
clean.cpp
|
||||||
# cleaningoptions_dialog.cpp
|
# cleaningoptions_dialog.cpp
|
||||||
connect.cpp
|
connect.cpp
|
||||||
|
@ -30,6 +23,7 @@ set(PCBNEW_SRCS
|
||||||
# copy_track.cpp <-- not used
|
# copy_track.cpp <-- not used
|
||||||
cotation.cpp
|
cotation.cpp
|
||||||
cross-probing.cpp
|
cross-probing.cpp
|
||||||
|
debug_kbool_key_file_fct.cpp
|
||||||
deltrack.cpp
|
deltrack.cpp
|
||||||
dialog_copper_zones.cpp
|
dialog_copper_zones.cpp
|
||||||
dialog_copper_zones_base.cpp
|
dialog_copper_zones_base.cpp
|
||||||
|
@ -140,7 +134,6 @@ set(PCBNEW_SRCS
|
||||||
tool_modedit.cpp
|
tool_modedit.cpp
|
||||||
tool_onrightclick.cpp
|
tool_onrightclick.cpp
|
||||||
tool_pcb.cpp
|
tool_pcb.cpp
|
||||||
# tracemod.cpp
|
|
||||||
tracepcb.cpp
|
tracepcb.cpp
|
||||||
track.cpp
|
track.cpp
|
||||||
tr_modif.cpp
|
tr_modif.cpp
|
||||||
|
|
|
@ -52,6 +52,7 @@ public:
|
||||||
* from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole (they are all in one piece)
|
* from outlines (m_Poly) but unlike m_Poly these filled polygons have no hole (they are all in one piece)
|
||||||
* In very simple cases m_FilledPolysList is same as m_Poly
|
* In very simple cases m_FilledPolysList is same as m_Poly
|
||||||
* In less simple cases (when m_Poly has holes) m_FilledPolysList is a polygon equivalent to m_Poly, without holes
|
* In less simple cases (when m_Poly has holes) m_FilledPolysList is a polygon equivalent to m_Poly, without holes
|
||||||
|
* but with extra outline segment connecting "holes" with external main outline
|
||||||
* In complex cases an ouline decribed by m_Poly can have many filled areas
|
* In complex cases an ouline decribed by m_Poly can have many filled areas
|
||||||
*/
|
*/
|
||||||
std::vector <SEGMENT> m_FillSegmList; /* set of segments used to fill area, when fill zone by segment is used.
|
std::vector <SEGMENT> m_FillSegmList; /* set of segments used to fill area, when fill zone by segment is used.
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
/* file debug_kbool_key_file_fct.cpp
|
||||||
|
*/
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "fctsys.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "pcbnew.h"
|
||||||
|
#include "wxPcbStruct.h"
|
||||||
|
#include "zones.h"
|
||||||
|
#include "PolyLine.h"
|
||||||
|
|
||||||
|
#include "debug_kbool_key_file_fct.h"
|
||||||
|
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
|
||||||
|
static FILE* kdebugFile;
|
||||||
|
static const char * sDate_Time = "2009-09-07 15:59:24";
|
||||||
|
|
||||||
|
|
||||||
|
void CreateKeyFile()
|
||||||
|
{
|
||||||
|
kdebugFile = fopen( KEYFILE_FILENAME, "wt" );
|
||||||
|
if( kdebugFile )
|
||||||
|
{
|
||||||
|
fprintf( kdebugFile, "# KEY file for GDS-II postprocessing tool\n" );
|
||||||
|
fprintf( kdebugFile, "# File = %s\n", KEYFILE_FILENAME );
|
||||||
|
fprintf( kdebugFile, "# ====================================================================\n");
|
||||||
|
fprintf( kdebugFile, "\nHEADER 5; # version\n");
|
||||||
|
fprintf( kdebugFile, "BGNLIB;\n");
|
||||||
|
|
||||||
|
fprintf( kdebugFile, "LASTMOD {%s}; # last modification time\n",sDate_Time );
|
||||||
|
fprintf( kdebugFile, "LASTACC {%s}; # last access time\n",sDate_Time );
|
||||||
|
|
||||||
|
fprintf( kdebugFile, "LIBNAME trial;\n" );
|
||||||
|
fprintf( kdebugFile, "UNITS;\n# Units are in 0.0001 inch\n" );
|
||||||
|
fprintf( kdebugFile, "USERUNITS 1; PHYSUNITS 0.0001;\n\n" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxMessageBox( wxT( "CreateKeyFile() cannot create output file" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CloseKeyFile()
|
||||||
|
{
|
||||||
|
if( kdebugFile )
|
||||||
|
{
|
||||||
|
fprintf( kdebugFile, "\nENDLIB;\n" );
|
||||||
|
fclose( kdebugFile );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char* sCurrEntityName = NULL;
|
||||||
|
static int s_count;
|
||||||
|
|
||||||
|
void OpenEntity( const char* aName )
|
||||||
|
{
|
||||||
|
if( kdebugFile )
|
||||||
|
{
|
||||||
|
fprintf( kdebugFile, "\nBGNSTR; # Begin of structure\n" );
|
||||||
|
fprintf( kdebugFile, "CREATION {%s}; # creation time\n",sDate_Time);
|
||||||
|
fprintf( kdebugFile, "LASTMOD {%s}; # last modification time\n",sDate_Time);
|
||||||
|
fprintf( kdebugFile, "STRNAME %s;\n", aName );
|
||||||
|
}
|
||||||
|
sCurrEntityName = aName;
|
||||||
|
s_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CloseEntity()
|
||||||
|
{
|
||||||
|
if( kdebugFile )
|
||||||
|
fprintf( kdebugFile, "\nENDSTR %s;\n", sCurrEntityName );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StartPolygon(int aCornersCount, int aLayer)
|
||||||
|
{
|
||||||
|
fprintf( kdebugFile, "\nBOUNDARY; LAYER %d; DATATYPE 0;\n", aLayer );
|
||||||
|
fprintf( kdebugFile, " XY %d;\n", aCornersCount );
|
||||||
|
s_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EndElement()
|
||||||
|
{
|
||||||
|
if ( s_count == 1 )
|
||||||
|
fprintf( kdebugFile, "\n");
|
||||||
|
fprintf( kdebugFile, "\nENDEL;\n" );
|
||||||
|
s_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CopyPolygonsFromFilledPolysListToKeyFile( ZONE_CONTAINER* aZone, int aLayer )
|
||||||
|
{
|
||||||
|
if( !kdebugFile )
|
||||||
|
return;
|
||||||
|
|
||||||
|
unsigned corners_count = aZone->m_FilledPolysList.size();
|
||||||
|
int count = 0;
|
||||||
|
unsigned ic = 0;
|
||||||
|
CPolyPt* corner;
|
||||||
|
|
||||||
|
while( ic < corners_count )
|
||||||
|
{
|
||||||
|
// Count corners:
|
||||||
|
count = 0;
|
||||||
|
for( unsigned ii = ic; ii < corners_count; ii++ )
|
||||||
|
{
|
||||||
|
corner = &aZone->m_FilledPolysList[ii];
|
||||||
|
count++;
|
||||||
|
if( corner->end_contour )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// write corners:
|
||||||
|
StartPolygon( count+1, aLayer );
|
||||||
|
corner = &aZone->m_FilledPolysList[ic];
|
||||||
|
int startpointX = corner->x;
|
||||||
|
int startpointY = corner->y;
|
||||||
|
for( ; ic < corners_count; ic++ )
|
||||||
|
{
|
||||||
|
corner = &aZone->m_FilledPolysList[ic];
|
||||||
|
AddPointXY( corner->x, corner->y );
|
||||||
|
if( corner->end_contour )
|
||||||
|
{
|
||||||
|
ic++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Close polygon:
|
||||||
|
AddPointXY( startpointX, startpointY );
|
||||||
|
EndElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddPointXY( int aXcoord, int aYcoord)
|
||||||
|
{
|
||||||
|
if ( s_count >= 2 )
|
||||||
|
{
|
||||||
|
s_count = 0;
|
||||||
|
fprintf( kdebugFile, "\n");
|
||||||
|
}
|
||||||
|
SetLocaleTo_C_standard();
|
||||||
|
fprintf( kdebugFile, " X %d; Y %d;", aXcoord, aYcoord );
|
||||||
|
SetLocaleTo_Default( );
|
||||||
|
s_count ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,44 @@
|
||||||
|
/* debug_kbool_key_file_fct.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _DEBUG_KBOOL_KEY_FILE_FCT_H_
|
||||||
|
#define _DEBUG_KBOOL_KEY_FILE_FCT_H_
|
||||||
|
|
||||||
|
/* This line must be uncommented only if you wan to produce a file
|
||||||
|
* to debug kbool
|
||||||
|
*/
|
||||||
|
//#define CREATE_KBOOL_KEY_FILES
|
||||||
|
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
|
||||||
|
#define KEYFILE_FILENAME "dbgfile.key"
|
||||||
|
|
||||||
|
/** function CreateKeyFile
|
||||||
|
* open KEYFILE_FILENAME file
|
||||||
|
* and create header
|
||||||
|
*/
|
||||||
|
void CreateKeyFile();
|
||||||
|
|
||||||
|
/** function CloseKeyFile
|
||||||
|
* close KEYFILE_FILENAME file
|
||||||
|
*/
|
||||||
|
void CloseKeyFile();
|
||||||
|
|
||||||
|
/* create header to start an entity description
|
||||||
|
*/
|
||||||
|
void OpenEntity(const char * aName);
|
||||||
|
/* close the entity description
|
||||||
|
*/
|
||||||
|
void CloseEntity();
|
||||||
|
|
||||||
|
/* polygon creations:
|
||||||
|
*/
|
||||||
|
void CopyPolygonsFromFilledPolysListToKeyFile( ZONE_CONTAINER* aZone, int aLayer);
|
||||||
|
void StartPolygon(int aCornersCount, int aLayer);
|
||||||
|
void AddPointXY( int aXcoord, int aYcoord);
|
||||||
|
void EndElement();
|
||||||
|
|
||||||
|
#endif // CREATE_KBOOL_KEY_FILES
|
||||||
|
|
||||||
|
#endif // _DEBUG_KBOOL_KEY_FILE_FCT_H_
|
||||||
|
|
|
@ -1077,8 +1077,7 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_mi
|
||||||
shape_pos = aRefPad->ReturnShapePos();
|
shape_pos = aRefPad->ReturnShapePos();
|
||||||
|
|
||||||
// rel_pos is pad position relative to the aRefPad position
|
// rel_pos is pad position relative to the aRefPad position
|
||||||
rel_pos.x -= shape_pos.x;
|
rel_pos -= shape_pos;
|
||||||
rel_pos.y -= shape_pos.y;
|
|
||||||
|
|
||||||
dist = (int) hypot( rel_pos.x, rel_pos.y );
|
dist = (int) hypot( rel_pos.x, rel_pos.y );
|
||||||
|
|
||||||
|
@ -1101,8 +1100,7 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_mi
|
||||||
if( swap_pads )
|
if( swap_pads )
|
||||||
{
|
{
|
||||||
EXCHG( aRefPad, aPad );
|
EXCHG( aRefPad, aPad );
|
||||||
rel_pos.x = -rel_pos.x;
|
rel_pos = -rel_pos;
|
||||||
rel_pos.y = -rel_pos.y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( aRefPad->m_PadShape )
|
switch( aRefPad->m_PadShape )
|
||||||
|
@ -1128,7 +1126,7 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_mi
|
||||||
wxSize size = aPad->m_Size;
|
wxSize size = aPad->m_Size;
|
||||||
// The trivial case is if both rects are rotated by multiple of 90°
|
// The trivial case is if both rects are rotated by multiple of 90°
|
||||||
if( ((aRefPad->m_Orient == 0) || (aRefPad->m_Orient == 900) || (aRefPad->m_Orient == 1800)
|
if( ((aRefPad->m_Orient == 0) || (aRefPad->m_Orient == 900) || (aRefPad->m_Orient == 1800)
|
||||||
|| (aRefPad->m_Orient == 2700)) &&
|
|| (aRefPad->m_Orient == 2700)) &&
|
||||||
((aPad->m_Orient == 0) || (aPad->m_Orient == 900) || (aPad->m_Orient == 1800)
|
((aPad->m_Orient == 0) || (aPad->m_Orient == 900) || (aPad->m_Orient == 1800)
|
||||||
|| (aPad->m_Orient == 2700)) )
|
|| (aPad->m_Orient == 2700)) )
|
||||||
{
|
{
|
||||||
|
@ -1230,7 +1228,6 @@ bool DRC::checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_mi
|
||||||
|
|
||||||
m_finx = -sx;
|
m_finx = -sx;
|
||||||
m_finy = -sy; // end of segment coordinate
|
m_finy = -sy; // end of segment coordinate
|
||||||
|
|
||||||
diag = checkClearanceSegmToPad( aPad, segm_width / 2, dist_min );
|
diag = checkClearanceSegmToPad( aPad, segm_width / 2, dist_min );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -500,7 +500,7 @@ int WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
|
||||||
{
|
{
|
||||||
int diag;
|
int diag;
|
||||||
// Init zone params to reasonnable values
|
// Init zone params to reasonnable values
|
||||||
zone->SetLayer( ( (PCB_SCREEN*) GetScreen() )->m_Active_Layer );
|
zone->SetLayer( GetScreen()->m_Active_Layer );
|
||||||
|
|
||||||
// Prompt user for parameters:
|
// Prompt user for parameters:
|
||||||
DrawPanel->m_IgnoreMouseEvents = TRUE;
|
DrawPanel->m_IgnoreMouseEvents = TRUE;
|
||||||
|
@ -518,6 +518,7 @@ int WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
|
||||||
wxGetApp().m_EDA_Config->Read( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY,
|
wxGetApp().m_EDA_Config->Read( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY,
|
||||||
&g_Zone_Default_Setting.m_ThermalReliefCopperBridgeValue );
|
&g_Zone_Default_Setting.m_ThermalReliefCopperBridgeValue );
|
||||||
|
|
||||||
|
g_Zone_Default_Setting.m_CurrentZone_Layer = zone->GetLayer();
|
||||||
dialog_copper_zone* frame = new dialog_copper_zone( this, &g_Zone_Default_Setting );
|
dialog_copper_zone* frame = new dialog_copper_zone( this, &g_Zone_Default_Setting );
|
||||||
diag = frame->ShowModal();
|
diag = frame->ShowModal();
|
||||||
frame->Destroy();
|
frame->Destroy();
|
||||||
|
@ -534,7 +535,7 @@ int WinEDA_PcbFrame::Begin_Zone( wxDC* DC )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Switch active layer to the selectec zonz layer
|
// Switch active layer to the selectec zonz layer
|
||||||
( (PCB_SCREEN*) GetScreen() )->m_Active_Layer = g_Zone_Default_Setting.m_CurrentZone_Layer;
|
GetScreen()->m_Active_Layer = g_Zone_Default_Setting.m_CurrentZone_Layer;
|
||||||
}
|
}
|
||||||
else // Start a new contour: init zone params (net and layer) from an existing zone (add cutout or similar zone)
|
else // Start a new contour: init zone params (net and layer) from an existing zone (add cutout or similar zone)
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,19 +25,38 @@
|
||||||
#include "fctsys.h"
|
#include "fctsys.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "pcbnew.h"
|
#include "pcbnew.h"
|
||||||
|
#include "wxPcbStruct.h"
|
||||||
#include "trigo.h"
|
#include "trigo.h"
|
||||||
|
|
||||||
#include "zones.h"
|
#include "zones.h"
|
||||||
|
|
||||||
#include "PolyLine.h"
|
#include "PolyLine.h"
|
||||||
|
// Kbool 1.9 and before had sometimes problemes when calculating thermal shapes as polygons (this is the best solution)
|
||||||
|
// So as a workaround we can use stubs (small tracks segments) to create thermal shape
|
||||||
|
// Define USE_STUBS_FOR_THERMAL to work on this workaround
|
||||||
|
// Currently under development: DO NOT USE
|
||||||
|
// because the code is not finished, and pcbnew does not work properly when used
|
||||||
|
// Kbool 2.0 has solved some problems, but not all
|
||||||
|
//#define USE_STUBS_FOR_THERMAL
|
||||||
|
|
||||||
using namespace std;
|
// Used to create data files to debug Kbool
|
||||||
|
#include "debug_kbool_key_file_fct.h"
|
||||||
|
|
||||||
|
// Also we can create test files for Kbool bebug purposes
|
||||||
|
// when CREATE_KBOOL_KEY_FILES is defined
|
||||||
|
// See debug_kbool_key_file_fct.h
|
||||||
|
|
||||||
|
|
||||||
extern void Test_For_Copper_Island_And_Remove( BOARD* aPcb, ZONE_CONTAINER* aZone_container );
|
extern void Test_For_Copper_Island_And_Remove( BOARD* aPcb, ZONE_CONTAINER* aZone_container );
|
||||||
|
|
||||||
|
|
||||||
// Local Functions:
|
// Local Functions:
|
||||||
|
#ifdef USE_STUBS_FOR_THERMAL
|
||||||
|
#warning USE_STUBS_FOR_THERMAL defined for test version: do not use for working pcbnew version
|
||||||
|
void CreateStubsForThermalShapes(BOARD* aPcb, ZONE_CONTAINER* aZone_container,
|
||||||
|
int aThermalGap,
|
||||||
|
int aCopperThickness, int aMinThicknessValue);
|
||||||
|
#endif
|
||||||
void AddTrackWithClearancePolygon( Bool_Engine* aBooleng,
|
void AddTrackWithClearancePolygon( Bool_Engine* aBooleng,
|
||||||
TRACK& aTrack, int aClearanceValue );
|
TRACK& aTrack, int aClearanceValue );
|
||||||
void AddPadWithClearancePolygon( Bool_Engine* aBooleng, D_PAD& aPad, int aClearanceValue );
|
void AddPadWithClearancePolygon( Bool_Engine* aBooleng, D_PAD& aPad, int aClearanceValue );
|
||||||
|
@ -202,15 +221,20 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int gap = clearance;
|
||||||
|
#ifdef USE_STUBS_FOR_THERMAL
|
||||||
|
gap = MAX( clearance, m_ThermalReliefGapValue );
|
||||||
|
#else
|
||||||
if( (m_PadOption == PAD_NOT_IN_ZONE)
|
if( (m_PadOption == PAD_NOT_IN_ZONE)
|
||||||
|| (GetNet() == 0) || pad->m_PadShape == PAD_TRAPEZOID )
|
|| (GetNet() == 0) || pad->m_PadShape == PAD_TRAPEZOID )
|
||||||
// PAD_TRAPEZOID shapes are *never* in zones becuase they are used in microwave apps
|
// PAD_TRAPEZOID shapes are not in zones because they are used in microwave apps
|
||||||
// and the shae *must not* be changed by thermal pads or others
|
// and i think it is good shapes are not changed by thermal pads or others
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
item_boundingbox = pad->GetBoundingBox();
|
item_boundingbox = pad->GetBoundingBox();
|
||||||
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
if( item_boundingbox.Intersects( zone_boundingbox ) )
|
||||||
{
|
{
|
||||||
AddPadWithClearancePolygon( booleng, *pad, clearance );
|
AddPadWithClearancePolygon( booleng, *pad, gap );
|
||||||
have_poly_to_substract = true;
|
have_poly_to_substract = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -297,6 +321,18 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
}
|
}
|
||||||
delete booleng;
|
delete booleng;
|
||||||
|
|
||||||
|
#ifdef USE_STUBS_FOR_THERMAL
|
||||||
|
// remove thermal gaps if required:
|
||||||
|
if( m_PadOption != THERMAL_PAD || aPcb->m_Modules == NULL )
|
||||||
|
{
|
||||||
|
Test_For_Copper_Island_And_Remove_Insulated_Islands( aPcb );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateStubsForThermalShapes(aPcb, this, m_ThermalReliefGapValue,
|
||||||
|
m_ThermalReliefCopperBridgeValue, m_ZoneMinThickness);
|
||||||
|
Test_For_Copper_Island_And_Remove_Insulated_Islands( aPcb );
|
||||||
|
#else
|
||||||
// Remove insulated islands:
|
// Remove insulated islands:
|
||||||
if( GetNet() > 0 )
|
if( GetNet() > 0 )
|
||||||
Test_For_Copper_Island_And_Remove_Insulated_Islands( aPcb );
|
Test_For_Copper_Island_And_Remove_Insulated_Islands( aPcb );
|
||||||
|
@ -314,6 +350,12 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
ArmBoolEng( booleng, true );
|
ArmBoolEng( booleng, true );
|
||||||
have_poly_to_substract = false;
|
have_poly_to_substract = false;
|
||||||
|
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
CreateKeyFile();
|
||||||
|
OpenEntity("Layer");
|
||||||
|
CopyPolygonsFromFilledPolysListToKeyFile(this, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
|
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
|
||||||
{
|
{
|
||||||
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
|
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
|
||||||
|
@ -335,6 +377,9 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
CloseEntity();
|
||||||
|
#endif
|
||||||
|
|
||||||
if( have_poly_to_substract )
|
if( have_poly_to_substract )
|
||||||
{
|
{
|
||||||
|
@ -353,6 +398,9 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
// Remove insulated islands:
|
// Remove insulated islands:
|
||||||
if( GetNet() > 0 )
|
if( GetNet() > 0 )
|
||||||
Test_For_Copper_Island_And_Remove_Insulated_Islands( aPcb );
|
Test_For_Copper_Island_And_Remove_Insulated_Islands( aPcb );
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
CloseKeyFile();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we remove all unused thermal stubs.
|
// Now we remove all unused thermal stubs.
|
||||||
|
@ -402,7 +450,11 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
{
|
{
|
||||||
dx = (int) ( dx * s_Correction );
|
dx = (int) ( dx * s_Correction );
|
||||||
dy = dx;
|
dy = dx;
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
fAngle = 0;
|
||||||
|
#else
|
||||||
fAngle = 450;
|
fAngle = 450;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// compute north, south, west and east points for zone connection.
|
// compute north, south, west and east points for zone connection.
|
||||||
|
@ -500,7 +552,8 @@ void ZONE_CONTAINER::AddClearanceAreasPolygonsToPolysList( BOARD* aPcb )
|
||||||
|
|
||||||
delete booleng;
|
delete booleng;
|
||||||
|
|
||||||
#endif
|
#endif // REMOVE_UNUSED_THERMAL_STUBS
|
||||||
|
#endif // USE_STUBS_FOR_THERMAL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -671,6 +724,96 @@ void AddPadWithClearancePolygon( Bool_Engine* aBooleng,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** function CreateStubsForThermalShapes()
|
||||||
|
* Only for testing the thermal shapes by stubs purposes
|
||||||
|
* Do not use for working pcbnew versions
|
||||||
|
*/
|
||||||
|
void CreateStubsForThermalShapes(BOARD* aPcb, ZONE_CONTAINER* aZone_container,
|
||||||
|
int aThermalGap,
|
||||||
|
int aCopperThickness, int aMinThicknessValue)
|
||||||
|
{
|
||||||
|
EDA_Rect zone_boundingbox = aZone_container->GetBoundingBox();
|
||||||
|
|
||||||
|
for( MODULE* module = aPcb->m_Modules; module; module = module->Next() )
|
||||||
|
{
|
||||||
|
for( D_PAD* pad = module->m_Pads; pad != NULL; pad = pad->Next() )
|
||||||
|
{
|
||||||
|
// check
|
||||||
|
if( !pad->IsOnLayer( aZone_container->GetLayer() ) )
|
||||||
|
continue;
|
||||||
|
if( pad->GetNet() != aZone_container->GetNet() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
EDA_Rect item_boundingbox = pad->GetBoundingBox();
|
||||||
|
item_boundingbox.Inflate( aThermalGap, aThermalGap );
|
||||||
|
if( !( item_boundingbox.Intersects( zone_boundingbox ) ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// test point
|
||||||
|
int dx = ( pad->m_Size.x / 2 ) + aThermalGap;
|
||||||
|
int dy = ( pad->m_Size.y / 2 ) + aThermalGap;
|
||||||
|
|
||||||
|
// This is CIRCLE pad tweak (for circle pads the thermal stubs are at 45 deg)
|
||||||
|
int fAngle = pad->m_Orient;
|
||||||
|
if( pad->m_PadShape == PAD_CIRCLE )
|
||||||
|
{
|
||||||
|
dx = (int) ( dx * s_Correction );
|
||||||
|
dy = dx;
|
||||||
|
fAngle = 450;
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute north, south, west and east points for zone connection.
|
||||||
|
// Add a small value to ensure point is inside (or outside) zone, not on an edge
|
||||||
|
wxPoint ptTest[4];
|
||||||
|
ptTest[0] = wxPoint( 0, 3 + dy + aMinThicknessValue / 2 );
|
||||||
|
ptTest[1] = wxPoint( 0, -(3 + dy + aMinThicknessValue / 2) );
|
||||||
|
ptTest[2] = wxPoint( 3 + dx + aMinThicknessValue / 2, 0 );
|
||||||
|
ptTest[3] = wxPoint( -(3 + dx + aMinThicknessValue / 2), 0 );
|
||||||
|
|
||||||
|
|
||||||
|
// Test all sides
|
||||||
|
for( int i = 0; i<4; i++ )
|
||||||
|
{
|
||||||
|
// rotate point
|
||||||
|
RotatePoint( &ptTest[i], fAngle );
|
||||||
|
|
||||||
|
// translate point
|
||||||
|
ptTest[i] += pad->ReturnShapePos();
|
||||||
|
bool inside = aZone_container->HitTestFilledArea( ptTest[i] );
|
||||||
|
|
||||||
|
if( inside )
|
||||||
|
{
|
||||||
|
|
||||||
|
TRACK*track = new TRACK(aPcb);
|
||||||
|
track->m_Start = pad->ReturnShapePos();
|
||||||
|
track->m_End = ptTest[i];
|
||||||
|
track->SetNet(aZone_container->GetNet());
|
||||||
|
track->SetLayer(aZone_container->GetLayer() );
|
||||||
|
track->m_Width = aCopperThickness;
|
||||||
|
track->m_TimeStamp = aZone_container->m_TimeStamp;
|
||||||
|
track->SetState( BEGIN_ONPAD, ON );
|
||||||
|
track->start = pad;
|
||||||
|
|
||||||
|
// add stub
|
||||||
|
WinEDA_PcbFrame* pcbFrame = (WinEDA_PcbFrame*) aPcb->m_PcbFrame;
|
||||||
|
if( pcbFrame->GetDrcController()->Drc( track, aPcb->m_Track ) == BAD_DRC )
|
||||||
|
delete track;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If this approach is developped, one must change the way the stubs are handles in pcbnew
|
||||||
|
// because insert these stubs as tracks does not work with undo/redo functions
|
||||||
|
// because these stubs must be deleted when refilling zones outside undo/redo calls
|
||||||
|
// This code is only for trial only, not for working pcbnew versions.
|
||||||
|
TRACK* insertBeforeMe = track->GetBestInsertPoint( aPcb );
|
||||||
|
aPcb->m_Track.Insert( track, insertBeforeMe );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** function AddThermalReliefPadPolygon
|
/** function AddThermalReliefPadPolygon
|
||||||
* Add holes around a pad to create a thermal relief
|
* Add holes around a pad to create a thermal relief
|
||||||
* copper thickness is min (dx/2, aCopperWitdh) or min (dy/2, aCopperWitdh)
|
* copper thickness is min (dx/2, aCopperWitdh) or min (dy/2, aCopperWitdh)
|
||||||
|
@ -773,7 +916,9 @@ void AddThermalReliefPadPolygon( Bool_Engine* aBooleng,
|
||||||
corner.x = copper_thickness.x / 2;
|
corner.x = copper_thickness.x / 2;
|
||||||
int y = outer_radius - (aThermalGap / 4);
|
int y = outer_radius - (aThermalGap / 4);
|
||||||
corner.y = (int) sqrt( ( ( (double) y * y ) - (double) corner.x * corner.x ) );
|
corner.y = (int) sqrt( ( ( (double) y * y ) - (double) corner.x * corner.x ) );
|
||||||
|
#ifndef CREATE_KBOOL_KEY_FILES
|
||||||
corners_buffer.push_back( corner );
|
corners_buffer.push_back( corner );
|
||||||
|
#endif
|
||||||
|
|
||||||
// calculate the starting point of the outter arc
|
// calculate the starting point of the outter arc
|
||||||
corner.x = copper_thickness.x / 2;
|
corner.x = copper_thickness.x / 2;
|
||||||
|
@ -804,26 +949,45 @@ void AddThermalReliefPadPolygon( Bool_Engine* aBooleng,
|
||||||
// Now, add the 4 holes ( each is the pattern, rotated by 0, 90, 180 and 270 deg
|
// Now, add the 4 holes ( each is the pattern, rotated by 0, 90, 180 and 270 deg
|
||||||
// WARNING: problems with kbool if angle = 0 (in fact when angle < 200):
|
// WARNING: problems with kbool if angle = 0 (in fact when angle < 200):
|
||||||
// bad filled polygon on some cases, when pads are on a same vertical line
|
// bad filled polygon on some cases, when pads are on a same vertical line
|
||||||
// this seems a bug in kbool polygon (exists in 1.9 kbool version)
|
// this seems a bug in kbool polygon (exists in 2.0 kbool version)
|
||||||
// angle = 450 (45.0 degrees orientation) seems work fine.
|
// angle = 450 (45.0 degrees orientation) seems work fine.
|
||||||
// angle = 0 with thermal shapes without angle < 90 deg has problems in rare circumstances
|
// angle = 0 with thermal shapes without angle < 90 deg has problems in rare circumstances
|
||||||
// Note: with the 2 step build ( thermal shapes added after areas are built), 0 seems work
|
// Note: with the 2 step build ( thermal shapes added after areas are built), 0 seems work
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
angle = 0;
|
||||||
|
#else
|
||||||
angle = 450;
|
angle = 450;
|
||||||
|
#endif
|
||||||
int angle_pad = aPad.m_Orient; // Pad orientation
|
int angle_pad = aPad.m_Orient; // Pad orientation
|
||||||
for( unsigned ihole = 0; ihole < 4; ihole++ )
|
for( unsigned ihole = 0; ihole < 4; ihole++ )
|
||||||
{
|
{
|
||||||
if( aBooleng->StartPolygonAdd( GROUP_B ) )
|
if( aBooleng->StartPolygonAdd( GROUP_B ) )
|
||||||
{
|
{
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
StartPolygon(corners_buffer.size() +1, 1);
|
||||||
|
#endif
|
||||||
for( unsigned ii = 0; ii < corners_buffer.size(); ii++ )
|
for( unsigned ii = 0; ii < corners_buffer.size(); ii++ )
|
||||||
{
|
{
|
||||||
corner = corners_buffer[ii];
|
corner = corners_buffer[ii];
|
||||||
RotatePoint( &corner, angle + angle_pad ); // Rotate by segment angle and pad orientation
|
RotatePoint( &corner, angle + angle_pad ); // Rotate by segment angle and pad orientation
|
||||||
corner += PadShapePos;
|
corner += PadShapePos;
|
||||||
aBooleng->AddPoint( corner.x, corner.y );
|
aBooleng->AddPoint( corner.x, corner.y );
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
AddPointXY(corner.x, corner.y);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
// Close polygon
|
||||||
|
corner = corners_buffer[0];
|
||||||
|
RotatePoint( &corner, angle + angle_pad ); // Rotate by segment angle and pad orientation
|
||||||
|
corner += PadShapePos;
|
||||||
|
AddPointXY( corner.x, corner.y );
|
||||||
|
#endif
|
||||||
|
|
||||||
aBooleng->EndPolygonAdd();
|
aBooleng->EndPolygonAdd();
|
||||||
|
#ifdef CREATE_KBOOL_KEY_FILES
|
||||||
|
EndElement();
|
||||||
|
#endif
|
||||||
angle += 900; // Note: angle in in 0.1 deg.
|
angle += 900; // Note: angle in in 0.1 deg.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -952,7 +952,7 @@ int BOARD::Test_Drc_Areas_Outlines_To_Areas_Outlines( ZONE_CONTAINER* aArea_To_E
|
||||||
}
|
}
|
||||||
int bstyle = Area_To_Test->m_Poly->GetSideStyle( ic2 );
|
int bstyle = Area_To_Test->m_Poly->GetSideStyle( ic2 );
|
||||||
int x, y;
|
int x, y;
|
||||||
int d = ::GetClearanceBetweenSegments(
|
int d = GetClearanceBetweenSegments(
|
||||||
bx1, by1, bx2, by2, bstyle,
|
bx1, by1, bx2, by2, bstyle,
|
||||||
0,
|
0,
|
||||||
ax1, ay1, ax2,
|
ax1, ay1, ax2,
|
||||||
|
@ -1081,7 +1081,7 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
|
||||||
}
|
}
|
||||||
int bstyle = Area_To_Test->m_Poly->GetSideStyle( ic2 );
|
int bstyle = Area_To_Test->m_Poly->GetSideStyle( ic2 );
|
||||||
int x, y;
|
int x, y;
|
||||||
int d = ::GetClearanceBetweenSegments( bx1, by1, bx2, by2, bstyle,
|
int d = GetClearanceBetweenSegments( bx1, by1, bx2, by2, bstyle,
|
||||||
0,
|
0,
|
||||||
ax1, ay1, ax2, ay2, astyle,
|
ax1, ay1, ax2, ay2, astyle,
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -538,13 +538,16 @@ void ArmBoolEng( Bool_Engine* aBooleng, bool aConvertHoles )
|
||||||
Within the algorithm all input data is multiplied with DGRID, and the result
|
Within the algorithm all input data is multiplied with DGRID, and the result
|
||||||
is rounded to an integer.
|
is rounded to an integer.
|
||||||
*/
|
*/
|
||||||
double DGRID = 1.0; // round coordinate X or Y value in calculations to this (initial value = 1000.0 in kbool example)
|
double DGRID = 10.0; // round coordinate X or Y value in calculations to this (initial value = 1000.0 in kbool example)
|
||||||
// Note: in kicad, coordinates are already integer so DGRID can be set to 1
|
// Note: in kicad, coordinates are already integer so DGRID could be set to 1
|
||||||
|
// we choose a DGRID = 10 to have a MARGE = 1.0
|
||||||
|
|
||||||
|
double MARGE = 1.0; // snap with in this range points to lines in the intersection routines
|
||||||
|
// should always be > 1/DGRID a MARGE >= 10/DGRID is ok
|
||||||
|
// this is also used to remove small segments and to decide when
|
||||||
|
// two segments are in line. ( initial value = 0.001 )
|
||||||
|
// For kicad we choose MARGE = 1, with DGRID = 10
|
||||||
|
|
||||||
double MARGE = 0.001; // snap with in this range points to lines in the intersection routines
|
|
||||||
// should always be > DGRID a MARGE >= 10*DGRID is ok
|
|
||||||
// this is also used to remove small segments and to decide when
|
|
||||||
// two segments are in line. ( initial value = 0.001 )
|
|
||||||
double CORRECTIONFACTOR = 0.0; // correct the polygons by this number: used in BOOL_CORRECTION operation
|
double CORRECTIONFACTOR = 0.0; // correct the polygons by this number: used in BOOL_CORRECTION operation
|
||||||
// this operation shrinks a polygon if CORRECTIONFACTOR < 0
|
// this operation shrinks a polygon if CORRECTIONFACTOR < 0
|
||||||
// or stretch it if CORRECTIONFACTOR > 0
|
// or stretch it if CORRECTIONFACTOR > 0
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*! \file kbool/_dl_itr.cpp
|
/*! \file kbool/_dl_itr.cpp
|
||||||
\brief Double Linked list with Iterators on list
|
\brief Double Linked list with Iterators on list
|
||||||
\author Probably Klaas Holwerda
|
\author Probably Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: _dl_itr.cpp,v 1.3 2006/12/13 21:43:33 titato Exp $
|
RCS-ID: $Id: _dl_itr.cpp,v 1.5 2009/04/23 19:35:24 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __UNIX__
|
#ifdef __UNIX__
|
||||||
|
@ -116,20 +116,20 @@ Error("remove_all",ITER_GT_O);
|
||||||
\param error code to generate a message for
|
\param error code to generate a message for
|
||||||
*/
|
*/
|
||||||
template <class Dtype>
|
template <class Dtype>
|
||||||
void DL_List<Dtype>::Error( const char* function, Lerror a_error )
|
void DL_List<Dtype>::Error( string function, Lerror a_error )
|
||||||
{
|
{
|
||||||
char buf[100];
|
string buf;
|
||||||
strcpy( buf, "DL_List<Dtype>::" );
|
buf += "DL_List<Dtype>::";
|
||||||
strcat( buf, function );
|
buf += function;
|
||||||
switch ( a_error )
|
switch ( a_error )
|
||||||
{
|
{
|
||||||
case NO_MES: strcat( buf, "" ); break;
|
case NO_MES: buf += ""; break;
|
||||||
case EMPTY: strcat( buf, "list is empty" ); break;
|
case EMPTY: buf += "list is empty"; break;
|
||||||
case ITER_GT_0: strcat( buf, "more then zero iter" ); break;
|
case ITER_GT_0: buf += "more then zero iter"; break;
|
||||||
case NO_LIST: strcat( buf, "no list attached" ); break;
|
case NO_LIST: buf += "no list attached"; break;
|
||||||
case SAME_LIST: strcat( buf, "same list not allowed" ); break;
|
case SAME_LIST: buf += "same list not allowed"; break;
|
||||||
case AC_ITER_LIST_OTHER: strcat( buf, "iter not allowed on other list" ); break;
|
case AC_ITER_LIST_OTHER: buf += "iter not allowed on other list"; break;
|
||||||
default: strcat( buf, "unhandled error" ); break;
|
default: buf += "unhandled error"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw Bool_Engine_Error( buf, "list error", 0, 1 );
|
throw Bool_Engine_Error( buf, "list error", 0, 1 );
|
||||||
|
@ -143,9 +143,9 @@ class | Dtype | item object in list
|
||||||
too see if list is empty
|
too see if list is empty
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
if (_intlist.Empty())
|
if (_intlist.Empty())
|
||||||
|
|
||||||
cout << "empty";
|
cout << "empty";
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -163,9 +163,9 @@ bool DL_List<Dtype>::empty()
|
||||||
too see if list contains only one object
|
too see if list contains only one object
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
|
|
||||||
if (_intlist.count() == 1)
|
if (_intlist.count() == 1)
|
||||||
|
|
||||||
cout << "one object in list";
|
cout << "one object in list";
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -181,11 +181,11 @@ int DL_List<Dtype>::count()
|
||||||
\note
|
\note
|
||||||
The objects itself are not deleted, only removed from the list.
|
The objects itself are not deleted, only removed from the list.
|
||||||
The user is responsible for memory management.
|
The user is responsible for memory management.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
The iterator level must be zero to be able to use this function,
|
The iterator level must be zero to be able to use this function,
|
||||||
else an error will be generated
|
else an error will be generated
|
||||||
|
|
||||||
\note
|
\note
|
||||||
Use this function if an iterator is not needed to do more complex things.
|
Use this function if an iterator is not needed to do more complex things.
|
||||||
This will save time, since the iterator does not have to be created.
|
This will save time, since the iterator does not have to be created.
|
||||||
|
@ -194,13 +194,13 @@ int DL_List<Dtype>::count()
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
int b=345;
|
int b=345;
|
||||||
|
|
||||||
_intlist.insbegin(a);
|
_intlist.insbegin(a);
|
||||||
|
|
||||||
_intlist.insbegin(b);
|
_intlist.insbegin(b);
|
||||||
|
|
||||||
_intlist.remove_all();
|
_intlist.remove_all();
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -233,28 +233,28 @@ remove the object at the begin of the list (head).
|
||||||
\note
|
\note
|
||||||
The object itself is not deleted, only removed from the list.
|
The object itself is not deleted, only removed from the list.
|
||||||
The user is responsible for memory management.
|
The user is responsible for memory management.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
The iterator level must be zero to be able to use this function, else an error will be generated
|
The iterator level must be zero to be able to use this function, else an error will be generated
|
||||||
|
|
||||||
\note
|
\note
|
||||||
The list must contain objects, else an error will be generated.
|
The list must contain objects, else an error will be generated.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
Use this function if an iterator is not needed to do more complex things. This will save time, since the iterator does not
|
Use this function if an iterator is not needed to do more complex things. This will save time, since the iterator does not
|
||||||
have to be created.
|
have to be created.
|
||||||
|
|
||||||
\par Example:
|
\par Example:
|
||||||
too insert integer a at begin of list and remove it directly.
|
too insert integer a at begin of list and remove it directly.
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
_intlist.insbegin(a)
|
_intlist.insbegin(a)
|
||||||
|
|
||||||
_intlist.removehead();
|
_intlist.removehead();
|
||||||
|
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
template <class Dtype>
|
template <class Dtype>
|
||||||
|
@ -277,7 +277,7 @@ void DL_List<Dtype>::removehead()
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
remove the object at the begin of the list (head).
|
remove the object at the begin of the list (head).
|
||||||
|
|
||||||
\note
|
\note
|
||||||
- The object itself is not deleted, only removed from the list.
|
- The object itself is not deleted, only removed from the list.
|
||||||
The user is responsible for memory management.
|
The user is responsible for memory management.
|
||||||
|
@ -286,18 +286,18 @@ remove the object at the begin of the list (head).
|
||||||
- The list must contain objects, else an error will be generated.
|
- The list must contain objects, else an error will be generated.
|
||||||
- Use this function if an iterator is not needed to do more complex things.
|
- Use this function if an iterator is not needed to do more complex things.
|
||||||
This will save time, since the iterator does not have to be created.
|
This will save time, since the iterator does not have to be created.
|
||||||
|
|
||||||
\par Example:
|
\par Example:
|
||||||
too insert integer a at end of list and remove it directly.
|
too insert integer a at end of list and remove it directly.
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
_intlist.insend(a)
|
_intlist.insend(a)
|
||||||
|
|
||||||
_intlist.removetail();
|
_intlist.removetail();
|
||||||
|
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
template <class Dtype>
|
template <class Dtype>
|
||||||
|
@ -322,7 +322,7 @@ insert the object given at the end of the list, after tail
|
||||||
\note
|
\note
|
||||||
The iterator level must be zero to be able to use this function,
|
The iterator level must be zero to be able to use this function,
|
||||||
else an error will be generated
|
else an error will be generated
|
||||||
|
|
||||||
\note
|
\note
|
||||||
Use this function if an iterator is not needed to do more complex things.
|
Use this function if an iterator is not needed to do more complex things.
|
||||||
This will save time, since the iterator does not have to be created.
|
This will save time, since the iterator does not have to be created.
|
||||||
|
@ -330,9 +330,9 @@ This will save time, since the iterator does not have to be created.
|
||||||
too insert integer a at end of list
|
too insert integer a at end of list
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
_intlist.insend(a)
|
_intlist.insend(a)
|
||||||
\endcode
|
\endcode
|
||||||
\param newitem an object for which the template list was generated
|
\param newitem an object for which the template list was generated
|
||||||
|
@ -360,18 +360,18 @@ insert the object given at the begin of the list, before head
|
||||||
\note
|
\note
|
||||||
The iterator level must be zero to be able to use this function,
|
The iterator level must be zero to be able to use this function,
|
||||||
else an error will be generated
|
else an error will be generated
|
||||||
|
|
||||||
\note
|
\note
|
||||||
Use this function if an iterator is not needed to do more complex things.
|
Use this function if an iterator is not needed to do more complex things.
|
||||||
This will save time, since the iterator does not have to be created.
|
This will save time, since the iterator does not have to be created.
|
||||||
|
|
||||||
\par Example:
|
\par Example:
|
||||||
too insert integer a at begin of list
|
too insert integer a at begin of list
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
_intlist.insbegin(a)
|
_intlist.insbegin(a)
|
||||||
\endcode
|
\endcode
|
||||||
\param newitem an object for which the template list was generated
|
\param newitem an object for which the template list was generated
|
||||||
|
@ -401,15 +401,15 @@ get head item
|
||||||
which is at head of list|
|
which is at head of list|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
int b=345;
|
int b=345;
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
_intlist.insbegin(a)
|
_intlist.insbegin(a)
|
||||||
|
|
||||||
_intlist.insbegin(b)
|
_intlist.insbegin(b)
|
||||||
c=_intlist.headitem()
|
c=_intlist.headitem()
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -428,15 +428,15 @@ get tail item
|
||||||
is at the tail of list
|
is at the tail of list
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
int b=345;
|
int b=345;
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
_intlist.insbegin(a)
|
_intlist.insbegin(a)
|
||||||
_intlist.insbegin(b)
|
_intlist.insbegin(b)
|
||||||
|
|
||||||
c=_intlist.headitem()
|
c=_intlist.headitem()
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -449,7 +449,7 @@ Dtype DL_List<Dtype>::tailitem()
|
||||||
/*!
|
/*!
|
||||||
* \note
|
* \note
|
||||||
The iterator level must be zero to be able to use this function, else an error will be generated
|
The iterator level must be zero to be able to use this function, else an error will be generated
|
||||||
|
|
||||||
* \note The list may not be the same list as this list
|
* \note The list may not be the same list as this list
|
||||||
* \param otherlist the list to take the items from
|
* \param otherlist the list to take the items from
|
||||||
*/
|
*/
|
||||||
|
@ -497,23 +497,23 @@ void DL_List<Dtype>::takeover( DL_List<Dtype>* otherlist )
|
||||||
to insert integer a and b into list and remove_all directly using an iterator
|
to insert integer a and b into list and remove_all directly using an iterator
|
||||||
\code
|
\code
|
||||||
DL_List<int>* a_list = new DL_List<int>(); // declaration and allocation
|
DL_List<int>* a_list = new DL_List<int>(); // declaration and allocation
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
int b=345;
|
int b=345;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(a_list);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(a_list);
|
||||||
|
|
||||||
a_listiter->insbegin(a)
|
a_listiter->insbegin(a)
|
||||||
|
|
||||||
a_listiter->insbegin(b)
|
a_listiter->insbegin(b)
|
||||||
|
|
||||||
a_listiter->remove_all()
|
a_listiter->remove_all()
|
||||||
|
|
||||||
} //to destruct the iterator before the list is deleted
|
} //to destruct the iterator before the list is deleted
|
||||||
|
|
||||||
delete a_list; #delete it (must have no iterators attached to it)
|
delete a_list; #delete it (must have no iterators attached to it)
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -532,28 +532,28 @@ void DL_List<Dtype>::takeover( DL_List<Dtype>* otherlist )
|
||||||
\param a_error: error code to generate a message for
|
\param a_error: error code to generate a message for
|
||||||
*/
|
*/
|
||||||
template <class Dtype>
|
template <class Dtype>
|
||||||
void DL_Iter<Dtype>::Error( const char* function, Lerror a_error )
|
void DL_Iter<Dtype>::Error( string function, Lerror a_error )
|
||||||
{
|
{
|
||||||
char buf[100];
|
string buf;
|
||||||
strcpy( buf, "DL_Iter<Dtype>::" );
|
buf = "DL_Iter<Dtype>::";
|
||||||
strcat( buf, function );
|
buf += function;
|
||||||
switch ( a_error )
|
switch ( a_error )
|
||||||
{
|
{
|
||||||
case NO_MES: strcat( buf, "" ); break;
|
case NO_MES: buf += ""; break;
|
||||||
case NO_LIST: strcat( buf, "no list attached" ); break;
|
case NO_LIST: buf += "no list attached"; break;
|
||||||
case NO_LIST_OTHER: strcat( buf, "no list on other iter" ); break;
|
case NO_LIST_OTHER: buf += "no list on other iter"; break;
|
||||||
case AC_ITER_LIST_OTHER: strcat( buf, "iter not allowed on other list" ); break;
|
case AC_ITER_LIST_OTHER: buf += "iter not allowed on other list"; break;
|
||||||
case SAME_LIST: strcat( buf, "same list not allowed" ); break;
|
case SAME_LIST: buf += "same list not allowed"; break;
|
||||||
case NOT_SAME_LIST: strcat( buf, "must be same list" ); break;
|
case NOT_SAME_LIST: buf += "must be same list"; break;
|
||||||
case ITER_GT_1: strcat( buf, "more then one iter" ); break;
|
case ITER_GT_1: buf += "more then one iter"; break;
|
||||||
case ITER_HITROOT: strcat( buf, "iter at root" ); break;
|
case ITER_HITROOT: buf += "iter at root"; break;
|
||||||
case NO_ITEM: strcat( buf, "no item at current" ); break;
|
case NO_ITEM: buf += "no item at current"; break;
|
||||||
case NO_NEXT: strcat( buf, "no next after current" ); break;
|
case NO_NEXT: buf += "no next after current"; break;
|
||||||
case NO_PREV: strcat( buf, "no prev before current" ); break;
|
case NO_PREV: buf += "no prev before current"; break;
|
||||||
case EMPTY: strcat( buf, "list is empty" ); break;
|
case EMPTY: buf += "list is empty"; break;
|
||||||
case NOT_ALLOW: strcat( buf, "not allowed" ); break;
|
case NOT_ALLOW: buf += "not allowed"; break;
|
||||||
case ITER_NEG: strcat( buf, "to much iters deleted" ); break;
|
case ITER_NEG: buf += "to much iters deleted"; break;
|
||||||
default: strcat( buf, "unhandled error" ); break;
|
default: buf += "unhandled error"; break;
|
||||||
}
|
}
|
||||||
throw Bool_Engine_Error( buf, "list error", 0, 1 );
|
throw Bool_Engine_Error( buf, "list error", 0, 1 );
|
||||||
}
|
}
|
||||||
|
@ -585,11 +585,11 @@ tcarg: class | Dtype | list item object
|
||||||
How to construct a list of type integer and a second iterator for it:|
|
How to construct a list of type integer and a second iterator for it:|
|
||||||
\code
|
\code
|
||||||
DL_List<int>* IntegerList;
|
DL_List<int>* IntegerList;
|
||||||
|
|
||||||
IntegerList = new DL_List<int>();
|
IntegerList = new DL_List<int>();
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(IntegerList);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(IntegerList);
|
||||||
|
|
||||||
DL_Iter<int>* a_secondlistiter=new DL_Iter<int>(a_listiter);
|
DL_Iter<int>* a_secondlistiter=new DL_Iter<int>(a_listiter);
|
||||||
\endcode
|
\endcode
|
||||||
\param otheriter other iterator on same list
|
\param otheriter other iterator on same list
|
||||||
|
@ -610,21 +610,21 @@ Later on when a list is constructed,the iterator can be attached to it.
|
||||||
This way an iterator to a specific list can be made static to a class, and can be used
|
This way an iterator to a specific list can be made static to a class, and can be used
|
||||||
for several lists at the same time. \n
|
for several lists at the same time. \n
|
||||||
tcarg: class | Dtype | list item object
|
tcarg: class | Dtype | list item object
|
||||||
|
|
||||||
\par Example
|
\par Example
|
||||||
How to construct an iterator, without having a list first.
|
How to construct an iterator, without having a list first.
|
||||||
This constructs an iterator for a list of the given type, but the list thus not yet exist.
|
This constructs an iterator for a list of the given type, but the list thus not yet exist.
|
||||||
\code
|
\code
|
||||||
DL_Iter<int>* a_iter=new DL_Iter<int>();
|
DL_Iter<int>* a_iter=new DL_Iter<int>();
|
||||||
|
|
||||||
DL_List<int>* IntegerList;
|
DL_List<int>* IntegerList;
|
||||||
|
|
||||||
IntegerList = new DL_List<int>();
|
IntegerList = new DL_List<int>();
|
||||||
|
|
||||||
a_iter.Attach(IntegerList);
|
a_iter.Attach(IntegerList);
|
||||||
|
|
||||||
a_iter.insend(123);
|
a_iter.insend(123);
|
||||||
|
|
||||||
a_iter.Detach();
|
a_iter.Detach();
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -655,15 +655,15 @@ static to a class, and can be used for several lists at the same time.\n
|
||||||
How to construct an iterator, without having a list first, and attach an iterator later:|
|
How to construct an iterator, without having a list first, and attach an iterator later:|
|
||||||
\code
|
\code
|
||||||
DL_Iter<int>* a_iter=new DL_Iter<int>();
|
DL_Iter<int>* a_iter=new DL_Iter<int>();
|
||||||
|
|
||||||
DL_List<int>* IntegerList;
|
DL_List<int>* IntegerList;
|
||||||
|
|
||||||
IntegerList = new DL_List<int>();
|
IntegerList = new DL_List<int>();
|
||||||
|
|
||||||
a_iter.Attach(IntegerList);
|
a_iter.Attach(IntegerList);
|
||||||
|
|
||||||
a_iter.insend(123);
|
a_iter.insend(123);
|
||||||
|
|
||||||
a_iter.Detach();
|
a_iter.Detach();
|
||||||
\endcode
|
\endcode
|
||||||
\param newlist the list to attached the iterator to
|
\param newlist the list to attached the iterator to
|
||||||
|
@ -687,15 +687,15 @@ and can be used for several lists at the same time. \n
|
||||||
How to construct an iterator, without having a list first, and attach an iterator later:
|
How to construct an iterator, without having a list first, and attach an iterator later:
|
||||||
\code
|
\code
|
||||||
DL_Iter<int>* a_iter=new DL_Iter<int>();
|
DL_Iter<int>* a_iter=new DL_Iter<int>();
|
||||||
|
|
||||||
DL_List<int>* IntegerList;
|
DL_List<int>* IntegerList;
|
||||||
|
|
||||||
IntegerList = new DL_List<int>();
|
IntegerList = new DL_List<int>();
|
||||||
|
|
||||||
a_iter.Attach(IntegerList);
|
a_iter.Attach(IntegerList);
|
||||||
|
|
||||||
a_iter.insend(123);
|
a_iter.insend(123);
|
||||||
|
|
||||||
a_iter.Detach();
|
a_iter.Detach();
|
||||||
\endcode
|
\endcode
|
||||||
\param newlist: the list to attached the iterator to
|
\param newlist: the list to attached the iterator to
|
||||||
|
@ -755,22 +755,22 @@ to move all objects in a list to the list of the iterator.
|
||||||
\note
|
\note
|
||||||
The iterator level must be one to be able to use this function,
|
The iterator level must be one to be able to use this function,
|
||||||
else an error will be generated
|
else an error will be generated
|
||||||
|
|
||||||
\note
|
\note
|
||||||
The list may not be the same list as the iterator list
|
The list may not be the same list as the iterator list
|
||||||
\par Example
|
\par Example
|
||||||
to take over all items in _intlist|
|
to take over all items in _intlist|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
DL_List<int> _intlist2; #create a list of integers
|
DL_List<int> _intlist2; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist2);
|
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist2);
|
||||||
|
|
||||||
_intlist->insend(a) // insert at end
|
_intlist->insend(a) // insert at end
|
||||||
|
|
||||||
a_listiter2->takeover(_intlist)
|
a_listiter2->takeover(_intlist)
|
||||||
\endcode
|
\endcode
|
||||||
\param otherlist the list to take the items from
|
\param otherlist the list to take the items from
|
||||||
|
@ -808,28 +808,28 @@ void DL_Iter<Dtype>::takeover( DL_List<Dtype>* otherlist )
|
||||||
to move all objects in a list (using iterator of that list) to the list of the iterator.
|
to move all objects in a list (using iterator of that list) to the list of the iterator.
|
||||||
\note
|
\note
|
||||||
The iterator level for both iterators must be one to be able to use this function,
|
The iterator level for both iterators must be one to be able to use this function,
|
||||||
|
|
||||||
\note
|
\note
|
||||||
else an error will be generated
|
else an error will be generated
|
||||||
|
|
||||||
\note
|
\note
|
||||||
The list may not be the same list as the iterator list
|
The list may not be the same list as the iterator list
|
||||||
|
|
||||||
\par Example
|
\par Example
|
||||||
to take over all items in a_listiter1 it's list|
|
to take over all items in a_listiter1 it's list|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
DL_List<int> _intlist2; #create a list of integers
|
DL_List<int> _intlist2; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter1=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter1=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist2);
|
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist2);
|
||||||
|
|
||||||
a_listiter1->insend(a) // insert at end
|
a_listiter1->insend(a) // insert at end
|
||||||
|
|
||||||
a_listiter2->takeover(a_listiter1)
|
a_listiter2->takeover(a_listiter1)
|
||||||
\\!to move all objects in a list (using iterator of that list) to the list of the iterator
|
\\!to move all objects in a list (using iterator of that list) to the list of the iterator
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -872,27 +872,27 @@ to move maxcount objects in a list (using iterator of that list)
|
||||||
to the list of the iterator.
|
to the list of the iterator.
|
||||||
\note The iterator level for both iterators must be one to be able to use this function,
|
\note The iterator level for both iterators must be one to be able to use this function,
|
||||||
else an error will be generated
|
else an error will be generated
|
||||||
|
|
||||||
\note The list may not be the same list as the iterator list
|
\note The list may not be the same list as the iterator list
|
||||||
|
|
||||||
\note If less then maxcount objects are available in the source iterator,
|
\note If less then maxcount objects are available in the source iterator,
|
||||||
all of them are taken and no error will accur
|
all of them are taken and no error will accur
|
||||||
|
|
||||||
\par Example
|
\par Example
|
||||||
to take over 1 item from a_listiter1 it's list
|
to take over 1 item from a_listiter1 it's list
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
DL_List<int> _intlist2; #create a list of integers
|
DL_List<int> _intlist2; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter1=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter1=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist2);
|
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist2);
|
||||||
|
|
||||||
a_listiter1->insend(a) // insert at end
|
a_listiter1->insend(a) // insert at end
|
||||||
|
|
||||||
a_listiter2->takeover(a_listiter1,1);
|
a_listiter2->takeover(a_listiter1,1);
|
||||||
//! to move maxcount objects in a list (using iterator of that list) to the list of the iterator
|
//! to move maxcount objects in a list (using iterator of that list) to the list of the iterator
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -987,13 +987,13 @@ put the iterator root object before the current iterator position in the list.
|
||||||
The current object will become the new head of the list.
|
The current object will become the new head of the list.
|
||||||
\note The iterator level must be one to be able to use this function,
|
\note The iterator level must be one to be able to use this function,
|
||||||
else an error will be generated
|
else an error will be generated
|
||||||
|
|
||||||
\par Example
|
\par Example
|
||||||
move the root object to make the new head the old tail object|
|
move the root object to make the new head the old tail object|
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->insend(3456);
|
a_listiter->insend(3456);
|
||||||
|
@ -1036,7 +1036,7 @@ The current object will become the new tail of the list.
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->insend(3456);
|
a_listiter->insend(3456);
|
||||||
|
@ -1076,7 +1076,7 @@ is list empty (contains items or not)?
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
if (a_listiter->Empty())
|
if (a_listiter->Empty())
|
||||||
cout << "empty"
|
cout << "empty"
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -1100,7 +1100,7 @@ the end can be tested with this function.
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
//traverse forwards
|
//traverse forwards
|
||||||
while ( ! a_listiter->hitroot())
|
while ( ! a_listiter->hitroot())
|
||||||
|
@ -1108,7 +1108,7 @@ while ( ! a_listiter->hitroot())
|
||||||
cout << "The item =" << a_listiter->item();
|
cout << "The item =" << a_listiter->item();
|
||||||
a_listiter++; //goto next object
|
a_listiter++; //goto next object
|
||||||
}
|
}
|
||||||
|
|
||||||
a_listiter->totail();
|
a_listiter->totail();
|
||||||
//traverse backwards
|
//traverse backwards
|
||||||
while ( ! a_listiter->hitroot())
|
while ( ! a_listiter->hitroot())
|
||||||
|
@ -1135,7 +1135,7 @@ is the iterator at the head of the list.
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
if (a_listiter->athead())
|
if (a_listiter->athead())
|
||||||
cout << "at the head The item =" << a_listiter->item();
|
cout << "at the head The item =" << a_listiter->item();
|
||||||
|
@ -1159,7 +1159,7 @@ is the iterator at the tail of the list.
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->totail();
|
a_listiter->totail();
|
||||||
if (a_listiter->attail())
|
if (a_listiter->attail())
|
||||||
cout << "at the tail The item =" << a_listiter->item();
|
cout << "at the tail The item =" << a_listiter->item();
|
||||||
|
@ -1183,7 +1183,7 @@ does the iterator/list contain the given object
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
|
|
||||||
if (a_listiter->has(1234))
|
if (a_listiter->has(1234))
|
||||||
cout << "yes it does";
|
cout << "yes it does";
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -1233,7 +1233,7 @@ go to first item, if list is empty goto hite
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -1254,7 +1254,7 @@ go to last item, if list is empty goto hite
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->totail();
|
a_listiter->totail();
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -1275,7 +1275,7 @@ set the iterator position to the root (empty dummy) object in the list.
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->toroot();
|
a_listiter->toroot();
|
||||||
while (a_listiter->iterate())
|
while (a_listiter->iterate())
|
||||||
|
@ -1298,7 +1298,7 @@ how to iterate backwards
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; //create a list of integers
|
DL_List <int> _intlist; //create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
while (!a_listiter->hitroot())
|
while (!a_listiter->hitroot())
|
||||||
|
@ -1324,7 +1324,7 @@ how to iterate backwards
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; //create a list of integers
|
DL_List <int> _intlist; //create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
while (!a_listiter->hitroot())
|
while (!a_listiter->hitroot())
|
||||||
|
@ -1351,7 +1351,7 @@ how to iterate backwards
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; //create a list of integers
|
DL_List <int> _intlist; //create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->totail();
|
a_listiter->totail();
|
||||||
while (!a_listiter->hitroot())
|
while (!a_listiter->hitroot())
|
||||||
|
@ -1378,7 +1378,7 @@ how to iterate backwards
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; //create a list of integers
|
DL_List <int> _intlist; //create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->totail();
|
a_listiter->totail();
|
||||||
while (!a_listiter->hitroot())
|
while (!a_listiter->hitroot())
|
||||||
|
@ -1454,11 +1454,11 @@ put the iterator at the position of the given object in the list.
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->insend(3456);
|
a_listiter->insend(3456);
|
||||||
|
|
||||||
a_listiter->toitem(2345); template <class Dtype>
|
a_listiter->toitem(2345); template <class Dtype>
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -1488,7 +1488,7 @@ put the iterator at the same position as the given iterator in the list.
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter2=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->insend(3456);
|
a_listiter->insend(3456);
|
||||||
|
@ -1535,27 +1535,27 @@ bool DL_Iter<Dtype>::tonode( DL_Node<Dtype> *othernode )
|
||||||
/*!
|
/*!
|
||||||
advance the iterator one position in the next direction in the list.
|
advance the iterator one position in the next direction in the list.
|
||||||
\return returns true if not at the end/root of the list else false.
|
\return returns true if not at the end/root of the list else false.
|
||||||
|
|
||||||
\note This function combines iteration and testing for the end of
|
\note This function combines iteration and testing for the end of
|
||||||
the list in one.
|
the list in one.
|
||||||
|
|
||||||
\note Therefore we do not have to advance the iterator ourselves.
|
\note Therefore we do not have to advance the iterator ourselves.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
The iterator is first put to the next object, before testing for the end of the list. |
|
The iterator is first put to the next object, before testing for the end of the list. |
|
||||||
This is why we need to start at the root element in general usage.
|
This is why we need to start at the root element in general usage.
|
||||||
|
|
||||||
\par Example
|
\par Example
|
||||||
iterate through all the items in a list
|
iterate through all the items in a list
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->insend(3456);
|
a_listiter->insend(3456);
|
||||||
a_listiter->tobegin(2345);
|
a_listiter->tobegin(2345);
|
||||||
|
|
||||||
while (a_listiter->iterate())
|
while (a_listiter->iterate())
|
||||||
{ cout << a_listiter->item(); }
|
{ cout << a_listiter->item(); }
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -1583,7 +1583,7 @@ since there is no item there.
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; //create a list of integers
|
DL_List <int> _intlist; //create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
int theitem=a_listiter->item();
|
int theitem=a_listiter->item();
|
||||||
|
@ -1634,11 +1634,11 @@ cycle the list twice
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
|
|
||||||
int count=2*a_listiter->count();
|
int count=2*a_listiter->count();
|
||||||
while (count)
|
while (count)
|
||||||
{
|
{
|
||||||
|
@ -1681,11 +1681,11 @@ cycle the list twice
|
||||||
\code
|
\code
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->totail();
|
a_listiter->totail();
|
||||||
|
|
||||||
int count=2*a_listiter->count();
|
int count=2*a_listiter->count();
|
||||||
while (count)
|
while (count)
|
||||||
{
|
{
|
||||||
|
@ -1723,23 +1723,23 @@ void DL_Iter<Dtype>::remove_all()
|
||||||
/*!
|
/*!
|
||||||
remove object at current iterator position from the list.
|
remove object at current iterator position from the list.
|
||||||
\note The object itself is not deleted, only removed from the list. The user is responsible for memory management.
|
\note The object itself is not deleted, only removed from the list. The user is responsible for memory management.
|
||||||
|
|
||||||
\note The iterator level must be one to be able to use this function, else an error will be generated
|
\note The iterator level must be one to be able to use this function, else an error will be generated
|
||||||
|
|
||||||
\note The list must contain an object at the current iterator position, else an error will be generated.
|
\note The list must contain an object at the current iterator position, else an error will be generated.
|
||||||
\par Example:
|
\par Example:
|
||||||
to insert integer a at begin of list and remove it directly
|
to insert integer a at begin of list and remove it directly
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insbegin(a);
|
a_listiter->insbegin(a);
|
||||||
|
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
|
|
||||||
a_listiter->remove();
|
a_listiter->remove();
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -1767,21 +1767,21 @@ void DL_Iter<Dtype>::remove()
|
||||||
/*!
|
/*!
|
||||||
remove the object at the begin of the list using an iterator
|
remove the object at the begin of the list using an iterator
|
||||||
\note The object itself is not deleted, only removed from the list. The user is responsible for memory management.
|
\note The object itself is not deleted, only removed from the list. The user is responsible for memory management.
|
||||||
|
|
||||||
\note The iterator level must be one to be able to use this function, else an error will be generated
|
\note The iterator level must be one to be able to use this function, else an error will be generated
|
||||||
|
|
||||||
\note The list must contain objects, else an error will be generated.
|
\note The list must contain objects, else an error will be generated.
|
||||||
|
|
||||||
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
||||||
\par Example:
|
\par Example:
|
||||||
to insert integer a at begin of list and remove it directly|
|
to insert integer a at begin of list and remove it directly|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insbegin(a);
|
a_listiter->insbegin(a);
|
||||||
a_listiter->removehead();
|
a_listiter->removehead();
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -1808,21 +1808,21 @@ void DL_Iter<Dtype>::removehead()
|
||||||
/*!
|
/*!
|
||||||
//remove the object at the end of the list using an iterator
|
//remove the object at the end of the list using an iterator
|
||||||
\note The object itself is not deleted, only removed from the list. The user is responsible for memory management.
|
\note The object itself is not deleted, only removed from the list. The user is responsible for memory management.
|
||||||
|
|
||||||
\note The iterator level must be one to be able to use this function, else an error will be generated
|
\note The iterator level must be one to be able to use this function, else an error will be generated
|
||||||
|
|
||||||
\note The list must contain objects, else an error will be generated.
|
\note The list must contain objects, else an error will be generated.
|
||||||
|
|
||||||
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
||||||
\par Example:
|
\par Example:
|
||||||
to insert integer a at end of list and remove it directly
|
to insert integer a at end of list and remove it directly
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(a);
|
a_listiter->insend(a);
|
||||||
a_listiter->removetail();
|
a_listiter->removetail();
|
||||||
\endcode
|
\endcode
|
||||||
|
@ -1848,19 +1848,19 @@ void DL_Iter<Dtype>::removetail()
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
insert the object given at the end of the list
|
insert the object given at the end of the list
|
||||||
|
|
||||||
\note The iterator level must be one to be able to use this function, else an error will be generated
|
\note The iterator level must be one to be able to use this function, else an error will be generated
|
||||||
|
|
||||||
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
||||||
\par Example:
|
\par Example:
|
||||||
to insert integer a at end of list|
|
to insert integer a at end of list|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(a);
|
a_listiter->insend(a);
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
|
@ -1882,18 +1882,18 @@ DL_Node<Dtype>* DL_Iter<Dtype>::insend( Dtype newitem )
|
||||||
/*!
|
/*!
|
||||||
insert the object given at the begin of the list
|
insert the object given at the begin of the list
|
||||||
\note The iterator level must be one to be able to use this function, else an error will be generated
|
\note The iterator level must be one to be able to use this function, else an error will be generated
|
||||||
|
|
||||||
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
\note Use this function if an iterator is needed to do more complex things. Else use the list member functions directly.
|
||||||
|
|
||||||
\par Example:
|
\par Example:
|
||||||
to insert integer a at begin of list|
|
to insert integer a at begin of list|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insbegin(a);
|
a_listiter->insbegin(a);
|
||||||
\endcode
|
\endcode
|
||||||
\param newitem an object for which the template list/iterator was generated
|
\param newitem an object for which the template list/iterator was generated
|
||||||
|
@ -1919,9 +1919,9 @@ DL_Node<Dtype>* DL_Iter<Dtype>::insbegin( Dtype newitem )
|
||||||
to insert integer before the iterator position in the list|
|
to insert integer before the iterator position in the list|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
a_listiter->totail();
|
a_listiter->totail();
|
||||||
a_listiter->insbefore(a); // insert before tail
|
a_listiter->insbefore(a); // insert before tail
|
||||||
|
@ -1954,9 +1954,9 @@ insert the object given after the current position of the iterator in list
|
||||||
\par Example: to insert integer after the iterator position in the list|
|
\par Example: to insert integer after the iterator position in the list|
|
||||||
\code
|
\code
|
||||||
DL_List<int> _intlist; #create a list of integers
|
DL_List<int> _intlist; #create a list of integers
|
||||||
|
|
||||||
int a=123;
|
int a=123;
|
||||||
|
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
a_listiter->tohead();
|
a_listiter->tohead();
|
||||||
a_listiter->insafter(a); // insert after head
|
a_listiter->insafter(a); // insert after head
|
||||||
|
@ -1986,30 +1986,30 @@ DL_Node<Dtype>* DL_Iter<Dtype>::insafter( Dtype newitem )
|
||||||
sort all items in the list according to the compare function.
|
sort all items in the list according to the compare function.
|
||||||
when items need to be swapped to reach the right order the swap function will be called also.
|
when items need to be swapped to reach the right order the swap function will be called also.
|
||||||
\note There are no restrictions on the internal decision in the compare function when to return -1,0,1.
|
\note There are no restrictions on the internal decision in the compare function when to return -1,0,1.
|
||||||
|
|
||||||
\note The swap function can be used to change items when they are swapped.
|
\note The swap function can be used to change items when they are swapped.
|
||||||
fcmp (function, fcmp)
|
fcmp (function, fcmp)
|
||||||
\verbatim
|
\verbatim
|
||||||
|
|
||||||
Declaration: int (*fcmp) (Dtype,Dtype)
|
Declaration: int (*fcmp) (Dtype,Dtype)
|
||||||
|
|
||||||
compare function pointer, the function takes two objects in the list. It must return -1, 0, 1, to sort the list in upgoing
|
compare function pointer, the function takes two objects in the list. It must return -1, 0, 1, to sort the list in upgoing
|
||||||
order the function should return:
|
order the function should return:
|
||||||
|
|
||||||
-1 is returned if the first object is bigger then the second.
|
-1 is returned if the first object is bigger then the second.
|
||||||
0 is returned if the objects are equal.
|
0 is returned if the objects are equal.
|
||||||
1 is returned if the first object is smaller then the second.
|
1 is returned if the first object is smaller then the second.
|
||||||
|
|
||||||
To sort the list in downgoing order:
|
To sort the list in downgoing order:
|
||||||
|
|
||||||
1 is returned if the first object is bigger then the second.
|
1 is returned if the first object is bigger then the second.
|
||||||
0 is returned if the objects are equal.
|
0 is returned if the objects are equal.
|
||||||
-1 is returned if the first object is smaller then the second.
|
-1 is returned if the first object is smaller then the second.
|
||||||
|
|
||||||
fswap (function, fswap)
|
fswap (function, fswap)
|
||||||
|
|
||||||
Declaration: void (*fswap) (Dtype,Dtype)
|
Declaration: void (*fswap) (Dtype,Dtype)
|
||||||
|
|
||||||
swap function pointer, the function takes two objects in the list. It will be called when the objects are swapped to
|
swap function pointer, the function takes two objects in the list. It will be called when the objects are swapped to
|
||||||
reach the right order. If it is NULL, it will not be called.
|
reach the right order. If it is NULL, it will not be called.
|
||||||
\endverbatim
|
\endverbatim
|
||||||
|
@ -2022,10 +2022,10 @@ int numbersorter(int a,int b)
|
||||||
if(a == b) return(0);
|
if(a == b) return(0);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->insend(3456);
|
a_listiter->insend(3456);
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
|
@ -2110,34 +2110,34 @@ int DL_Iter<Dtype>::cocktailsort( int ( *fcmp ) ( Dtype, Dtype ), bool ( *fswap
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
sort all items in the list according to the compare function.
|
sort all items in the list according to the compare function.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
There are no restrictions on the internal decision in the compare function when to return -1,0,1.
|
There are no restrictions on the internal decision in the compare function when to return -1,0,1.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
For the mergesort function the objects will be swapped when the return value is -1.
|
For the mergesort function the objects will be swapped when the return value is -1.
|
||||||
|
|
||||||
\note
|
\note
|
||||||
\verbatim
|
\verbatim
|
||||||
|
|
||||||
fcmp (function, fcmp)
|
fcmp (function, fcmp)
|
||||||
|
|
||||||
Declaration: int (*fcmp) (Dtype,Dtype)
|
Declaration: int (*fcmp) (Dtype,Dtype)
|
||||||
|
|
||||||
compare function pointer, the function takes two objects in the list. It must return -1, 0, 1, to sort the list in upgoing
|
compare function pointer, the function takes two objects in the list. It must return -1, 0, 1, to sort the list in upgoing
|
||||||
order the function should return:
|
order the function should return:
|
||||||
|
|
||||||
-1 is returned if the first object is bigger then the second.
|
-1 is returned if the first object is bigger then the second.
|
||||||
0 is returned if the objects are equal.
|
0 is returned if the objects are equal.
|
||||||
1 is returned if the first object is smaller then the second.
|
1 is returned if the first object is smaller then the second.
|
||||||
|
|
||||||
To sort the list in downgoing order:
|
To sort the list in downgoing order:
|
||||||
|
|
||||||
1 is returned if the first object is bigger then the second.
|
1 is returned if the first object is bigger then the second.
|
||||||
0 is returned if the objects are equal.
|
0 is returned if the objects are equal.
|
||||||
-1 is returned if the first object is smaller then the second.
|
-1 is returned if the first object is smaller then the second.
|
||||||
\endverbatim
|
\endverbatim
|
||||||
|
|
||||||
!tcarg: class | Dtype | list item object
|
!tcarg: class | Dtype | list item object
|
||||||
\par example
|
\par example
|
||||||
sort the list in upgoing order using mergesort and the function numbersorter|
|
sort the list in upgoing order using mergesort and the function numbersorter|
|
||||||
|
@ -2149,10 +2149,10 @@ int numbersorter(int a,int b)
|
||||||
if(a == b) return(0);
|
if(a == b) return(0);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
DL_List <int> _intlist; #create a list of integers
|
DL_List <int> _intlist; #create a list of integers
|
||||||
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
DL_Iter<int>* a_listiter=new DL_Iter<int>(&_intlist);
|
||||||
|
|
||||||
a_listiter->insend(2345);
|
a_listiter->insend(2345);
|
||||||
a_listiter->insend(3456);
|
a_listiter->insend(3456);
|
||||||
a_listiter->insend(1234);
|
a_listiter->insend(1234);
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
/*! \file kbool/include/kbool/_dl_itr.h
|
/*! \file kbool/include/kbool/_dl_itr.h
|
||||||
\author Probably Klaas Holwerda
|
\author Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: _dl_itr.h,v 1.3 2008/06/04 21:23:21 titato Exp $
|
RCS-ID: $Id: _dl_itr.h,v 1.5 2009/04/23 19:35:24 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//! author="Klaas Holwerda"
|
//! author="Klaas Holwerda"
|
||||||
|
@ -22,7 +22,9 @@
|
||||||
|
|
||||||
#include "kbool/booleng.h"
|
#include "kbool/booleng.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
#ifndef _STATUS_ENUM
|
#ifndef _STATUS_ENUM
|
||||||
#define _STATUS_ENUM
|
#define _STATUS_ENUM
|
||||||
|
@ -103,7 +105,7 @@ public:
|
||||||
~DL_List();
|
~DL_List();
|
||||||
|
|
||||||
//!Report off List Errors
|
//!Report off List Errors
|
||||||
void Error( const char* function, Lerror a_error );
|
void Error( string function, Lerror a_error );
|
||||||
|
|
||||||
//!Number of items in the list
|
//!Number of items in the list
|
||||||
int count();
|
int count();
|
||||||
|
@ -168,7 +170,7 @@ public:
|
||||||
~DL_Iter();
|
~DL_Iter();
|
||||||
|
|
||||||
//!Report off Iterator Errors
|
//!Report off Iterator Errors
|
||||||
void Error( const char* function, Lerror a_error );
|
void Error( string function, Lerror a_error );
|
||||||
|
|
||||||
//!This attaches an iterator to a list of a given type.
|
//!This attaches an iterator to a list of a given type.
|
||||||
void Attach( DL_List<Dtype>* newlist );
|
void Attach( DL_List<Dtype>* newlist );
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: _lnk_itr.cpp,v 1.3 2006/12/13 21:43:33 titato Exp $
|
RCS-ID: $Id: _lnk_itr.cpp,v 1.4 2009/02/06 21:33:03 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __UNIX__
|
#ifdef __UNIX__
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
/*! \file kbool/include/kbool/_lnk_itr.h
|
/*! \file kbool/include/kbool/_lnk_itr.h
|
||||||
\author Probably Klaas Holwerda
|
\author Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: _lnk_itr.h,v 1.2 2006/12/15 21:00:05 titato Exp $
|
RCS-ID: $Id: _lnk_itr.h,v 1.3 2009/02/06 21:33:03 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//! author="Klaas Holwerda"
|
//! author="Klaas Holwerda"
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
/*! \file include/booleng.h
|
/*! \file include/booleng.h
|
||||||
\author Klaas Holwerda
|
\author Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Klaas Holwerda
|
Copyright: 2001-2004 (C) Klaas Holwerda
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: booleng.h,v 1.4 2008/09/05 19:01:14 titato Exp $
|
RCS-ID: $Id: booleng.h,v 1.6 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef BOOLENG_H
|
#ifndef BOOLENG_H
|
||||||
|
@ -19,9 +19,13 @@
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
#if 0 // Kicad does not use kbool in dll version
|
#if 0 // Kicad does not use kbool in dll version
|
||||||
|
|
||||||
#if defined(__WXMSW__)
|
#if defined(__WXMSW__)
|
||||||
/*
|
/*
|
||||||
__declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
|
__declspec works in BC++ 5 and later, Watcom C++ 11.0 and later as well
|
||||||
|
@ -58,6 +62,7 @@
|
||||||
# define WXEXPORT __declspec(dllexport)
|
# define WXEXPORT __declspec(dllexport)
|
||||||
# define WXIMPORT __declspec(dllimport)
|
# define WXIMPORT __declspec(dllimport)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // if 0 for kicad
|
#endif // if 0 for kicad
|
||||||
|
|
||||||
/* for other platforms/compilers we don't anything */
|
/* for other platforms/compilers we don't anything */
|
||||||
|
@ -80,13 +85,13 @@
|
||||||
#define A2DKBOOLDLLEXP_CTORFN
|
#define A2DKBOOLDLLEXP_CTORFN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define KBOOL_VERSION "1.9"
|
#define KBOOL_VERSION "2.0"
|
||||||
|
|
||||||
#define KBOOL_DEBUG 0
|
#define KBOOL_DEBUG 0
|
||||||
#define KBOOL_LOG 0
|
#define KBOOL_LOG 0
|
||||||
#define KBOOL_INT64 1
|
#define KBOOL_INT64 1
|
||||||
|
|
||||||
class KBoolLink;
|
class kbLink;
|
||||||
|
|
||||||
#define LINELENGTH 200
|
#define LINELENGTH 200
|
||||||
|
|
||||||
|
@ -163,17 +168,17 @@ B_INT bmax( B_INT value1, B_INT value2 );
|
||||||
class A2DKBOOLDLLEXP Bool_Engine_Error
|
class A2DKBOOLDLLEXP Bool_Engine_Error
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Bool_Engine_Error( const char* message, const char* header = 0, int degree = 9, int fatal = 0 );
|
Bool_Engine_Error( string message, string header = 0, int degree = 9, int fatal = 0 );
|
||||||
Bool_Engine_Error( const Bool_Engine_Error& a );
|
Bool_Engine_Error( const Bool_Engine_Error& a );
|
||||||
~Bool_Engine_Error();
|
~Bool_Engine_Error();
|
||||||
char* GetErrorMessage();
|
string GetErrorMessage();
|
||||||
char* GetHeaderMessage();
|
string GetHeaderMessage();
|
||||||
int GetErrorDegree();
|
int GetErrorDegree();
|
||||||
int GetFatal();
|
int GetFatal();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
char* _message;
|
string _message;
|
||||||
char* _header;
|
string _header;
|
||||||
int _degree;
|
int _degree;
|
||||||
int _fatal;
|
int _fatal;
|
||||||
};
|
};
|
||||||
|
@ -207,10 +212,10 @@ enum BOOL_OP
|
||||||
BOOL_MAKERING /*!< create a ring on all polygons */
|
BOOL_MAKERING /*!< create a ring on all polygons */
|
||||||
};
|
};
|
||||||
|
|
||||||
class GraphList;
|
class kbGraphList;
|
||||||
class Graph;
|
class kbGraph;
|
||||||
class KBoolLink;
|
class kbLink;
|
||||||
class Node;
|
class kbNode;
|
||||||
template<class Type> class TDLI;
|
template<class Type> class TDLI;
|
||||||
|
|
||||||
//! boolean engine to perform operation on two sets of polygons.
|
//! boolean engine to perform operation on two sets of polygons.
|
||||||
|
@ -220,7 +225,7 @@ template<class Type> class TDLI;
|
||||||
The boolean operation ( BOOL_OR, BOOL_AND, BOOL_EXOR, BOOL_A_SUB_B, BOOL_B_SUB_A )
|
The boolean operation ( BOOL_OR, BOOL_AND, BOOL_EXOR, BOOL_A_SUB_B, BOOL_B_SUB_A )
|
||||||
are based on the two sets of polygons in group A and B.
|
are based on the two sets of polygons in group A and B.
|
||||||
The other operation on group A only.
|
The other operation on group A only.
|
||||||
|
|
||||||
At the end of the operation the resulting polygons can be extracted.
|
At the end of the operation the resulting polygons can be extracted.
|
||||||
*/
|
*/
|
||||||
class A2DKBOOLDLLEXP Bool_Engine
|
class A2DKBOOLDLLEXP Bool_Engine
|
||||||
|
@ -234,16 +239,16 @@ public:
|
||||||
//! destructor
|
//! destructor
|
||||||
virtual ~Bool_Engine();
|
virtual ~Bool_Engine();
|
||||||
|
|
||||||
const char* GetVersion() { return KBOOL_VERSION; }
|
string GetVersion() { return KBOOL_VERSION; }
|
||||||
|
|
||||||
//! reports progress of algorithm.
|
//! reports progress of algorithm.
|
||||||
virtual void SetState( const char* = 0 );
|
virtual void SetState( string );
|
||||||
|
|
||||||
//! called at an internal error.
|
//! called at an internal error.
|
||||||
virtual void error( const char *text, const char *title );
|
virtual void error( string text, string title );
|
||||||
|
|
||||||
//! called at an internal generated possible error.
|
//! called at an internal generated possible error.
|
||||||
virtual void info( const char *text, const char *title );
|
virtual void info( string text, string title );
|
||||||
|
|
||||||
bool Do_Operation( BOOL_OP operation );
|
bool Do_Operation( BOOL_OP operation );
|
||||||
|
|
||||||
|
@ -252,7 +257,7 @@ public:
|
||||||
/*
|
/*
|
||||||
The algorithm takes into account gaps and inaccuracies caused by rounding to integer coordinates
|
The algorithm takes into account gaps and inaccuracies caused by rounding to integer coordinates
|
||||||
in the original data.
|
in the original data.
|
||||||
Imagine two rectangles one with a side ( 0,0 ) ( 2.0, 17.0 )
|
Imagine two rectangles one with a side ( 0,0 ) ( 2.0, 17.0 )
|
||||||
and the other has a side ( 0,0 ) ( 1.0, 8.5 )
|
and the other has a side ( 0,0 ) ( 1.0, 8.5 )
|
||||||
If for some reason those coordinates where round to ( 0,0 ) ( 2, 17 ) ( 0,0 ) ( 1, 9 ),
|
If for some reason those coordinates where round to ( 0,0 ) ( 2, 17 ) ( 0,0 ) ( 1, 9 ),
|
||||||
there will be clearly a gap or overlap that was not intended.
|
there will be clearly a gap or overlap that was not intended.
|
||||||
|
@ -275,8 +280,8 @@ public:
|
||||||
Grid makes sure that the integer data used within the algorithm has room for extra intersections
|
Grid makes sure that the integer data used within the algorithm has room for extra intersections
|
||||||
smaller than the smallest number within the input data.
|
smaller than the smallest number within the input data.
|
||||||
The input data scaled up with DGrid is related to the accuracy the user has in his input data.
|
The input data scaled up with DGrid is related to the accuracy the user has in his input data.
|
||||||
Another scaling with Grid is applied on top of it to create space in the integer number for
|
Another scaling with Grid is applied on top of it to create space in the integer number for
|
||||||
even smaller numbers.
|
even smaller numbers.
|
||||||
*/
|
*/
|
||||||
void SetGrid( B_INT grid );
|
void SetGrid( B_INT grid );
|
||||||
|
|
||||||
|
@ -294,7 +299,7 @@ public:
|
||||||
doubles, part of the integers used in vertexes within the boolean algorithm.
|
doubles, part of the integers used in vertexes within the boolean algorithm.
|
||||||
And therefore DGRID bigger than 1 is not usefull, you would only loose accuracy.
|
And therefore DGRID bigger than 1 is not usefull, you would only loose accuracy.
|
||||||
Within the algorithm all input data is multiplied with DGRID, and the result
|
Within the algorithm all input data is multiplied with DGRID, and the result
|
||||||
is rounded to an integer.
|
is rounded to an integer.
|
||||||
*/
|
*/
|
||||||
void SetDGrid( double dgrid );
|
void SetDGrid( double dgrid );
|
||||||
|
|
||||||
|
@ -405,7 +410,7 @@ public:
|
||||||
|
|
||||||
//! if set true holes are linked into outer contours by double overlapping segments.
|
//! if set true holes are linked into outer contours by double overlapping segments.
|
||||||
/*!
|
/*!
|
||||||
This mode is needed when the software using the boolean algorithm does
|
This mode is needed when the software using the boolean algorithm does
|
||||||
not understand hole polygons. In that case a contour and its holes form one
|
not understand hole polygons. In that case a contour and its holes form one
|
||||||
polygon. In cases where software understands the concept of holes, contours
|
polygon. In cases where software understands the concept of holes, contours
|
||||||
are clockwise oriented, while holes are anticlockwise oriented.
|
are clockwise oriented, while holes are anticlockwise oriented.
|
||||||
|
@ -422,13 +427,13 @@ public:
|
||||||
void SetLog( bool OnOff );
|
void SetLog( bool OnOff );
|
||||||
|
|
||||||
//! used to write to log file
|
//! used to write to log file
|
||||||
void Write_Log( const char * );
|
void Write_Log( string);
|
||||||
//! used to write to log file
|
//! used to write to log file
|
||||||
void Write_Log( const char *, const char * );
|
void Write_Log( string, string );
|
||||||
//! used to write to log file
|
//! used to write to log file
|
||||||
void Write_Log( const char *, double );
|
void Write_Log( string, double );
|
||||||
//! used to write to log file
|
//! used to write to log file
|
||||||
void Write_Log( const char *, B_INT );
|
void Write_Log( string, B_INT );
|
||||||
|
|
||||||
FILE* GetLogFile() { return m_logfile; }
|
FILE* GetLogFile() { return m_logfile; }
|
||||||
|
|
||||||
|
@ -445,11 +450,11 @@ public:
|
||||||
if (booleng->StartPolygonAdd(GROUP_A))
|
if (booleng->StartPolygonAdd(GROUP_A))
|
||||||
{
|
{
|
||||||
booleng->AddPoint(100,100);
|
booleng->AddPoint(100,100);
|
||||||
booleng->AddPoint(-100,100);
|
booleng->AddPoint(-100,100);
|
||||||
booleng->AddPoint(-100,-100);
|
booleng->AddPoint(-100,-100);
|
||||||
booleng->AddPoint(100,-100);
|
booleng->AddPoint(100,-100);
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
|
|
||||||
\param A_or_B defines if the new polygon will be of group A or B
|
\param A_or_B defines if the new polygon will be of group A or B
|
||||||
|
|
||||||
|
@ -457,7 +462,7 @@ public:
|
||||||
to another polygon added.
|
to another polygon added.
|
||||||
So the contour polygon ClockWise, then add counterclockwise polygons for holes, and visa versa.
|
So the contour polygon ClockWise, then add counterclockwise polygons for holes, and visa versa.
|
||||||
BUT only if m_orientationEntryMode is set true, else all polygons are redirected, and become
|
BUT only if m_orientationEntryMode is set true, else all polygons are redirected, and become
|
||||||
individual areas without holes.
|
individual areas without holes.
|
||||||
Holes in such a case must be linked into the contour using two extra segments.
|
Holes in such a case must be linked into the contour using two extra segments.
|
||||||
*/
|
*/
|
||||||
bool StartPolygonAdd( GroupType A_or_B );
|
bool StartPolygonAdd( GroupType A_or_B );
|
||||||
|
@ -492,8 +497,8 @@ public:
|
||||||
//! see StartPolygonGet
|
//! see StartPolygonGet
|
||||||
/*!
|
/*!
|
||||||
This iterates through the first graph in the graphlist.
|
This iterates through the first graph in the graphlist.
|
||||||
Setting the current Node properly by following the links in the graph
|
Setting the current kbNode properly by following the links in the graph
|
||||||
through its nodes.
|
through its nodes.
|
||||||
*/
|
*/
|
||||||
bool PolygonHasMorePoints();
|
bool PolygonHasMorePoints();
|
||||||
|
|
||||||
|
@ -526,7 +531,7 @@ private:
|
||||||
bool m_doLog;
|
bool m_doLog;
|
||||||
|
|
||||||
//! contains polygons in graph form
|
//! contains polygons in graph form
|
||||||
GraphList* m_graphlist;
|
kbGraphList* m_graphlist;
|
||||||
|
|
||||||
double m_MARGE;
|
double m_MARGE;
|
||||||
B_INT m_GRID;
|
B_INT m_GRID;
|
||||||
|
@ -544,21 +549,21 @@ private:
|
||||||
bool m_doLinkHoles;
|
bool m_doLinkHoles;
|
||||||
|
|
||||||
//! used in the StartPolygonAdd, AddPt, EndPolygonAdd sequence
|
//! used in the StartPolygonAdd, AddPt, EndPolygonAdd sequence
|
||||||
Graph* m_GraphToAdd;
|
kbGraph* m_GraphToAdd;
|
||||||
//! used in the StartPolygonAdd, AddPt, EndPolygonAdd sequence
|
//! used in the StartPolygonAdd, AddPt, EndPolygonAdd sequence
|
||||||
Node* m_lastNodeToAdd;
|
kbNode* m_lastNodeToAdd;
|
||||||
//! used in the StartPolygonAdd, AddPt, EndPolygonAdd sequence
|
//! used in the StartPolygonAdd, AddPt, EndPolygonAdd sequence
|
||||||
Node* m_firstNodeToAdd;
|
kbNode* m_firstNodeToAdd;
|
||||||
|
|
||||||
//! the current group type ( group A or B )
|
//! the current group type ( group A or B )
|
||||||
GroupType m_groupType;
|
GroupType m_groupType;
|
||||||
|
|
||||||
//! used in extracting the points from the resultant polygons
|
//! used in extracting the points from the resultant polygons
|
||||||
Graph* m_getGraph;
|
kbGraph* m_getGraph;
|
||||||
//! used in extracting the points from the resultant polygons
|
//! used in extracting the points from the resultant polygons
|
||||||
KBoolLink* m_getLink;
|
kbLink* m_getLink;
|
||||||
//! used in extracting the points from the resultant polygons
|
//! used in extracting the points from the resultant polygons
|
||||||
Node* m_getNode;
|
kbNode* m_getNode;
|
||||||
//! used in extracting the points from the resultant polygons
|
//! used in extracting the points from the resultant polygons
|
||||||
double m_PolygonXPoint;
|
double m_PolygonXPoint;
|
||||||
//! used in extracting the points from the resultant polygons
|
//! used in extracting the points from the resultant polygons
|
||||||
|
@ -572,8 +577,8 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! use in Node to iterate links.
|
//! use in kbNode to iterate links.
|
||||||
TDLI<KBoolLink>* _linkiter;
|
TDLI<kbLink>* _linkiter;
|
||||||
|
|
||||||
//! how many time run intersections fase.
|
//! how many time run intersections fase.
|
||||||
unsigned int m_intersectionruns;
|
unsigned int m_intersectionruns;
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: graph.h,v 1.3 2008/06/04 21:23:21 titato Exp $
|
RCS-ID: $Id: graph.h,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* @@(#) $Source: /cvsroot/wxart2d/wxArt2D/thirdparty/kbool/include/kbool/graph.h,v $ $Revision: 1.3 $ $Date: 2008/06/04 21:23:21 $ */
|
/* @@(#) $Source: /cvsroot/wxart2d/wxArt2D/thirdparty/kbool/include/kbool/graph.h,v $ $Revision: 1.4 $ $Date: 2009/09/07 19:23:28 $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Program GRAPH.H
|
Program GRAPH.H
|
||||||
|
@ -25,23 +25,23 @@ Last Update 03-04-1996
|
||||||
#include "kbool/line.h"
|
#include "kbool/line.h"
|
||||||
#include "kbool/scanbeam.h"
|
#include "kbool/scanbeam.h"
|
||||||
|
|
||||||
class Node;
|
class kbNode;
|
||||||
|
|
||||||
class GraphList;
|
class kbGraphList;
|
||||||
|
|
||||||
//! one graph containing links that cab be connected.
|
//! one graph containing links that cab be connected.
|
||||||
class A2DKBOOLDLLEXP Graph
|
class A2DKBOOLDLLEXP kbGraph
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Bool_Engine* _GC;
|
Bool_Engine* _GC;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Graph( Bool_Engine* GC );
|
kbGraph( Bool_Engine* GC );
|
||||||
Graph( KBoolLink*, Bool_Engine* GC );
|
kbGraph( kbLink*, Bool_Engine* GC );
|
||||||
|
|
||||||
Graph( Graph* other );
|
kbGraph( kbGraph* other );
|
||||||
|
|
||||||
~Graph();
|
~kbGraph();
|
||||||
|
|
||||||
bool GetBin() { return _bin; };
|
bool GetBin() { return _bin; };
|
||||||
void SetBin( bool b ) { _bin = b; };
|
void SetBin( bool b ) { _bin = b; };
|
||||||
|
@ -51,10 +51,10 @@ public:
|
||||||
void Rotate( bool plus90 );
|
void Rotate( bool plus90 );
|
||||||
|
|
||||||
//! adds a link to the linklist
|
//! adds a link to the linklist
|
||||||
void AddLink( Node *begin, Node *end );
|
void AddLink( kbNode *begin, kbNode *end );
|
||||||
|
|
||||||
//! adds a link to the linklist
|
//! adds a link to the linklist
|
||||||
void AddLink( KBoolLink *a_link );
|
void AddLink( kbLink *a_link );
|
||||||
|
|
||||||
bool AreZeroLines( B_INT Marge );
|
bool AreZeroLines( B_INT Marge );
|
||||||
|
|
||||||
|
@ -79,42 +79,42 @@ public:
|
||||||
// Remove unused links
|
// Remove unused links
|
||||||
void ReverseAllLinks();
|
void ReverseAllLinks();
|
||||||
|
|
||||||
//! Simplify the graph
|
//! Simplify the kbGraph
|
||||||
bool Simplify( B_INT Marge );
|
bool Simplify( B_INT Marge );
|
||||||
|
|
||||||
|
|
||||||
//! Takes over all links of the argument
|
//! Takes over all links of the argument
|
||||||
bool Smoothen( B_INT Marge );
|
bool Smoothen( B_INT Marge );
|
||||||
|
|
||||||
void TakeOver( Graph* );
|
void TakeOver( kbGraph* );
|
||||||
|
|
||||||
//! function for maximum performance
|
//! function for maximum performance
|
||||||
|
|
||||||
//! Get the First link from the graph
|
//! Get the First link from the kbGraph
|
||||||
KBoolLink* GetFirstLink();
|
kbLink* GetFirstLink();
|
||||||
Node* GetTopNode();
|
kbNode* GetTopNode();
|
||||||
void SetBeenHere( bool );
|
void SetBeenHere( bool );
|
||||||
void Reset_flags();
|
void Reset_flags();
|
||||||
|
|
||||||
//! Set the group of a graph
|
//! Set the group of a kbGraph
|
||||||
void SetGroup( GroupType );
|
void SetGroup( GroupType );
|
||||||
|
|
||||||
//! Set the number of the graph
|
//! Set the number of the kbGraph
|
||||||
void SetNumber( int );
|
void SetNumber( int );
|
||||||
void Reset_Mark_and_Bin();
|
void Reset_Mark_and_Bin();
|
||||||
bool GetBeenHere();
|
bool GetBeenHere();
|
||||||
int GetGraphNum();
|
int GetGraphNum();
|
||||||
int GetNumberOfLinks();
|
int GetNumberOfLinks();
|
||||||
|
|
||||||
void Boolean( BOOL_OP operation, GraphList* Result );
|
void Boolean( BOOL_OP operation, kbGraphList* Result );
|
||||||
void Correction( GraphList* Result, double factor );
|
void Correction( kbGraphList* Result, double factor );
|
||||||
void MakeRing( GraphList* Result, double factor );
|
void MakeRing( kbGraphList* Result, double factor );
|
||||||
void CreateRing( GraphList *ring, double factor );
|
void CreateRing( kbGraphList *ring, double factor );
|
||||||
void CreateRing_fast( GraphList *ring, double factor );
|
void CreateRing_fast( kbGraphList *ring, double factor );
|
||||||
void CreateArc( Node* center, KBoolLine* incoming, Node* end, double radius, double aber );
|
void CreateArc( kbNode* center, kbLine* incoming, kbNode* end, double radius, double aber );
|
||||||
void CreateArc( Node* center, Node* begin, Node* end, double radius, bool clock, double aber );
|
void CreateArc( kbNode* center, kbNode* begin, kbNode* end, double radius, bool clock, double aber );
|
||||||
void MakeOneDirection();
|
void MakeOneDirection();
|
||||||
void Make_Rounded_Shape( KBoolLink* a_link, double factor );
|
void Make_Rounded_Shape( kbLink* a_link, double factor );
|
||||||
bool MakeClockWise();
|
bool MakeClockWise();
|
||||||
bool writegraph( bool linked );
|
bool writegraph( bool linked );
|
||||||
bool writeintersections();
|
bool writeintersections();
|
||||||
|
@ -137,7 +137,7 @@ protected:
|
||||||
void Extract_Simples( BOOL_OP operation, bool detecthole, bool& foundholes );
|
void Extract_Simples( BOOL_OP operation, bool detecthole, bool& foundholes );
|
||||||
|
|
||||||
//! split graph into small graph, using the numbers in links.
|
//! split graph into small graph, using the numbers in links.
|
||||||
void Split( GraphList* partlist );
|
void Split( kbGraphList* partlist );
|
||||||
|
|
||||||
//! Collect a graph by starting at argument link
|
//! Collect a graph by starting at argument link
|
||||||
/*
|
/*
|
||||||
|
@ -150,16 +150,16 @@ protected:
|
||||||
\param graphnumber number to be given to links in the extracted graph piece
|
\param graphnumber number to be given to links in the extracted graph piece
|
||||||
\param foundholes when holes are found this flag is set true.
|
\param foundholes when holes are found this flag is set true.
|
||||||
*/
|
*/
|
||||||
void CollectGraph( Node *current_node, BOOL_OP operation, bool detecthole, int graphnumber, bool& foundholes );
|
void CollectGraph( kbNode *current_node, BOOL_OP operation, bool detecthole, int graphnumber, bool& foundholes );
|
||||||
|
|
||||||
void CollectGraphLast( Node *current_node, BOOL_OP operation, bool detecthole, int graphnumber, bool& foundholes );
|
void CollectGraphLast( kbNode *current_node, BOOL_OP operation, bool detecthole, int graphnumber, bool& foundholes );
|
||||||
|
|
||||||
//! find a link not bin in the top left corner ( links should be sorted already )
|
//! find a link not bin in the top left corner ( links should be sorted already )
|
||||||
/*!
|
/*!
|
||||||
Last found position is used to find it quickly.
|
Last found position is used to find it quickly.
|
||||||
Used in ExtractSimples()
|
Used in ExtractSimples()
|
||||||
*/
|
*/
|
||||||
Node* GetMostTopLeft( TDLI<KBoolLink>* _LI );
|
kbNode* GetMostTopLeft( TDLI<kbLink>* _LI );
|
||||||
|
|
||||||
//! calculates crossing for all links in a graph, and add those as part of the graph.
|
//! calculates crossing for all links in a graph, and add those as part of the graph.
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -28,21 +28,21 @@ Last Update 11-03-1996
|
||||||
class Debug_driver;
|
class Debug_driver;
|
||||||
|
|
||||||
|
|
||||||
class A2DKBOOLDLLEXP GraphList: public DL_List<void*>
|
class A2DKBOOLDLLEXP kbGraphList: public DL_List<void*>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Bool_Engine* _GC;
|
Bool_Engine* _GC;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
GraphList( Bool_Engine* GC );
|
kbGraphList( Bool_Engine* GC );
|
||||||
|
|
||||||
GraphList( GraphList* other );
|
kbGraphList( kbGraphList* other );
|
||||||
|
|
||||||
~GraphList();
|
~kbGraphList();
|
||||||
|
|
||||||
void MakeOneGraph( Graph *total );
|
void MakeOneGraph( kbGraph *total );
|
||||||
|
|
||||||
void Prepare( Graph *total );
|
void Prepare( kbGraph *total );
|
||||||
void MakeRings();
|
void MakeRings();
|
||||||
void Correction();
|
void Correction();
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: line.h,v 1.3 2008/06/04 21:23:21 titato Exp $
|
RCS-ID: $Id: line.h,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef LINE_H
|
#ifndef LINE_H
|
||||||
|
@ -20,72 +20,72 @@ class A2DKBOOLDLLEXP Bool_Engine;
|
||||||
// Status of a point to a line
|
// Status of a point to a line
|
||||||
enum PointStatus {LEFT_SIDE, RIGHT_SIDE, ON_AREA, IN_AREA};
|
enum PointStatus {LEFT_SIDE, RIGHT_SIDE, ON_AREA, IN_AREA};
|
||||||
|
|
||||||
class A2DKBOOLDLLEXP Graph;
|
class A2DKBOOLDLLEXP kbGraph;
|
||||||
|
|
||||||
class A2DKBOOLDLLEXP KBoolLine
|
class A2DKBOOLDLLEXP kbLine
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Bool_Engine* m_GC;
|
Bool_Engine* m_GC;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// constructors and destructor
|
// constructors and destructor
|
||||||
KBoolLine( Bool_Engine* GC );
|
kbLine( Bool_Engine* GC );
|
||||||
KBoolLine( KBoolLink*, Bool_Engine* GC );
|
kbLine( kbLink*, Bool_Engine* GC );
|
||||||
~KBoolLine();
|
~kbLine();
|
||||||
|
|
||||||
void Set( KBoolLink * );
|
void Set( kbLink * );
|
||||||
KBoolLink* GetLink();
|
kbLink* GetLink();
|
||||||
|
|
||||||
//! Get the beginnode from a line
|
//! Get the beginnode from a line
|
||||||
Node* GetBeginNode();
|
kbNode* GetBeginNode();
|
||||||
|
|
||||||
//! Get the endnode from a line
|
//! Get the endnode from a line
|
||||||
Node* GetEndNode();
|
kbNode* GetEndNode();
|
||||||
|
|
||||||
//! Check if two lines intersects
|
//! Check if two lines intersects
|
||||||
int CheckIntersect( KBoolLine*, double Marge );
|
int CheckIntersect( kbLine*, double Marge );
|
||||||
|
|
||||||
//! Intersects two lines
|
//! Intersects two lines
|
||||||
int Intersect( KBoolLine*, double Marge );
|
int Intersect( kbLine*, double Marge );
|
||||||
int Intersect_simple( KBoolLine * lijn );
|
int Intersect_simple( kbLine * lijn );
|
||||||
bool Intersect2( Node* crossing, KBoolLine * lijn );
|
bool Intersect2( kbNode* crossing, kbLine * lijn );
|
||||||
|
|
||||||
//!For an infinite line
|
//!For an infinite line
|
||||||
PointStatus PointOnLine( Node* a_node, double& Distance, double Marge );
|
PointStatus PointOnLine( kbNode* a_node, double& Distance, double Marge );
|
||||||
|
|
||||||
//!For a non-infinite line
|
//!For a non-infinite line
|
||||||
PointStatus PointInLine( Node* a_node, double& Distance, double Marge );
|
PointStatus PointInLine( kbNode* a_node, double& Distance, double Marge );
|
||||||
|
|
||||||
//! Caclulate Y if X is known
|
//! Caclulate Y if X is known
|
||||||
B_INT Calculate_Y( B_INT X );
|
B_INT Calculate_Y( B_INT X );
|
||||||
B_INT Calculate_Y_from_X( B_INT X );
|
B_INT Calculate_Y_from_X( B_INT X );
|
||||||
void Virtual_Point( LPoint *a_point, double distance );
|
void Virtual_Point( kbLPoint *a_point, double distance );
|
||||||
|
|
||||||
//! assignment operator
|
//! assignment operator
|
||||||
KBoolLine& operator=( const KBoolLine& );
|
kbLine& operator=( const kbLine& );
|
||||||
|
|
||||||
Node* OffsetContour( KBoolLine* const nextline, Node* last_ins, double factor, Graph *shape );
|
kbNode* OffsetContour( kbLine* const nextline, kbNode* last_ins, double factor, kbGraph *shape );
|
||||||
Node* OffsetContour_rounded( KBoolLine* const nextline, Node* _last_ins, double factor, Graph *shape );
|
kbNode* OffsetContour_rounded( kbLine* const nextline, kbNode* _last_ins, double factor, kbGraph *shape );
|
||||||
bool OkeForContour( KBoolLine* const nextline, double factor, Node* LastLeft, Node* LastRight, LinkStatus& _outproduct );
|
bool OkeForContour( kbLine* const nextline, double factor, kbNode* LastLeft, kbNode* LastRight, LinkStatus& _outproduct );
|
||||||
bool Create_Ring_Shape( KBoolLine* nextline, Node** _last_ins_left, Node** _last_ins_right, double factor, Graph *shape );
|
bool Create_Ring_Shape( kbLine* nextline, kbNode** _last_ins_left, kbNode** _last_ins_right, double factor, kbGraph *shape );
|
||||||
void Create_Begin_Shape( KBoolLine* nextline, Node** _last_ins_left, Node** _last_ins_right, double factor, Graph *shape );
|
void Create_Begin_Shape( kbLine* nextline, kbNode** _last_ins_left, kbNode** _last_ins_right, double factor, kbGraph *shape );
|
||||||
void Create_End_Shape( KBoolLine* nextline, Node* _last_ins_left, Node* _last_ins_right, double factor, Graph *shape );
|
void Create_End_Shape( kbLine* nextline, kbNode* _last_ins_left, kbNode* _last_ins_right, double factor, kbGraph *shape );
|
||||||
|
|
||||||
//! Calculate the parameters if nessecary
|
//! Calculate the parameters if nessecary
|
||||||
void CalculateLineParameters();
|
void CalculateLineParameters();
|
||||||
|
|
||||||
//! Adds a crossing between the intersecting lines
|
//! Adds a crossing between the intersecting lines
|
||||||
void AddLineCrossing( B_INT , B_INT , KBoolLine * );
|
void AddLineCrossing( B_INT , B_INT , kbLine * );
|
||||||
|
|
||||||
void AddCrossing( Node *a_node );
|
void AddCrossing( kbNode *a_node );
|
||||||
Node* AddCrossing( B_INT X, B_INT Y );
|
kbNode* AddCrossing( B_INT X, B_INT Y );
|
||||||
bool ProcessCrossings( TDLI<KBoolLink>* _LI );
|
bool ProcessCrossings( TDLI<kbLink>* _LI );
|
||||||
|
|
||||||
// Linecrosslist
|
// Linecrosslist
|
||||||
void SortLineCrossings();
|
void SortLineCrossings();
|
||||||
bool CrossListEmpty();
|
bool CrossListEmpty();
|
||||||
DL_List<void*>* GetCrossList();
|
DL_List<void*>* GetCrossList();
|
||||||
// bool HasInCrossList(Node*);
|
// bool HasInCrossList(kbNode*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -94,10 +94,10 @@ private:
|
||||||
//! Function needed for Intersect
|
//! Function needed for Intersect
|
||||||
int ActionOnTable2( PointStatus, PointStatus );
|
int ActionOnTable2( PointStatus, PointStatus );
|
||||||
|
|
||||||
double m_AA;
|
double m_AA;
|
||||||
double m_BB;
|
double m_BB;
|
||||||
double m_CC;
|
double m_CC;
|
||||||
KBoolLink* m_link;
|
kbLink* m_link;
|
||||||
bool m_valid_parameters;
|
bool m_valid_parameters;
|
||||||
|
|
||||||
//! List with crossings through this link
|
//! List with crossings through this link
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: link.h,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: link.h,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef LINK_H
|
#ifndef LINK_H
|
||||||
|
@ -17,53 +17,53 @@
|
||||||
|
|
||||||
enum LinkStatus {IS_LEFT, IS_ON, IS_RIGHT};
|
enum LinkStatus {IS_LEFT, IS_ON, IS_RIGHT};
|
||||||
|
|
||||||
class LPoint;
|
class kbLPoint;
|
||||||
class Node;
|
class kbNode;
|
||||||
class Record;
|
class kbRecord;
|
||||||
|
|
||||||
//! segment within a graph
|
//! segment within a graph
|
||||||
/*
|
/*
|
||||||
A Graph contains a list of KBoolLink, the KBoolLink or connected by Node's.
|
A Graph contains a list of kbLink, the kbLink or connected by Node's.
|
||||||
Several KBoolLink can be connected to one Node.
|
Several kbLink can be connected to one Node.
|
||||||
A KBoolLink has a direction defined by its begin and end node.
|
A kbLink has a direction defined by its begin and end node.
|
||||||
Node do have a list of connected KBoolLink's.
|
Node do have a list of connected kbLink's.
|
||||||
So one can walk trough a graph in two ways:
|
So one can walk trough a graph in two ways:
|
||||||
1- via its KBoolLink list
|
1- via its kbLink list
|
||||||
2- via the node connected to the KBoolLink's
|
2- via the node connected to the kbLink's
|
||||||
*/
|
*/
|
||||||
class A2DKBOOLDLLEXP KBoolLink
|
class A2DKBOOLDLLEXP kbLink
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Bool_Engine* _GC;
|
Bool_Engine* _GC;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! contructors
|
//! contructors
|
||||||
KBoolLink( Bool_Engine* GC );
|
kbLink( Bool_Engine* GC );
|
||||||
|
|
||||||
//! contructors
|
//! contructors
|
||||||
KBoolLink( int graphnr, Node* begin, Node* end, Bool_Engine* GC );
|
kbLink( int graphnr, kbNode* begin, kbNode* end, Bool_Engine* GC );
|
||||||
|
|
||||||
//! contructors
|
//! contructors
|
||||||
KBoolLink( Node *begin, Node *end, Bool_Engine* GC );
|
kbLink( kbNode *begin, kbNode *end, Bool_Engine* GC );
|
||||||
|
|
||||||
//! destructors
|
//! destructors
|
||||||
~KBoolLink();
|
~kbLink();
|
||||||
|
|
||||||
|
|
||||||
//! Merges the other node with argument
|
//! Merges the other node with argument
|
||||||
void MergeNodes( Node* const );
|
void MergeNodes( kbNode* const );
|
||||||
|
|
||||||
//! outproduct of two links
|
//! outproduct of two links
|
||||||
LinkStatus OutProduct( KBoolLink* const two, double accur );
|
LinkStatus OutProduct( kbLink* const two, double accur );
|
||||||
|
|
||||||
//! link three compared to this and two
|
//! link three compared to this and two
|
||||||
LinkStatus PointOnCorner( KBoolLink* const, KBoolLink* const );
|
LinkStatus PointOnCorner( kbLink* const, kbLink* const );
|
||||||
|
|
||||||
//! Removes argument from the link
|
//! Removes argument from the link
|
||||||
void Remove( Node* );
|
void Remove( kbNode* );
|
||||||
|
|
||||||
//! replaces olddone in the link by newnode
|
//! replaces olddone in the link by newnode
|
||||||
void Replace( Node* oldnode, Node* newnode );
|
void Replace( kbNode* oldnode, kbNode* newnode );
|
||||||
|
|
||||||
//!top hole marking
|
//!top hole marking
|
||||||
void SetTopHole( bool value );
|
void SetTopHole( bool value );
|
||||||
|
@ -97,15 +97,15 @@ public:
|
||||||
void UnLink();
|
void UnLink();
|
||||||
|
|
||||||
//! functions for maximum performance
|
//! functions for maximum performance
|
||||||
Node* GetBeginNode();
|
kbNode* GetBeginNode();
|
||||||
|
|
||||||
//! Datamember access functions
|
//! Datamember access functions
|
||||||
Node* GetEndNode();
|
kbNode* GetEndNode();
|
||||||
Node* GetLowNode();
|
kbNode* GetLowNode();
|
||||||
Node* GetHighNode();
|
kbNode* GetHighNode();
|
||||||
|
|
||||||
//! Returns a next link beginning with argument
|
//! Returns a next link beginning with argument
|
||||||
KBoolLink* Forth( Node* );
|
kbLink* Forth( kbNode* );
|
||||||
|
|
||||||
int GetGraphNum();
|
int GetGraphNum();
|
||||||
bool GetInc();
|
bool GetInc();
|
||||||
|
@ -113,10 +113,10 @@ public:
|
||||||
bool GetLeftB();
|
bool GetLeftB();
|
||||||
bool GetRightA();
|
bool GetRightA();
|
||||||
bool GetRightB();
|
bool GetRightB();
|
||||||
void GetLRO( LPoint*, int&, int&, double );
|
void GetLRO( kbLPoint*, int&, int&, double );
|
||||||
|
|
||||||
//! Return a node not equal to arg.
|
//! Return a node not equal to arg.
|
||||||
Node* GetOther( const Node* const );
|
kbNode* GetOther( const kbNode* const );
|
||||||
//! Is this link unused ?
|
//! Is this link unused ?
|
||||||
bool IsUnused();
|
bool IsUnused();
|
||||||
|
|
||||||
|
@ -143,10 +143,10 @@ public:
|
||||||
bool ShorterThan( B_INT marge );
|
bool ShorterThan( B_INT marge );
|
||||||
|
|
||||||
//! Resets the link
|
//! Resets the link
|
||||||
void Reset( Node* begin, Node* end, int graphnr = 0 );
|
void Reset( kbNode* begin, kbNode* end, int graphnr = 0 );
|
||||||
void Set( Node* begin, Node* end );
|
void Set( kbNode* begin, kbNode* end );
|
||||||
void SetBeginNode( Node* );
|
void SetBeginNode( kbNode* );
|
||||||
void SetEndNode( Node* );
|
void SetEndNode( kbNode* );
|
||||||
void SetGraphNum( int );
|
void SetGraphNum( int );
|
||||||
void SetInc( bool );
|
void SetInc( bool );
|
||||||
void SetLeftA( bool );
|
void SetLeftA( bool );
|
||||||
|
@ -162,18 +162,18 @@ public:
|
||||||
void Reset_flags();
|
void Reset_flags();
|
||||||
|
|
||||||
//!put in this direction
|
//!put in this direction
|
||||||
void Redirect( Node* a_node );
|
void Redirect( kbNode* a_node );
|
||||||
|
|
||||||
void TakeOverOperationFlags( KBoolLink* link );
|
void TakeOverOperationFlags( kbLink* link );
|
||||||
|
|
||||||
void SetRecordNode( DL_Node<Record*>* recordNode ) { m_record = recordNode; }
|
void SetRecordNode( DL_Node<kbRecord*>* recordNode ) { m_record = recordNode; }
|
||||||
|
|
||||||
DL_Node<Record*>* GetRecordNode() { return m_record; }
|
DL_Node<kbRecord*>* GetRecordNode() { return m_record; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
//! The mainitems of a link
|
//! The mainitems of a link
|
||||||
Node *m_beginnode, *m_endnode;
|
kbNode *m_beginnode, *m_endnode;
|
||||||
//! Marker for walking over the graph
|
//! Marker for walking over the graph
|
||||||
bool m_bin : 1;
|
bool m_bin : 1;
|
||||||
//! Is this a part of hole ?
|
//! Is this a part of hole ?
|
||||||
|
@ -223,7 +223,7 @@ GroupType m_group : 1;
|
||||||
//! belongs to this polygon part in the graph.
|
//! belongs to this polygon part in the graph.
|
||||||
int m_graphnum;
|
int m_graphnum;
|
||||||
|
|
||||||
DL_Node<Record*>* m_record;
|
DL_Node<kbRecord*>* m_record;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,35 +21,35 @@ Last Update 12-12-1995
|
||||||
|
|
||||||
#include "kbool/booleng.h"
|
#include "kbool/booleng.h"
|
||||||
|
|
||||||
class A2DKBOOLDLLEXP LPoint
|
class A2DKBOOLDLLEXP kbLPoint
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LPoint();
|
kbLPoint();
|
||||||
LPoint( B_INT const , B_INT const );
|
kbLPoint( B_INT const , B_INT const );
|
||||||
LPoint( LPoint* const );
|
kbLPoint( kbLPoint* const );
|
||||||
|
|
||||||
void Set( const B_INT, const B_INT );
|
void Set( const B_INT, const B_INT );
|
||||||
void Set( const LPoint & );
|
void Set( const kbLPoint & );
|
||||||
|
|
||||||
LPoint GetPoint();
|
kbLPoint GetPoint();
|
||||||
B_INT GetX();
|
B_INT GetX();
|
||||||
B_INT GetY();
|
B_INT GetY();
|
||||||
void SetX( B_INT );
|
void SetX( B_INT );
|
||||||
void SetY( B_INT );
|
void SetY( B_INT );
|
||||||
bool Equal( const LPoint a_point, B_INT Marge );
|
bool Equal( const kbLPoint a_point, B_INT Marge );
|
||||||
bool Equal( const B_INT, const B_INT , B_INT Marge );
|
bool Equal( const B_INT, const B_INT , B_INT Marge );
|
||||||
bool ShorterThan( const LPoint a_point, B_INT marge );
|
bool ShorterThan( const kbLPoint a_point, B_INT marge );
|
||||||
bool ShorterThan( const B_INT X, const B_INT Y, B_INT );
|
bool ShorterThan( const B_INT X, const B_INT Y, B_INT );
|
||||||
|
|
||||||
LPoint &operator=( const LPoint & );
|
kbLPoint &operator=( const kbLPoint & );
|
||||||
LPoint &operator+( const LPoint & );
|
kbLPoint &operator+( const kbLPoint & );
|
||||||
LPoint &operator-( const LPoint & );
|
kbLPoint &operator-( const kbLPoint & );
|
||||||
|
|
||||||
LPoint &operator*( int );
|
kbLPoint &operator*( int );
|
||||||
LPoint &operator/( int );
|
kbLPoint &operator/( int );
|
||||||
|
|
||||||
int operator==( const LPoint & ) const;
|
int operator==( const kbLPoint & ) const;
|
||||||
int operator!=( const LPoint & ) const;
|
int operator!=( const kbLPoint & ) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
B_INT _x;
|
B_INT _x;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: node.h,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: node.h,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NODE_H
|
#ifndef NODE_H
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
enum NodePosition { N_LEFT, N_ON, N_RIGHT};
|
enum NodePosition { N_LEFT, N_ON, N_RIGHT};
|
||||||
|
|
||||||
class A2DKBOOLDLLEXP Node : public LPoint
|
class A2DKBOOLDLLEXP kbNode : public kbLPoint
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Bool_Engine* _GC;
|
Bool_Engine* _GC;
|
||||||
|
@ -31,52 +31,52 @@ public:
|
||||||
friend class Debug_driver;
|
friend class Debug_driver;
|
||||||
|
|
||||||
// constructors and destructors
|
// constructors and destructors
|
||||||
Node( Bool_Engine* GC );
|
kbNode( Bool_Engine* GC );
|
||||||
|
|
||||||
Node( const B_INT, const B_INT, Bool_Engine* GC );
|
kbNode( const B_INT, const B_INT, Bool_Engine* GC );
|
||||||
|
|
||||||
Node( LPoint* const a_point, Bool_Engine* GC );
|
kbNode( kbLPoint* const a_point, Bool_Engine* GC );
|
||||||
Node( Node * const, Bool_Engine* GC );
|
kbNode( kbNode * const, Bool_Engine* GC );
|
||||||
Node& operator=( const Node &other_node );
|
kbNode& operator=( const kbNode &other_node );
|
||||||
~Node();
|
~kbNode();
|
||||||
|
|
||||||
//public member functions
|
//public member functions
|
||||||
void AddLink( KBoolLink* );
|
void AddLink( kbLink* );
|
||||||
DL_List<void*>* GetLinklist();
|
DL_List<void*>* GetLinklist();
|
||||||
|
|
||||||
//! check two link for its operation flags to be the same when coming from the prev link.
|
//! check two link for its operation flags to be the same when coming from the prev link.
|
||||||
bool SameSides( KBoolLink* const prev , KBoolLink* const link, BOOL_OP operation );
|
bool SameSides( kbLink* const prev , kbLink* const link, BOOL_OP operation );
|
||||||
|
|
||||||
//! get the link most right or left to the current link, but with the specific operation
|
//! get the link most right or left to the current link, but with the specific operation
|
||||||
/*! flags the same on the sides of the new link.
|
/*! flags the same on the sides of the new link.
|
||||||
*/
|
*/
|
||||||
KBoolLink* GetMost( KBoolLink* const prev , LinkStatus whatside, BOOL_OP operation );
|
kbLink* GetMost( kbLink* const prev , LinkStatus whatside, BOOL_OP operation );
|
||||||
|
|
||||||
//! get link that is leading to a hole ( hole segment or linking segment )
|
//! get link that is leading to a hole ( hole segment or linking segment )
|
||||||
KBoolLink* GetMostHole( KBoolLink* const prev , LinkStatus whatside, BOOL_OP operation );
|
kbLink* GetMostHole( kbLink* const prev , LinkStatus whatside, BOOL_OP operation );
|
||||||
|
|
||||||
//! get link that is not vertical.
|
//! get link that is not vertical.
|
||||||
KBoolLink* GetNotFlat();
|
kbLink* GetNotFlat();
|
||||||
|
|
||||||
//! get a link to a hole or from a hole.
|
//! get a link to a hole or from a hole.
|
||||||
KBoolLink* GetHoleLink( KBoolLink* const prev, bool checkbin, BOOL_OP operation );
|
kbLink* GetHoleLink( kbLink* const prev, bool checkbin, BOOL_OP operation );
|
||||||
|
|
||||||
int Merge( Node* );
|
int Merge( kbNode* );
|
||||||
void RemoveLink( KBoolLink* );
|
void RemoveLink( kbLink* );
|
||||||
bool Simplify( Node* First, Node* Second, B_INT Marge );
|
bool Simplify( kbNode* First, kbNode* Second, B_INT Marge );
|
||||||
|
|
||||||
// memberfunctions for maximum performance
|
// memberfunctions for maximum performance
|
||||||
void RoundInt( B_INT grid );
|
void RoundInt( B_INT grid );
|
||||||
KBoolLink* GetIncomingLink();
|
kbLink* GetIncomingLink();
|
||||||
|
|
||||||
int GetNumberOfLinks();
|
int GetNumberOfLinks();
|
||||||
KBoolLink* GetNextLink();
|
kbLink* GetNextLink();
|
||||||
KBoolLink* GetOtherLink( KBoolLink* );
|
kbLink* GetOtherLink( kbLink* );
|
||||||
KBoolLink* GetOutgoingLink();
|
kbLink* GetOutgoingLink();
|
||||||
KBoolLink* GetPrevLink();
|
kbLink* GetPrevLink();
|
||||||
|
|
||||||
KBoolLink* Follow( KBoolLink* const prev );
|
kbLink* Follow( kbLink* const prev );
|
||||||
KBoolLink* GetBinHighest( bool binset );
|
kbLink* GetBinHighest( bool binset );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DL_List<void*>* _linklist;
|
DL_List<void*>* _linklist;
|
||||||
|
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: record.h,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: record.h,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RECORD_H
|
#ifndef RECORD_H
|
||||||
#define RECORD_H
|
#define RECORD_H
|
||||||
|
|
||||||
class Node;
|
class kbNode;
|
||||||
#include "kbool/booleng.h"
|
#include "kbool/booleng.h"
|
||||||
|
|
||||||
#include "kbool/link.h"
|
#include "kbool/link.h"
|
||||||
|
@ -24,30 +24,30 @@ enum DIRECTION {GO_LEFT, GO_RIGHT};
|
||||||
//extern void DeleteRecordPool();
|
//extern void DeleteRecordPool();
|
||||||
class A2DKBOOLDLLEXP Bool_Engine;
|
class A2DKBOOLDLLEXP Bool_Engine;
|
||||||
|
|
||||||
class A2DKBOOLDLLEXP Record
|
class A2DKBOOLDLLEXP kbRecord
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Bool_Engine* _GC;
|
Bool_Engine* _GC;
|
||||||
public:
|
public:
|
||||||
// void deletepool();
|
// void deletepool();
|
||||||
|
|
||||||
Record( KBoolLink* link, Bool_Engine* GC );
|
kbRecord( kbLink* link, Bool_Engine* GC );
|
||||||
|
|
||||||
~Record();
|
~kbRecord();
|
||||||
|
|
||||||
// void* operator new(size_t size);
|
// void* operator new(size_t size);
|
||||||
|
|
||||||
// void operator delete(void* recordptr);
|
// void operator delete(void* recordptr);
|
||||||
|
|
||||||
void SetNewLink( KBoolLink* link );
|
void SetNewLink( kbLink* link );
|
||||||
|
|
||||||
void Set_Flags();
|
void Set_Flags();
|
||||||
|
|
||||||
void Calc_Ysp( Node* low );
|
void Calc_Ysp( kbNode* low );
|
||||||
|
|
||||||
KBoolLink* GetLink();
|
kbLink* GetLink();
|
||||||
|
|
||||||
KBoolLine* GetLine();
|
kbLine* GetLine();
|
||||||
|
|
||||||
B_INT Ysp();
|
B_INT Ysp();
|
||||||
|
|
||||||
|
@ -55,12 +55,12 @@ public:
|
||||||
|
|
||||||
DIRECTION Direction();
|
DIRECTION Direction();
|
||||||
|
|
||||||
bool Calc_Left_Right( Record* record_above_me );
|
bool Calc_Left_Right( kbRecord* record_above_me );
|
||||||
|
|
||||||
bool Equal( Record* );
|
bool Equal( kbRecord* );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
KBoolLine _line;
|
kbLine _line;
|
||||||
|
|
||||||
B_INT _ysp;
|
B_INT _ysp;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: scanbeam.h,v 1.4 2008/09/05 19:01:14 titato Exp $
|
RCS-ID: $Id: scanbeam.h,v 1.5 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SCANBEAM_H
|
#ifndef SCANBEAM_H
|
||||||
|
@ -20,10 +20,10 @@
|
||||||
enum SCANTYPE{NODELINK, LINKLINK, GENLR, LINKHOLES, INOUT};
|
enum SCANTYPE{NODELINK, LINKLINK, GENLR, LINKHOLES, INOUT};
|
||||||
|
|
||||||
#if defined(WXART2D_USINGDLL)
|
#if defined(WXART2D_USINGDLL)
|
||||||
template class A2DKBOOLDLLEXP DL_Iter<Record*>;
|
template class A2DKBOOLDLLEXP DL_Iter<kbRecord*>;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class A2DKBOOLDLLEXP ScanBeam : public DL_List<Record*>
|
class A2DKBOOLDLLEXP ScanBeam : public DL_List<kbRecord*>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
Bool_Engine* _GC;
|
Bool_Engine* _GC;
|
||||||
|
@ -31,26 +31,26 @@ protected:
|
||||||
public:
|
public:
|
||||||
ScanBeam( Bool_Engine* GC );
|
ScanBeam( Bool_Engine* GC );
|
||||||
~ScanBeam();
|
~ScanBeam();
|
||||||
void SetType( Node* low, Node* high );
|
void SetType( kbNode* low, kbNode* high );
|
||||||
|
|
||||||
bool FindNew( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes );
|
bool FindNew( SCANTYPE scantype, TDLI<kbLink>* _I, bool& holes );
|
||||||
bool RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes );
|
bool RemoveOld( SCANTYPE scantype, TDLI<kbLink>* _I, bool& holes );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool ProcessHoles( bool atinsert, TDLI<KBoolLink>* _LI );
|
bool ProcessHoles( bool atinsert, TDLI<kbLink>* _LI );
|
||||||
int Process_LinkToLink_Crossings(); // find crossings
|
int Process_LinkToLink_Crossings(); // find crossings
|
||||||
int Process_PointToLink_Crossings();
|
int Process_PointToLink_Crossings();
|
||||||
int Process_LinkToLink_Flat( KBoolLine* flatline );
|
int Process_LinkToLink_Flat( kbLine* flatline );
|
||||||
void SortTheBeam( bool backangle );
|
void SortTheBeam( bool backangle );
|
||||||
bool checksort();
|
bool checksort();
|
||||||
bool writebeam();
|
bool writebeam();
|
||||||
void Calc_Ysp();
|
void Calc_Ysp();
|
||||||
//int FindCloseLinksAndCross(TDLI<KBoolLink>* _I,Node* _lowf);
|
//int FindCloseLinksAndCross(TDLI<kbLink>* _I,kbNode* _lowf);
|
||||||
void Generate_INOUT( int graphnumber );
|
void Generate_INOUT( int graphnumber );
|
||||||
|
|
||||||
Node* _low;
|
kbNode* _low;
|
||||||
DL_Iter<Record*> _BI;
|
DL_Iter<kbRecord*> _BI;
|
||||||
int lastinserted;
|
int lastinserted;
|
||||||
BEAM_TYPE _type;
|
BEAM_TYPE _type;
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: statusb.h,v 1.2 2006/12/15 21:00:06 titato Exp $
|
RCS-ID: $Id: statusb.h,v 1.3 2009/02/06 21:33:03 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* @@(#) $Source: /cvsroot/wxart2d/wxArt2D/thirdparty/kbool/include/kbool/statusb.h,v $ $Revision: 1.2 $ $Date: 2006/12/15 21:00:06 $ */
|
/* @@(#) $Source: /cvsroot/wxart2d/wxArt2D/thirdparty/kbool/include/kbool/statusb.h,v $ $Revision: 1.3 $ $Date: 2009/02/06 21:33:03 $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Program STATUSB.H
|
Program STATUSB.H
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: valuesvc.h,v 1.1 2006/11/04 21:49:01 titato Exp $
|
RCS-ID: $Id: valuesvc.h,v 1.2 2009/02/06 21:33:03 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,17 +1,14 @@
|
||||||
/*! \file kbool/samples/boolonly/boolonly.cpp
|
/*! \file samples/boolonly/boolonly.cpp
|
||||||
\brief boolonly demonstrates the use of the boolean algorithm
|
\brief boolonly demonstrates the use of the boolean algorithm
|
||||||
\author Probably Klaas Holwerda
|
\author Probably Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: boolonly.cpp,v 1.9 2005/01/16 18:39:24 kire_putsje Exp $
|
RCS-ID: $Id: boolonly.cpp,v 1.7 2009/05/28 19:49:48 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __GNUG__
|
|
||||||
#pragma implementation
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "boolonly.h"
|
#include "boolonly.h"
|
||||||
|
|
||||||
|
@ -24,7 +21,7 @@ KBoolPoint::KBoolPoint()
|
||||||
_y = 0.0;
|
_y = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
KBoolPoint::KBoolPoint(double const X, double const Y)
|
KBoolPoint::KBoolPoint( double const X, double const Y )
|
||||||
{
|
{
|
||||||
_x = X;
|
_x = X;
|
||||||
_y = Y;
|
_y = Y;
|
||||||
|
@ -48,23 +45,23 @@ void ArmBoolEng( Bool_Engine* booleng )
|
||||||
// set some global vals to arm the boolean engine
|
// set some global vals to arm the boolean engine
|
||||||
double DGRID = 1000; // round coordinate X or Y value in calculations to this
|
double DGRID = 1000; // round coordinate X or Y value in calculations to this
|
||||||
double MARGE = 0.001; // snap with in this range points to lines in the intersection routines
|
double MARGE = 0.001; // snap with in this range points to lines in the intersection routines
|
||||||
// should always be > DGRID a MARGE >= 10*DGRID is oke
|
// should always be > DGRID a MARGE >= 10*DGRID is oke
|
||||||
// this is also used to remove small segments and to decide when
|
// this is also used to remove small segments and to decide when
|
||||||
// two segments are in line.
|
// two segments are in line.
|
||||||
double CORRECTIONFACTOR = 500.0; // correct the polygons by this number
|
double CORRECTIONFACTOR = 500.0; // correct the polygons by this number
|
||||||
double CORRECTIONABER = 1.0; // the accuracy for the rounded shapes used in correction
|
double CORRECTIONABER = 1.0; // the accuracy for the rounded shapes used in correction
|
||||||
double ROUNDFACTOR = 1.5; // when will we round the correction shape to a circle
|
double ROUNDFACTOR = 1.5; // when will we round the correction shape to a circle
|
||||||
double SMOOTHABER = 10.0; // accuracy when smoothing a polygon
|
double SMOOTHABER = 10.0; // accuracy when smoothing a polygon
|
||||||
double MAXLINEMERGE = 1000.0; // leave as is, segments of this length in smoothen
|
double MAXLINEMERGE = 1000.0; // leave as is, segments of this length in smoothen
|
||||||
|
|
||||||
|
|
||||||
// DGRID is only meant to make fractional parts of input data which
|
|
||||||
|
// DGRID is only meant to make fractional parts of input data which
|
||||||
// are doubles, part of the integers used in vertexes within the boolean algorithm.
|
// are doubles, part of the integers used in vertexes within the boolean algorithm.
|
||||||
// Within the algorithm all input data is multiplied with DGRID
|
// Within the algorithm all input data is multiplied with DGRID
|
||||||
|
|
||||||
// space for extra intersection inside the boolean algorithms
|
// space for extra intersection inside the boolean algorithms
|
||||||
// only change this if there are problems
|
// only change this if there are problems
|
||||||
int GRID =10000;
|
int GRID = 10000;
|
||||||
|
|
||||||
booleng->SetMarge( MARGE );
|
booleng->SetMarge( MARGE );
|
||||||
booleng->SetGrid( GRID );
|
booleng->SetGrid( GRID );
|
||||||
|
@ -87,19 +84,21 @@ void AddPolygonsToBoolEng2( Bool_Engine* booleng )
|
||||||
int numRowsAndCols = 120;
|
int numRowsAndCols = 120;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for ( i = 0; i < numRowsAndCols; i++) {
|
for ( i = 0; i < numRowsAndCols; i++ )
|
||||||
for ( j = 0; j < numRowsAndCols; j++) {
|
{
|
||||||
|
for ( j = 0; j < numRowsAndCols; j++ )
|
||||||
|
{
|
||||||
// foreach point in a polygon ...
|
// foreach point in a polygon ...
|
||||||
if (booleng->StartPolygonAdd(GROUP_A))
|
if ( booleng->StartPolygonAdd( GROUP_A ) )
|
||||||
{
|
{
|
||||||
// Counter-Clockwise
|
// Counter-Clockwise
|
||||||
booleng->AddPoint(x1,y1);
|
booleng->AddPoint( x1, y1 );
|
||||||
booleng->AddPoint(x2,y1);
|
booleng->AddPoint( x2, y1 );
|
||||||
booleng->AddPoint(x2,y2);
|
booleng->AddPoint( x2, y2 );
|
||||||
booleng->AddPoint(x1,y2);
|
booleng->AddPoint( x1, y2 );
|
||||||
|
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
x1 += pitch1;
|
x1 += pitch1;
|
||||||
x2 += pitch1;
|
x2 += pitch1;
|
||||||
}
|
}
|
||||||
|
@ -116,19 +115,21 @@ void AddPolygonsToBoolEng2( Bool_Engine* booleng )
|
||||||
y1 = 150;
|
y1 = 150;
|
||||||
y2 = 250;
|
y2 = 250;
|
||||||
|
|
||||||
for ( i = 0; i < numRowsAndCols; i++) {
|
for ( i = 0; i < numRowsAndCols; i++ )
|
||||||
for ( int j = 0; j < numRowsAndCols; j++) {
|
{
|
||||||
|
for ( int j = 0; j < numRowsAndCols; j++ )
|
||||||
|
{
|
||||||
// foreach point in a polygon ...
|
// foreach point in a polygon ...
|
||||||
if (booleng->StartPolygonAdd(GROUP_B))
|
if ( booleng->StartPolygonAdd( GROUP_B ) )
|
||||||
{
|
{
|
||||||
// Counter Clockwise
|
// Counter Clockwise
|
||||||
booleng->AddPoint(x1,y1);
|
booleng->AddPoint( x1, y1 );
|
||||||
booleng->AddPoint(x2,y1);
|
booleng->AddPoint( x2, y1 );
|
||||||
booleng->AddPoint(x2,y2);
|
booleng->AddPoint( x2, y2 );
|
||||||
booleng->AddPoint(x1,y2);
|
booleng->AddPoint( x1, y2 );
|
||||||
|
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
x1 += pitch1;
|
x1 += pitch1;
|
||||||
x2 += pitch1;
|
x2 += pitch1;
|
||||||
}
|
}
|
||||||
|
@ -145,68 +146,68 @@ void AddPolygonsToBoolEng2( Bool_Engine* booleng )
|
||||||
void AddPolygonsToBoolEng( Bool_Engine* booleng )
|
void AddPolygonsToBoolEng( Bool_Engine* booleng )
|
||||||
{
|
{
|
||||||
// foreach point in a polygon ...
|
// foreach point in a polygon ...
|
||||||
if (booleng->StartPolygonAdd(GROUP_A))
|
if ( booleng->StartPolygonAdd( GROUP_A ) )
|
||||||
{
|
{
|
||||||
booleng->AddPoint( 28237.480000, 396.364000 );
|
booleng->AddPoint( 28237.480000, 396.364000 );
|
||||||
booleng->AddPoint( 28237.980000, 394.121000 );
|
booleng->AddPoint( 28237.980000, 394.121000 );
|
||||||
booleng->AddPoint( 28242.000000, 395.699000 );
|
booleng->AddPoint( 28242.000000, 395.699000 );
|
||||||
booleng->AddPoint( 28240.830000, 397.679000 );
|
booleng->AddPoint( 28240.830000, 397.679000 );
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
|
|
||||||
// foreach point in a polygon ...
|
// foreach point in a polygon ...
|
||||||
if (booleng->StartPolygonAdd(GROUP_B))
|
if ( booleng->StartPolygonAdd( GROUP_B ) )
|
||||||
{
|
{
|
||||||
booleng->AddPoint( 28242.100000, 398.491000 );
|
booleng->AddPoint( 28242.100000, 398.491000 );
|
||||||
booleng->AddPoint( 28240.580000, 397.485000 );
|
booleng->AddPoint( 28240.580000, 397.485000 );
|
||||||
booleng->AddPoint( 28237.910000, 394.381000 );
|
booleng->AddPoint( 28237.910000, 394.381000 );
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
|
|
||||||
if (booleng->StartPolygonAdd(GROUP_B))
|
if ( booleng->StartPolygonAdd( GROUP_B ) )
|
||||||
{
|
{
|
||||||
booleng->AddPoint( 28243.440000, 399.709000 );
|
booleng->AddPoint( 28243.440000, 399.709000 );
|
||||||
booleng->AddPoint( 28237.910000, 394.381000 );
|
booleng->AddPoint( 28237.910000, 394.381000 );
|
||||||
booleng->AddPoint( 28239.290000, 394.763000 );
|
booleng->AddPoint( 28239.290000, 394.763000 );
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddPolygonsToBoolEng3( Bool_Engine* booleng )
|
void AddPolygonsToBoolEng3( Bool_Engine* booleng )
|
||||||
{
|
{
|
||||||
// foreach point in a polygon ...
|
// foreach point in a polygon ...
|
||||||
if (booleng->StartPolygonAdd(GROUP_A))
|
if ( booleng->StartPolygonAdd( GROUP_A ) )
|
||||||
{
|
{
|
||||||
booleng->AddPoint(100,100);
|
booleng->AddPoint( 100, 100 );
|
||||||
booleng->AddPoint(-100,100);
|
booleng->AddPoint( -100, 100 );
|
||||||
booleng->AddPoint(-100,-100);
|
booleng->AddPoint( -100, -100 );
|
||||||
booleng->AddPoint(100,-100);
|
booleng->AddPoint( 100, -100 );
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
|
|
||||||
// foreach point in a polygon ...
|
// foreach point in a polygon ...
|
||||||
if (booleng->StartPolygonAdd(GROUP_B))
|
if ( booleng->StartPolygonAdd( GROUP_B ) )
|
||||||
{
|
{
|
||||||
booleng->AddPoint(50,50);
|
booleng->AddPoint( 50, 50 );
|
||||||
booleng->AddPoint(-50,50);
|
booleng->AddPoint( -50, 50 );
|
||||||
booleng->AddPoint(-50,-50);
|
booleng->AddPoint( -50, -50 );
|
||||||
booleng->AddPoint(50,-50);
|
booleng->AddPoint( 50, -50 );
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddPolygonsToBoolEng4( Bool_Engine* booleng )
|
void AddPolygonsToBoolEng4( Bool_Engine* booleng )
|
||||||
{
|
{
|
||||||
// foreach point in a polygon ...
|
// foreach point in a polygon ...
|
||||||
if (booleng->StartPolygonAdd(GROUP_A))
|
if ( booleng->StartPolygonAdd( GROUP_A ) )
|
||||||
{
|
{
|
||||||
booleng->AddPoint(0,0);
|
booleng->AddPoint( 0, 0 );
|
||||||
booleng->AddPoint(0,1000);
|
booleng->AddPoint( 0, 1000 );
|
||||||
booleng->AddPoint(1000,1000);
|
booleng->AddPoint( 1000, 1000 );
|
||||||
booleng->AddPoint(1000,0);
|
booleng->AddPoint( 1000, 0 );
|
||||||
}
|
}
|
||||||
booleng->EndPolygonAdd();
|
booleng->EndPolygonAdd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetPolygonsFromBoolEng( Bool_Engine* booleng )
|
void GetPolygonsFromBoolEng( Bool_Engine* booleng )
|
||||||
|
@ -217,8 +218,8 @@ void GetPolygonsFromBoolEng( Bool_Engine* booleng )
|
||||||
// foreach point in the polygon
|
// foreach point in the polygon
|
||||||
while ( booleng->PolygonHasMorePoints() )
|
while ( booleng->PolygonHasMorePoints() )
|
||||||
{
|
{
|
||||||
fprintf(stderr,"x = %f\t", booleng->GetPolygonXPoint());
|
fprintf( stderr, "x = %f\t", booleng->GetPolygonXPoint() );
|
||||||
fprintf(stderr,"y = %f\n", booleng->GetPolygonYPoint());
|
fprintf( stderr, "y = %f\n", booleng->GetPolygonYPoint() );
|
||||||
}
|
}
|
||||||
booleng->EndPolygonGet();
|
booleng->EndPolygonGet();
|
||||||
}
|
}
|
||||||
|
@ -226,143 +227,147 @@ void GetPolygonsFromBoolEng( Bool_Engine* booleng )
|
||||||
|
|
||||||
void GetPolygonsFromBoolEngKEY( Bool_Engine* booleng )
|
void GetPolygonsFromBoolEngKEY( Bool_Engine* booleng )
|
||||||
{
|
{
|
||||||
FILE* file = fopen("keyfile.key", "w");
|
FILE * file = fopen( "keyfile.key", "w" );
|
||||||
|
|
||||||
fprintf(file,"\
|
fprintf( file, "\
|
||||||
HEADER 5; \
|
HEADER 5; \
|
||||||
BGNLIB; \
|
BGNLIB; \
|
||||||
LASTMOD {2-11-15 15:39:21}; \
|
LASTMOD {2-11-15 15:39:21}; \
|
||||||
LASTACC {2-11-15 15:39:21}; \
|
LASTACC {2-11-15 15:39:21}; \
|
||||||
LIBNAME trial; \
|
LIBNAME trial; \
|
||||||
UNITS; \
|
UNITS; \
|
||||||
USERUNITS 0.0001; PHYSUNITS 2.54e-009; \
|
USERUNITS 0.0001; PHYSUNITS 2.54e-009; \
|
||||||
\
|
\
|
||||||
BGNSTR; \
|
BGNSTR; \
|
||||||
CREATION {2-11-15 15:39:21}; \
|
CREATION {2-11-15 15:39:21}; \
|
||||||
LASTMOD {2-11-15 15:39:21}; \
|
LASTMOD {2-11-15 15:39:21}; \
|
||||||
STRNAME top; \
|
STRNAME top; \
|
||||||
");
|
");
|
||||||
// foreach resultant polygon in the booleng ...
|
// foreach resultant polygon in the booleng ...
|
||||||
while ( booleng->StartPolygonGet() )
|
while ( booleng->StartPolygonGet() )
|
||||||
{
|
{
|
||||||
fprintf(file,"BOUNDARY; LAYER 2; DATATYPE 0;\n");
|
fprintf(file,"BOUNDARY; LAYER 2; DATATYPE 0;\n");
|
||||||
fprintf(file," XY %d; \n",booleng->GetNumPointsInPolygon()+1 );
|
fprintf(file," XY % d; \n",booleng->GetNumPointsInPolygon()+1 );
|
||||||
|
|
||||||
booleng->PolygonHasMorePoints();
|
booleng->PolygonHasMorePoints();
|
||||||
double firstx = booleng->GetPolygonXPoint();
|
double firstx = booleng->GetPolygonXPoint();
|
||||||
double firsty = booleng->GetPolygonYPoint();
|
double firsty = booleng->GetPolygonYPoint();
|
||||||
fprintf(file,"X %f;\t", firstx);
|
fprintf(file,"X % f;\t", firstx);
|
||||||
fprintf(file,"Y %f; \n", firsty);
|
fprintf(file,"Y % f; \n", firsty);
|
||||||
|
|
||||||
// foreach point in the polygon
|
// foreach point in the polygon
|
||||||
while ( booleng->PolygonHasMorePoints() )
|
while ( booleng->PolygonHasMorePoints() )
|
||||||
{
|
{
|
||||||
fprintf(file,"X %f;\t", booleng->GetPolygonXPoint());
|
fprintf(file,"X % f;\t", booleng->GetPolygonXPoint());
|
||||||
fprintf(file,"Y %f; \n", booleng->GetPolygonYPoint());
|
fprintf(file,"Y % f; \n", booleng->GetPolygonYPoint());
|
||||||
}
|
}
|
||||||
booleng->EndPolygonGet();
|
booleng->EndPolygonGet();
|
||||||
fprintf(file,"X %f;\t", firstx);
|
fprintf(file,"X % f;\t", firstx);
|
||||||
fprintf(file,"Y %f; \n", firsty);
|
fprintf(file,"Y % f; \n", firsty);
|
||||||
fprintf(file,"ENDEL;\n");
|
fprintf(file,"ENDEL;\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(file,"\
|
fprintf(file,"\
|
||||||
ENDSTR top; \
|
ENDSTR top; \
|
||||||
ENDLIB; \
|
ENDLIB; \
|
||||||
");
|
");
|
||||||
fclose (file);
|
fclose (file);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
printf( "------------------------------------------------------\n" );
|
printf( "------------------------------------------------------\n" );
|
||||||
printf( "| Unit test of the KBool Engine |\n" );
|
printf( " | Unit test of the KBool Engine | \n" );
|
||||||
printf( "------------------------------------------------------\n" );
|
printf( "------------------------------------------------------\n" );
|
||||||
|
|
||||||
float correction;
|
float correction;
|
||||||
char a = '1';
|
char a = '1';
|
||||||
while (a != '0')
|
while (a != '0')
|
||||||
{
|
{
|
||||||
Bool_Engine* booleng = new Bool_Engine();
|
Bool_Engine* booleng = new Bool_Engine();
|
||||||
ArmBoolEng( booleng );
|
ArmBoolEng( booleng );
|
||||||
|
|
||||||
AddPolygonsToBoolEng( booleng );
|
AddPolygonsToBoolEng3( booleng );
|
||||||
|
|
||||||
printf( "\n***********************************\n" );
|
printf( "\n***********************************\n" );
|
||||||
printf( "*** version: %s \n", booleng->GetVersion() );
|
printf( "*** version: % s \n", booleng->GetVersion().c_str() );
|
||||||
printf( "***********************************\n" );
|
printf( "***********************************\n" );
|
||||||
printf( "1: OR operation\n" );
|
printf( "1: OR operation\n" );
|
||||||
printf( "2: AND operation\n" );
|
printf( "2: AND operation\n" );
|
||||||
printf( "3: EXOR operation\n" );
|
printf( "3: EXOR operation\n" );
|
||||||
printf( "4: A subtract B\n" );
|
printf( "4: A subtract B\n" );
|
||||||
printf( "5: B subtract A\n" );
|
printf( "5: B subtract A\n" );
|
||||||
printf( "6: Correct each polygon with a factor\n" );
|
printf( "6: Correct each polygon with a factor\n" );
|
||||||
printf( "7: Smoothen each polygon\n" );
|
printf( "7: Smoothen each polygon\n" );
|
||||||
printf( "8: Make a ring around each polygon\n" );
|
printf( "8: Make a ring around each polygon\n" );
|
||||||
printf( "9: No operation\n" );
|
printf( "9: No operation\n" );
|
||||||
printf( "0: Quit\n" );
|
printf( "0: Quit\n" );
|
||||||
printf( "***********************************\n" );
|
printf( "***********************************\n" );
|
||||||
|
|
||||||
printf( "type a number and <return>" );
|
printf( "type a number and <return>" );
|
||||||
scanf( "%c", &a );
|
scanf("%c", &a, 1);
|
||||||
|
//scanf( " % c", &a );
|
||||||
|
|
||||||
switch (a)
|
switch (a)
|
||||||
{
|
{
|
||||||
case ('0'):
|
case ('0'):
|
||||||
break;
|
{
|
||||||
case ('1'):
|
GetPolygonsFromBoolEng( booleng );
|
||||||
booleng->Do_Operation(BOOL_OR);
|
break;
|
||||||
break;
|
}
|
||||||
case ('2'):
|
case ('1'):
|
||||||
booleng->Do_Operation(BOOL_AND);
|
booleng->Do_Operation(BOOL_OR);
|
||||||
break;
|
break;
|
||||||
case ('3'):
|
case ('2'):
|
||||||
booleng->Do_Operation(BOOL_EXOR);
|
booleng->Do_Operation(BOOL_AND);
|
||||||
break;
|
break;
|
||||||
case ('4'):
|
case ('3'):
|
||||||
booleng->Do_Operation(BOOL_A_SUB_B);
|
booleng->Do_Operation(BOOL_EXOR);
|
||||||
break;
|
break;
|
||||||
case ('5'):
|
case ('4'):
|
||||||
booleng->Do_Operation(BOOL_B_SUB_A);
|
booleng->Do_Operation(BOOL_A_SUB_B);
|
||||||
break;
|
break;
|
||||||
case ('6'):
|
case ('5'):
|
||||||
printf( "give correction factor (eg. 100.0 or -100.0)<return>:");
|
booleng->Do_Operation(BOOL_B_SUB_A);
|
||||||
scanf("%f", &correction ); // correct the polygons by this number
|
break;
|
||||||
booleng->SetCorrectionFactor( correction );
|
case ('6'):
|
||||||
booleng->Do_Operation(BOOL_CORRECTION);
|
printf( "give correction factor ( eg. 100.0 or - 100.0 )<return>: ");
|
||||||
break;
|
scanf(" % f", &correction ); // correct the polygons by this number
|
||||||
case ('7'):
|
booleng->SetCorrectionFactor( correction );
|
||||||
booleng->Do_Operation(BOOL_SMOOTHEN);
|
booleng->Do_Operation(BOOL_CORRECTION);
|
||||||
break;
|
break;
|
||||||
case ('8'):
|
case ('7'):
|
||||||
printf("give width of ring <return>:");
|
booleng->Do_Operation(BOOL_SMOOTHEN);
|
||||||
scanf("%f", &correction );
|
break;
|
||||||
// create a ring of this size
|
case ('8'):
|
||||||
booleng->SetCorrectionFactor( fabs( correction / 2.0) );
|
printf("give width of ring <return>: ");
|
||||||
booleng->Do_Operation(BOOL_MAKERING);
|
scanf(" % f", &correction );
|
||||||
break;
|
// create a ring of this size
|
||||||
case ('9'):
|
booleng->SetCorrectionFactor( fabs( correction / 2.0) );
|
||||||
break;
|
booleng->Do_Operation(BOOL_MAKERING);
|
||||||
default:
|
break;
|
||||||
break;
|
case ('9'):
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a != '0')
|
if (a != '0')
|
||||||
{
|
{
|
||||||
printf("\nresulting polygons\n" );
|
printf("\nresulting polygons\n" );
|
||||||
|
|
||||||
GetPolygonsFromBoolEng( booleng );
|
GetPolygonsFromBoolEng( booleng );
|
||||||
|
|
||||||
//OR USE THIS
|
//OR USE THIS
|
||||||
//GetPolygonsFromBoolEngKEY( booleng );
|
//GetPolygonsFromBoolEngKEY( booleng );
|
||||||
|
|
||||||
printf( "\n\ntype a character and <return>");
|
printf( "\n\ntype a character and <return>");
|
||||||
scanf( "%c", &a );
|
scanf( " % c", &a );
|
||||||
}
|
}
|
||||||
delete booleng;
|
delete booleng;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,28 @@
|
||||||
/*! \file kbool/samples/boolonly/boolonly.h
|
/*! \file kbool/samples/boolonly/boolonly.h
|
||||||
\author Probably Klaas Holwerda
|
\author Probably Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: boolonly.h,v 1.5 2005/05/24 19:13:38 titato Exp $
|
RCS-ID: $Id: boolonly.h,v 1.5 2009/02/06 21:33:03 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#include "kbool/booleng.h"
|
||||||
#pragma implementation
|
#include "kbool/_lnk_itr.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "kbool/include/_lnk_itr.h"
|
|
||||||
#include "kbool/include/booleng.h"
|
|
||||||
|
|
||||||
class KBoolPoint
|
class KBoolPoint
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
KBoolPoint();
|
KBoolPoint();
|
||||||
KBoolPoint(double const ,double const);
|
KBoolPoint( double const , double const );
|
||||||
double GetX();
|
double GetX();
|
||||||
double GetY();
|
double GetY();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double _x;
|
double _x;
|
||||||
double _y;
|
double _y;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
mondrian ICON "sample.ico"
|
||||||
|
#include "wx/msw/wx.rc"
|
|
@ -1,11 +1,11 @@
|
||||||
/*! \file src/booleng.cpp
|
/*! \file src/booleng.cpp
|
||||||
\author Klaas Holwerda
|
\author Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Klaas Holwerda
|
Copyright: 2001-2004 (C) Klaas Holwerda
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: booleng.cpp,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: booleng.cpp,v 1.5 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kbool/booleng.h"
|
#include "kbool/booleng.h"
|
||||||
|
@ -38,19 +38,10 @@ B_INT babs( B_INT a )
|
||||||
//----------------- Bool_Engine_Error -------------------------------/
|
//----------------- Bool_Engine_Error -------------------------------/
|
||||||
//-------------------------------------------------------------------/
|
//-------------------------------------------------------------------/
|
||||||
|
|
||||||
Bool_Engine_Error::Bool_Engine_Error( const char* message, const char* header, int degree, int fatal )
|
Bool_Engine_Error::Bool_Engine_Error( string message, string header, int degree, int fatal )
|
||||||
{
|
{
|
||||||
_message = new char[LINELENGTH];
|
_message = message;
|
||||||
_header = new char[LINELENGTH];
|
_header = header;
|
||||||
if ( message )
|
|
||||||
strcpy( _message, message );
|
|
||||||
else
|
|
||||||
strcpy( _message, "non specified" );
|
|
||||||
|
|
||||||
if ( header )
|
|
||||||
strcpy( _header, header );
|
|
||||||
else
|
|
||||||
strcpy( _header, "non specified" );
|
|
||||||
|
|
||||||
_degree = degree;
|
_degree = degree;
|
||||||
_fatal = fatal;
|
_fatal = fatal;
|
||||||
|
@ -59,17 +50,8 @@ Bool_Engine_Error::Bool_Engine_Error( const char* message, const char* header, i
|
||||||
|
|
||||||
Bool_Engine_Error::Bool_Engine_Error( const Bool_Engine_Error& a )
|
Bool_Engine_Error::Bool_Engine_Error( const Bool_Engine_Error& a )
|
||||||
{
|
{
|
||||||
_message = new char[LINELENGTH];
|
_message = a._message;
|
||||||
_header = new char[LINELENGTH];
|
_header = a._header;
|
||||||
if ( a._message )
|
|
||||||
strcpy( _message, a._message );
|
|
||||||
else
|
|
||||||
strcpy( _message, "non specified" );
|
|
||||||
|
|
||||||
if ( a._header )
|
|
||||||
strcpy( _header, a._header );
|
|
||||||
else
|
|
||||||
strcpy( _header, "non specified" );
|
|
||||||
|
|
||||||
_degree = a._degree;
|
_degree = a._degree;
|
||||||
_fatal = a._fatal;
|
_fatal = a._fatal;
|
||||||
|
@ -78,18 +60,16 @@ Bool_Engine_Error::Bool_Engine_Error( const Bool_Engine_Error& a )
|
||||||
|
|
||||||
Bool_Engine_Error::~Bool_Engine_Error()
|
Bool_Engine_Error::~Bool_Engine_Error()
|
||||||
{
|
{
|
||||||
strcpy( _message, "" );
|
_message = "";
|
||||||
strcpy( _header, "" );
|
_header = "";
|
||||||
delete _message;
|
|
||||||
delete _header;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char* Bool_Engine_Error::GetErrorMessage()
|
string Bool_Engine_Error::GetErrorMessage()
|
||||||
{
|
{
|
||||||
return _message;
|
return _message;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* Bool_Engine_Error::GetHeaderMessage()
|
string Bool_Engine_Error::GetHeaderMessage()
|
||||||
{
|
{
|
||||||
return _header;
|
return _header;
|
||||||
}
|
}
|
||||||
|
@ -110,13 +90,13 @@ int Bool_Engine_Error::GetFatal()
|
||||||
|
|
||||||
Bool_Engine::Bool_Engine()
|
Bool_Engine::Bool_Engine()
|
||||||
{
|
{
|
||||||
_linkiter = new TDLI<KBoolLink>();
|
_linkiter = new TDLI<kbLink>();
|
||||||
m_intersectionruns = 1;
|
m_intersectionruns = 1;
|
||||||
|
|
||||||
m_orientationEntryMode = false;
|
m_orientationEntryMode = false;
|
||||||
m_doLinkHoles = true;
|
m_doLinkHoles = true;
|
||||||
|
|
||||||
m_graphlist = new GraphList( this );
|
m_graphlist = new kbGraphList( this );
|
||||||
m_ACCUR = 1e-4;
|
m_ACCUR = 1e-4;
|
||||||
m_WINDINGRULE = true;
|
m_WINDINGRULE = true;
|
||||||
m_GraphToAdd = NULL;
|
m_GraphToAdd = NULL;
|
||||||
|
@ -173,19 +153,19 @@ void Bool_Engine::SetLog( bool OnOff )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bool_Engine::SetState( const char* process )
|
void Bool_Engine::SetState( string process )
|
||||||
{
|
{
|
||||||
Write_Log( process );
|
Write_Log( process );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bool_Engine::error( const char *text, const char *title )
|
void Bool_Engine::error( string text, string title )
|
||||||
{
|
{
|
||||||
Write_Log( "FATAL ERROR: ", title );
|
Write_Log( "FATAL ERROR: ", title );
|
||||||
Write_Log( "FATAL ERROR: ", text );
|
Write_Log( "FATAL ERROR: ", text );
|
||||||
throw Bool_Engine_Error( " Fatal Error", "Fatal Error", 9, 1 );
|
throw Bool_Engine_Error( " Fatal Error", "Fatal Error", 9, 1 );
|
||||||
};
|
};
|
||||||
|
|
||||||
void Bool_Engine::info( const char *text, const char *title )
|
void Bool_Engine::info( string text, string title )
|
||||||
{
|
{
|
||||||
Write_Log( "FATAL ERROR: ", title );
|
Write_Log( "FATAL ERROR: ", title );
|
||||||
Write_Log( "FATAL ERROR: ", text );
|
Write_Log( "FATAL ERROR: ", text );
|
||||||
|
@ -331,7 +311,7 @@ bool Bool_Engine::Do_Operation( BOOL_OP operation )
|
||||||
{
|
{
|
||||||
|
|
||||||
#if KBOOL_DEBUG
|
#if KBOOL_DEBUG
|
||||||
GraphList * saveme = new GraphList( m_graphlist );
|
kbGraphList * saveme = new kbGraphList( m_graphlist );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
try
|
try
|
||||||
|
@ -366,7 +346,7 @@ bool Bool_Engine::Do_Operation( BOOL_OP operation )
|
||||||
|
|
||||||
#if KBOOL_DEBUG
|
#if KBOOL_DEBUG
|
||||||
delete m_graphlist;
|
delete m_graphlist;
|
||||||
m_graphlist = new GraphList( saveme );
|
m_graphlist = new kbGraphList( saveme );
|
||||||
m_graphlist->WriteGraphsKEY( this );
|
m_graphlist->WriteGraphsKEY( this );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -384,7 +364,7 @@ bool Bool_Engine::Do_Operation( BOOL_OP operation )
|
||||||
|
|
||||||
#if KBOOL_DEBUG
|
#if KBOOL_DEBUG
|
||||||
delete m_graphlist;
|
delete m_graphlist;
|
||||||
m_graphlist = new GraphList( saveme );
|
m_graphlist = new kbGraphList( saveme );
|
||||||
m_graphlist->WriteGraphsKEY( this );
|
m_graphlist->WriteGraphsKEY( this );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -414,7 +394,7 @@ bool Bool_Engine::StartPolygonAdd( GroupType A_or_B )
|
||||||
if ( m_GraphToAdd != NULL )
|
if ( m_GraphToAdd != NULL )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Graph *myGraph = new Graph( this );
|
kbGraph *myGraph = new kbGraph( this );
|
||||||
m_graphlist->insbegin( myGraph );
|
m_graphlist->insbegin( myGraph );
|
||||||
m_GraphToAdd = myGraph;
|
m_GraphToAdd = myGraph;
|
||||||
m_groupType = A_or_B;
|
m_groupType = A_or_B;
|
||||||
|
@ -437,7 +417,7 @@ bool Bool_Engine::AddPoint( double x, double y )
|
||||||
|
|
||||||
B_INT rintx = ( ( B_INT ) ( x * m_DGRID ) ) * m_GRID;
|
B_INT rintx = ( ( B_INT ) ( x * m_DGRID ) ) * m_GRID;
|
||||||
B_INT rinty = ( ( B_INT ) ( y * m_DGRID ) ) * m_GRID;
|
B_INT rinty = ( ( B_INT ) ( y * m_DGRID ) ) * m_GRID;
|
||||||
Node *myNode = new Node( rintx, rinty, this );
|
kbNode *myNode = new kbNode( rintx, rinty, this );
|
||||||
|
|
||||||
// adding first point to graph
|
// adding first point to graph
|
||||||
if ( m_firstNodeToAdd == NULL )
|
if ( m_firstNodeToAdd == NULL )
|
||||||
|
@ -451,8 +431,8 @@ bool Bool_Engine::AddPoint( double x, double y )
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_firstNodeToAdd = ( Node * ) myNode;
|
m_firstNodeToAdd = ( kbNode * ) myNode;
|
||||||
m_lastNodeToAdd = ( Node * ) myNode;
|
m_lastNodeToAdd = ( kbNode * ) myNode;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -466,7 +446,7 @@ bool Bool_Engine::AddPoint( double x, double y )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_GraphToAdd->AddLink( m_lastNodeToAdd, myNode );
|
m_GraphToAdd->AddLink( m_lastNodeToAdd, myNode );
|
||||||
m_lastNodeToAdd = ( Node * ) myNode;
|
m_lastNodeToAdd = ( kbNode * ) myNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -489,7 +469,7 @@ bool Bool_Engine::StartPolygonGet()
|
||||||
{
|
{
|
||||||
if ( !m_graphlist->empty() )
|
if ( !m_graphlist->empty() )
|
||||||
{
|
{
|
||||||
m_getGraph = ( Graph* ) m_graphlist->headitem();
|
m_getGraph = ( kbGraph* ) m_graphlist->headitem();
|
||||||
m_getLink = m_getGraph->GetFirstLink();
|
m_getLink = m_getGraph->GetFirstLink();
|
||||||
m_getNode = m_getLink->GetBeginNode();
|
m_getNode = m_getLink->GetBeginNode();
|
||||||
m_numPtsInPolygon = m_getGraph->GetNumberOfLinks();
|
m_numPtsInPolygon = m_getGraph->GetNumberOfLinks();
|
||||||
|
@ -571,34 +551,34 @@ kbEdgeType Bool_Engine::GetPolygonPointEdgeType()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Bool_Engine::Write_Log( const char *msg1 )
|
void Bool_Engine::Write_Log( string msg1 )
|
||||||
{
|
{
|
||||||
if ( m_logfile == NULL )
|
if ( m_logfile == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fprintf( m_logfile, "%s \n", msg1 );
|
fprintf( m_logfile, "%s \n", msg1.c_str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bool_Engine::Write_Log( const char *msg1, const char*msg2 )
|
void Bool_Engine::Write_Log( string msg1, string msg2 )
|
||||||
{
|
{
|
||||||
if ( m_logfile == NULL )
|
if ( m_logfile == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fprintf( m_logfile, "%s %s\n", msg1, msg2 );
|
fprintf( m_logfile, "%s %s\n", msg1.c_str(), msg2.c_str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bool_Engine::Write_Log( const char *fmt, double dval )
|
void Bool_Engine::Write_Log( string fmt, double dval )
|
||||||
{
|
{
|
||||||
if ( m_logfile == NULL )
|
if ( m_logfile == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fprintf( m_logfile, fmt, dval );
|
fprintf( m_logfile, fmt.c_str(), dval );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bool_Engine::Write_Log( const char *fmt, B_INT bval )
|
void Bool_Engine::Write_Log( string fmt, B_INT bval )
|
||||||
{
|
{
|
||||||
if ( m_logfile == NULL )
|
if ( m_logfile == NULL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fprintf( m_logfile, fmt, bval );
|
fprintf( m_logfile, fmt.c_str(), bval );
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -17,37 +17,37 @@
|
||||||
//this here is to initialize the static iterator of graphlist
|
//this here is to initialize the static iterator of graphlist
|
||||||
//with NOLIST constructor
|
//with NOLIST constructor
|
||||||
|
|
||||||
int graphsorterX( Graph *, Graph * );
|
int graphsorterX( kbGraph *, kbGraph * );
|
||||||
int graphsorterY( Graph *, Graph * );
|
int graphsorterY( kbGraph *, kbGraph * );
|
||||||
|
|
||||||
GraphList::GraphList( Bool_Engine* GC )
|
kbGraphList::kbGraphList( Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphList::GraphList( GraphList* other )
|
kbGraphList::kbGraphList( kbGraphList* other )
|
||||||
{
|
{
|
||||||
_GC = other->_GC;
|
_GC = other->_GC;
|
||||||
|
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( other );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( other );
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while ( !_LI.hitroot() )
|
while ( !_LI.hitroot() )
|
||||||
{
|
{
|
||||||
insend( new Graph( _LI.item() ) );
|
insend( new kbGraph( _LI.item() ) );
|
||||||
_LI++;
|
_LI++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphList::~GraphList()
|
kbGraphList::~kbGraphList()
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
//first empty the graph
|
//first empty the graph
|
||||||
_LI.delete_all();
|
_LI.delete_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
//prepare the graphlist for the boolean operations
|
//prepare the graphlist for the boolean operations
|
||||||
//group all graphs into ONE graph
|
//group all graphs into ONE graph
|
||||||
void GraphList::Prepare( Graph* total )
|
void kbGraphList::Prepare( kbGraph* total )
|
||||||
{
|
{
|
||||||
if ( empty() )
|
if ( empty() )
|
||||||
return;
|
return;
|
||||||
|
@ -60,7 +60,7 @@ void GraphList::Prepare( Graph* total )
|
||||||
|
|
||||||
if ( ! _GC->GetOrientationEntryMode() )
|
if ( ! _GC->GetOrientationEntryMode() )
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while ( !_LI.hitroot() )
|
while ( !_LI.hitroot() )
|
||||||
{
|
{
|
||||||
|
@ -78,9 +78,9 @@ void GraphList::Prepare( Graph* total )
|
||||||
// the function will make from all the graphs in the graphlist one graph,
|
// the function will make from all the graphs in the graphlist one graph,
|
||||||
// simply by throwing all the links in one graph, the graphnumbers will
|
// simply by throwing all the links in one graph, the graphnumbers will
|
||||||
// not be changed
|
// not be changed
|
||||||
void GraphList::MakeOneGraph( Graph* total )
|
void kbGraphList::MakeOneGraph( kbGraph* total )
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while( !_LI.hitroot() )
|
while( !_LI.hitroot() )
|
||||||
{
|
{
|
||||||
|
@ -93,11 +93,11 @@ void GraphList::MakeOneGraph( Graph* total )
|
||||||
//
|
//
|
||||||
// Renumber all the graphs
|
// Renumber all the graphs
|
||||||
//
|
//
|
||||||
void GraphList::Renumber()
|
void kbGraphList::Renumber()
|
||||||
{
|
{
|
||||||
if ( _GC->GetOrientationEntryMode() )
|
if ( _GC->GetOrientationEntryMode() )
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while ( !_LI.hitroot() )
|
while ( !_LI.hitroot() )
|
||||||
{
|
{
|
||||||
|
@ -111,7 +111,7 @@ void GraphList::Renumber()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int Number = 1;
|
unsigned int Number = 1;
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while ( !_LI.hitroot() )
|
while ( !_LI.hitroot() )
|
||||||
{
|
{
|
||||||
|
@ -123,10 +123,10 @@ void GraphList::Renumber()
|
||||||
|
|
||||||
|
|
||||||
// Simplify the graphs
|
// Simplify the graphs
|
||||||
void GraphList::Simplify( double marge )
|
void kbGraphList::Simplify( double marge )
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.foreach_mf( &Graph::Reset_Mark_and_Bin );
|
_LI.foreach_mf( &kbGraph::Reset_Mark_and_Bin );
|
||||||
|
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while ( !_LI.hitroot() )
|
while ( !_LI.hitroot() )
|
||||||
|
@ -146,10 +146,10 @@ void GraphList::Simplify( double marge )
|
||||||
}
|
}
|
||||||
|
|
||||||
// Smoothen the graphs
|
// Smoothen the graphs
|
||||||
void GraphList::Smoothen( double marge )
|
void kbGraphList::Smoothen( double marge )
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.foreach_mf( &Graph::Reset_Mark_and_Bin );
|
_LI.foreach_mf( &kbGraph::Reset_Mark_and_Bin );
|
||||||
|
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while ( !_LI.hitroot() )
|
while ( !_LI.hitroot() )
|
||||||
|
@ -170,10 +170,10 @@ void GraphList::Smoothen( double marge )
|
||||||
|
|
||||||
|
|
||||||
// Turn off all markers in all the graphs
|
// Turn off all markers in all the graphs
|
||||||
void GraphList::UnMarkAll()
|
void kbGraphList::UnMarkAll()
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.foreach_mf( &Graph::Reset_Mark_and_Bin );
|
_LI.foreach_mf( &kbGraph::Reset_Mark_and_Bin );
|
||||||
}
|
}
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
@ -182,9 +182,9 @@ void GraphList::UnMarkAll()
|
||||||
//
|
//
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
void GraphList::Correction()
|
void kbGraphList::Correction()
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
int todo = _LI.count();
|
int todo = _LI.count();
|
||||||
|
|
||||||
if ( _GC->GetInternalCorrectionFactor() ) //not zero
|
if ( _GC->GetInternalCorrectionFactor() ) //not zero
|
||||||
|
@ -193,7 +193,7 @@ void GraphList::Correction()
|
||||||
for( int i = 0; i < todo ; i++ )
|
for( int i = 0; i < todo ; i++ )
|
||||||
{
|
{
|
||||||
//the input graph will be empty in the end
|
//the input graph will be empty in the end
|
||||||
GraphList *_correct = new GraphList( _GC );
|
kbGraphList *_correct = new kbGraphList( _GC );
|
||||||
{
|
{
|
||||||
_LI.item()->MakeClockWise();
|
_LI.item()->MakeClockWise();
|
||||||
_LI.item()->Correction( _correct, _GC->GetInternalCorrectionFactor() );
|
_LI.item()->Correction( _correct, _GC->GetInternalCorrectionFactor() );
|
||||||
|
@ -205,7 +205,7 @@ void GraphList::Correction()
|
||||||
while ( !_correct->empty() )
|
while ( !_correct->empty() )
|
||||||
{
|
{
|
||||||
//add to end
|
//add to end
|
||||||
_LI.insend( ( Graph* )_correct->headitem() );
|
_LI.insend( ( kbGraph* )_correct->headitem() );
|
||||||
_correct->removehead();
|
_correct->removehead();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,16 +214,16 @@ void GraphList::Correction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphList::MakeRings()
|
void kbGraphList::MakeRings()
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
int todo = _LI.count();
|
int todo = _LI.count();
|
||||||
|
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
for( int i = 0; i < todo ; i++ )
|
for( int i = 0; i < todo ; i++ )
|
||||||
{
|
{
|
||||||
//the input graph will be empty in the end
|
//the input graph will be empty in the end
|
||||||
GraphList *_ring = new GraphList( _GC );
|
kbGraphList *_ring = new kbGraphList( _GC );
|
||||||
{
|
{
|
||||||
_LI.item()->MakeClockWise();
|
_LI.item()->MakeClockWise();
|
||||||
_LI.item()->MakeRing( _ring, _GC->GetInternalCorrectionFactor() );
|
_LI.item()->MakeRing( _ring, _GC->GetInternalCorrectionFactor() );
|
||||||
|
@ -235,8 +235,8 @@ void GraphList::MakeRings()
|
||||||
while ( !_ring->empty() )
|
while ( !_ring->empty() )
|
||||||
{
|
{
|
||||||
//add to end
|
//add to end
|
||||||
( ( Graph* )_ring->headitem() )->MakeClockWise();
|
( ( kbGraph* )_ring->headitem() )->MakeClockWise();
|
||||||
_LI.insend( ( Graph* )_ring->headitem() );
|
_LI.insend( ( kbGraph* )_ring->headitem() );
|
||||||
_ring->removehead();
|
_ring->removehead();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -246,13 +246,13 @@ void GraphList::MakeRings()
|
||||||
}
|
}
|
||||||
|
|
||||||
//merge the graphs in the list and return the merged result
|
//merge the graphs in the list and return the merged result
|
||||||
void GraphList::Merge()
|
void kbGraphList::Merge()
|
||||||
{
|
{
|
||||||
if ( count() <= 1 )
|
if ( count() <= 1 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while ( !_LI.hitroot() )
|
while ( !_LI.hitroot() )
|
||||||
{
|
{
|
||||||
|
@ -261,7 +261,7 @@ void GraphList::Merge()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Graph* _tomerge = new Graph( _GC );
|
kbGraph* _tomerge = new kbGraph( _GC );
|
||||||
|
|
||||||
Renumber();
|
Renumber();
|
||||||
|
|
||||||
|
@ -279,14 +279,14 @@ void GraphList::Merge()
|
||||||
#define SAVEME 1
|
#define SAVEME 1
|
||||||
|
|
||||||
//perform boolean operation on the graphs in the list
|
//perform boolean operation on the graphs in the list
|
||||||
void GraphList::Boolean( BOOL_OP operation, int intersectionRunsMax )
|
void kbGraphList::Boolean( BOOL_OP operation, int intersectionRunsMax )
|
||||||
{
|
{
|
||||||
_GC->SetState( "Performing Boolean Operation" );
|
_GC->SetState( "Performing Boolean Operation" );
|
||||||
|
|
||||||
if ( count() == 0 )
|
if ( count() == 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Graph* _prepared = new Graph( _GC );
|
kbGraph* _prepared = new kbGraph( _GC );
|
||||||
|
|
||||||
if ( empty() )
|
if ( empty() )
|
||||||
return;
|
return;
|
||||||
|
@ -345,9 +345,9 @@ void GraphList::Boolean( BOOL_OP operation, int intersectionRunsMax )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GraphList::WriteGraphs()
|
void kbGraphList::WriteGraphs()
|
||||||
{
|
{
|
||||||
TDLI<Graph> _LI = TDLI<Graph>( this );
|
TDLI<kbGraph> _LI = TDLI<kbGraph>( this );
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while( !_LI.hitroot() )
|
while( !_LI.hitroot() )
|
||||||
{
|
{
|
||||||
|
@ -356,7 +356,7 @@ void GraphList::WriteGraphs()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphList::WriteGraphsKEY( Bool_Engine* GC )
|
void kbGraphList::WriteGraphsKEY( Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
FILE * file = fopen( "graphkeyfile.key", "w" );
|
FILE * file = fopen( "graphkeyfile.key", "w" );
|
||||||
|
|
||||||
|
@ -375,7 +375,7 @@ void GraphList::WriteGraphsKEY( Bool_Engine* GC )
|
||||||
STRNAME top; \
|
STRNAME top; \
|
||||||
");
|
");
|
||||||
|
|
||||||
TDLI<Graph> _LI=TDLI<Graph>(this);
|
TDLI<kbGraph> _LI=TDLI<kbGraph>(this);
|
||||||
_LI.tohead();
|
_LI.tohead();
|
||||||
while(!_LI.hitroot())
|
while(!_LI.hitroot())
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
Copyright: 2001-2004 (C) Probably Klaas Holwerda
|
||||||
|
|
||||||
Licence: wxWidgets Licence
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: instonly.cpp,v 1.2 2006/11/05 14:59:31 titato Exp $
|
RCS-ID: $Id: instonly.cpp,v 1.3 2009/02/06 21:33:03 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef __GNUG__
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: line.cpp,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: line.cpp,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Standard include files
|
// Standard include files
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
//
|
//
|
||||||
// The default constructor
|
// The default constructor
|
||||||
//
|
//
|
||||||
KBoolLine::KBoolLine( Bool_Engine* GC )
|
kbLine::kbLine( Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
m_GC = GC;
|
m_GC = GC;
|
||||||
m_AA = 0.0;
|
m_AA = 0.0;
|
||||||
|
@ -36,7 +36,7 @@ KBoolLine::KBoolLine( Bool_Engine* GC )
|
||||||
m_valid_parameters = false;
|
m_valid_parameters = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
KBoolLine::~KBoolLine()
|
kbLine::~kbLine()
|
||||||
{
|
{
|
||||||
if ( linecrosslist )
|
if ( linecrosslist )
|
||||||
delete linecrosslist;
|
delete linecrosslist;
|
||||||
|
@ -45,7 +45,7 @@ KBoolLine::~KBoolLine()
|
||||||
//
|
//
|
||||||
// constructor with a link
|
// constructor with a link
|
||||||
//
|
//
|
||||||
KBoolLine::KBoolLine( KBoolLink *a_link, Bool_Engine* GC )
|
kbLine::kbLine( kbLink *a_link, Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
m_GC = GC;
|
m_GC = GC;
|
||||||
// a_link must exist
|
// a_link must exist
|
||||||
|
@ -80,7 +80,7 @@ KBoolLine::KBoolLine( KBoolLink *a_link, Bool_Engine* GC )
|
||||||
// 4: beginnode and endnode are crosspoints, no further investigation
|
// 4: beginnode and endnode are crosspoints, no further investigation
|
||||||
// 5: beginnode is a crosspoint, need further investigation
|
// 5: beginnode is a crosspoint, need further investigation
|
||||||
// 6: endnode is a crosspoint, need further investigation
|
// 6: endnode is a crosspoint, need further investigation
|
||||||
int KBoolLine::ActionOnTable1( PointStatus Result_beginnode, PointStatus Result_endnode )
|
int kbLine::ActionOnTable1( PointStatus Result_beginnode, PointStatus Result_endnode )
|
||||||
{
|
{
|
||||||
// Action 1.5 beginnode and endnode are crosspoints, no further investigation needed
|
// Action 1.5 beginnode and endnode are crosspoints, no further investigation needed
|
||||||
if (
|
if (
|
||||||
|
@ -196,7 +196,7 @@ int KBoolLine::ActionOnTable1( PointStatus Result_beginnode, PointStatus Result_
|
||||||
// 2: endnode is a crosspoint
|
// 2: endnode is a crosspoint
|
||||||
// 3: beginnode is a crosspoint
|
// 3: beginnode is a crosspoint
|
||||||
// 4: beginnode and endnode are crosspoints
|
// 4: beginnode and endnode are crosspoints
|
||||||
int KBoolLine::ActionOnTable2( PointStatus Result_beginnode, PointStatus Result_endnode )
|
int kbLine::ActionOnTable2( PointStatus Result_beginnode, PointStatus Result_endnode )
|
||||||
{
|
{
|
||||||
// Action 2.5, beginnode and eindpoint are crosspoints
|
// Action 2.5, beginnode and eindpoint are crosspoints
|
||||||
if (
|
if (
|
||||||
|
@ -290,7 +290,7 @@ int KBoolLine::ActionOnTable2( PointStatus Result_beginnode, PointStatus Result_
|
||||||
// the crossing will be put in the link, because the line will be destructed
|
// the crossing will be put in the link, because the line will be destructed
|
||||||
// after use of the variable
|
// after use of the variable
|
||||||
//
|
//
|
||||||
void KBoolLine::AddLineCrossing( B_INT X, B_INT Y, KBoolLine *other_line )
|
void kbLine::AddLineCrossing( B_INT X, B_INT Y, kbLine *other_line )
|
||||||
{
|
{
|
||||||
// the other line must exist
|
// the other line must exist
|
||||||
assert( other_line );
|
assert( other_line );
|
||||||
|
@ -301,7 +301,7 @@ void KBoolLine::AddLineCrossing( B_INT X, B_INT Y, KBoolLine *other_line )
|
||||||
|
|
||||||
// Calculate the Y when the X is given
|
// Calculate the Y when the X is given
|
||||||
//
|
//
|
||||||
B_INT KBoolLine::Calculate_Y( B_INT X )
|
B_INT kbLine::Calculate_Y( B_INT X )
|
||||||
{
|
{
|
||||||
// link must exist to get info about the nodes
|
// link must exist to get info about the nodes
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
@ -314,7 +314,7 @@ B_INT KBoolLine::Calculate_Y( B_INT X )
|
||||||
return m_link->GetBeginNode()->GetY();
|
return m_link->GetBeginNode()->GetY();
|
||||||
}
|
}
|
||||||
|
|
||||||
B_INT KBoolLine::Calculate_Y_from_X( B_INT X )
|
B_INT kbLine::Calculate_Y_from_X( B_INT X )
|
||||||
{
|
{
|
||||||
// link must exist to get info about the nodes
|
// link must exist to get info about the nodes
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
@ -327,7 +327,7 @@ B_INT KBoolLine::Calculate_Y_from_X( B_INT X )
|
||||||
return m_link->GetBeginNode()->GetY();
|
return m_link->GetBeginNode()->GetY();
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLine::Virtual_Point( LPoint *a_point, double distance )
|
void kbLine::Virtual_Point( kbLPoint *a_point, double distance )
|
||||||
{
|
{
|
||||||
// link must exist to get info about the nodes
|
// link must exist to get info about the nodes
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
@ -345,7 +345,7 @@ void KBoolLine::Virtual_Point( LPoint *a_point, double distance )
|
||||||
//
|
//
|
||||||
// Calculate the lineparameters for the line if nessecary
|
// Calculate the lineparameters for the line if nessecary
|
||||||
//
|
//
|
||||||
void KBoolLine::CalculateLineParameters()
|
void kbLine::CalculateLineParameters()
|
||||||
{
|
{
|
||||||
// linkmust exist to get beginnode AND endnode
|
// linkmust exist to get beginnode AND endnode
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
@ -353,7 +353,7 @@ void KBoolLine::CalculateLineParameters()
|
||||||
// if not valid_parameters calculate the parameters
|
// if not valid_parameters calculate the parameters
|
||||||
if ( !m_valid_parameters )
|
if ( !m_valid_parameters )
|
||||||
{
|
{
|
||||||
Node * bp, *ep;
|
kbNode * bp, *ep;
|
||||||
double length;
|
double length;
|
||||||
|
|
||||||
// get the begin and endnode via the link
|
// get the begin and endnode via the link
|
||||||
|
@ -390,7 +390,7 @@ void KBoolLine::CalculateLineParameters()
|
||||||
// return true : lines are crossing
|
// return true : lines are crossing
|
||||||
// false: lines are not crossing
|
// false: lines are not crossing
|
||||||
//
|
//
|
||||||
int KBoolLine::CheckIntersect ( KBoolLine * lijn, double Marge )
|
int kbLine::CheckIntersect ( kbLine * lijn, double Marge )
|
||||||
{
|
{
|
||||||
double distance = 0;
|
double distance = 0;
|
||||||
// link must exist
|
// link must exist
|
||||||
|
@ -405,7 +405,7 @@ int KBoolLine::CheckIntersect ( KBoolLine * lijn, double Marge )
|
||||||
assert( !m_link );
|
assert( !m_link );
|
||||||
|
|
||||||
int Take_Action1, Take_Action2, Total_Result;
|
int Take_Action1, Take_Action2, Total_Result;
|
||||||
Node *bp, *ep;
|
kbNode *bp, *ep;
|
||||||
PointStatus Result_beginnode, Result_endnode;
|
PointStatus Result_beginnode, Result_endnode;
|
||||||
|
|
||||||
bp = lijn->m_link->GetBeginNode();
|
bp = lijn->m_link->GetBeginNode();
|
||||||
|
@ -440,9 +440,9 @@ int KBoolLine::CheckIntersect ( KBoolLine * lijn, double Marge )
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the beginnode from the line
|
// Get the beginnode from the line
|
||||||
// usage: Node *anode = a_line.GetBeginNode()
|
// usage: kbNode *anode = a_line.GetBeginNode()
|
||||||
//
|
//
|
||||||
Node *KBoolLine::GetBeginNode()
|
kbNode *kbLine::GetBeginNode()
|
||||||
{
|
{
|
||||||
// link must exist
|
// link must exist
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
@ -452,9 +452,9 @@ Node *KBoolLine::GetBeginNode()
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the endnode from the line
|
// Get the endnode from the line
|
||||||
// usage: Node *anode = a_line.GetEndNode()
|
// usage: kbNode *anode = a_line.GetEndNode()
|
||||||
//
|
//
|
||||||
Node *KBoolLine::GetEndNode()
|
kbNode *kbLine::GetEndNode()
|
||||||
{
|
{
|
||||||
// link must exist
|
// link must exist
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
@ -468,7 +468,7 @@ Node *KBoolLine::GetEndNode()
|
||||||
// return 0: If there are no crossings
|
// return 0: If there are no crossings
|
||||||
// 1: If there is one crossing
|
// 1: If there is one crossing
|
||||||
// 2: If there are two crossings
|
// 2: If there are two crossings
|
||||||
int KBoolLine::Intersect( KBoolLine * lijn, double Marge )
|
int kbLine::Intersect( kbLine * lijn, double Marge )
|
||||||
{
|
{
|
||||||
double distance = 0;
|
double distance = 0;
|
||||||
// lijn must exist
|
// lijn must exist
|
||||||
|
@ -480,7 +480,7 @@ int KBoolLine::Intersect( KBoolLine * lijn, double Marge )
|
||||||
if ( m_link->GetBeginNode() == m_link->GetEndNode() )
|
if ( m_link->GetBeginNode() == m_link->GetEndNode() )
|
||||||
assert( !m_link );
|
assert( !m_link );
|
||||||
|
|
||||||
Node *bp, *ep;
|
kbNode *bp, *ep;
|
||||||
PointStatus Result_beginnode, Result_endnode;
|
PointStatus Result_beginnode, Result_endnode;
|
||||||
int Take_Action1, Take_Action2, Number_of_Crossings = 0;
|
int Take_Action1, Take_Action2, Number_of_Crossings = 0;
|
||||||
|
|
||||||
|
@ -558,7 +558,7 @@ case 1: case 5: case 6:
|
||||||
|
|
||||||
|
|
||||||
// Intersects two lines there must be a crossing
|
// Intersects two lines there must be a crossing
|
||||||
int KBoolLine::Intersect_simple( KBoolLine * lijn )
|
int kbLine::Intersect_simple( kbLine * lijn )
|
||||||
{
|
{
|
||||||
// lijn must exist
|
// lijn must exist
|
||||||
assert( lijn );
|
assert( lijn );
|
||||||
|
@ -577,7 +577,7 @@ int KBoolLine::Intersect_simple( KBoolLine * lijn )
|
||||||
}
|
}
|
||||||
|
|
||||||
// Intersects two lines there must be a crossing
|
// Intersects two lines there must be a crossing
|
||||||
bool KBoolLine::Intersect2( Node* crossing, KBoolLine * lijn )
|
bool kbLine::Intersect2( kbNode* crossing, kbLine * lijn )
|
||||||
{
|
{
|
||||||
// lijn must exist
|
// lijn must exist
|
||||||
assert( lijn );
|
assert( lijn );
|
||||||
|
@ -606,7 +606,7 @@ bool KBoolLine::Intersect2( Node* crossing, KBoolLine * lijn )
|
||||||
// ON_AREA, when point lies on the infinite line within a range
|
// ON_AREA, when point lies on the infinite line within a range
|
||||||
// IN_AREA, when point lies in the area of the linesegment
|
// IN_AREA, when point lies in the area of the linesegment
|
||||||
// the returnvalues are declared in (LINE.H)
|
// the returnvalues are declared in (LINE.H)
|
||||||
PointStatus KBoolLine::PointInLine( Node *a_node, double& Distance, double Marge )
|
PointStatus kbLine::PointInLine( kbNode *a_node, double& Distance, double Marge )
|
||||||
{
|
{
|
||||||
Distance = 0;
|
Distance = 0;
|
||||||
|
|
||||||
|
@ -616,7 +616,7 @@ PointStatus KBoolLine::PointInLine( Node *a_node, double& Distance, double Marge
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
|
||||||
// get the nodes form the line via the link
|
// get the nodes form the line via the link
|
||||||
Node *bp, *ep;
|
kbNode *bp, *ep;
|
||||||
bp = m_link->GetBeginNode();
|
bp = m_link->GetBeginNode();
|
||||||
ep = m_link->GetEndNode();
|
ep = m_link->GetEndNode();
|
||||||
|
|
||||||
|
@ -662,7 +662,7 @@ PointStatus KBoolLine::PointInLine( Node *a_node, double& Distance, double Marge
|
||||||
// ON_AREA, when point lies on the infinite line within a range
|
// ON_AREA, when point lies on the infinite line within a range
|
||||||
// RIGHT_SIDE, when point lies on the right side of the line
|
// RIGHT_SIDE, when point lies on the right side of the line
|
||||||
// LEFT_SIDE , RIGHT_SIDE , ON_AREA
|
// LEFT_SIDE , RIGHT_SIDE , ON_AREA
|
||||||
PointStatus KBoolLine::PointOnLine( Node *a_node, double& Distance, double Marge )
|
PointStatus kbLine::PointOnLine( kbNode *a_node, double& Distance, double Marge )
|
||||||
{
|
{
|
||||||
Distance = 0;
|
Distance = 0;
|
||||||
|
|
||||||
|
@ -672,7 +672,7 @@ PointStatus KBoolLine::PointOnLine( Node *a_node, double& Distance, double Marge
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
|
|
||||||
// get the nodes from the line via the link
|
// get the nodes from the line via the link
|
||||||
Node *bp, *ep;
|
kbNode *bp, *ep;
|
||||||
bp = m_link->GetBeginNode();
|
bp = m_link->GetBeginNode();
|
||||||
ep = m_link->GetEndNode();
|
ep = m_link->GetEndNode();
|
||||||
|
|
||||||
|
@ -705,7 +705,7 @@ PointStatus KBoolLine::PointOnLine( Node *a_node, double& Distance, double Marge
|
||||||
// Sets lines parameters
|
// Sets lines parameters
|
||||||
// usage: a_line.Set(a_pointer_to_a_link);
|
// usage: a_line.Set(a_pointer_to_a_link);
|
||||||
//
|
//
|
||||||
void KBoolLine::Set( KBoolLink *a_link )
|
void kbLine::Set( kbLink *a_link )
|
||||||
{
|
{
|
||||||
// points must exist
|
// points must exist
|
||||||
assert( a_link );
|
assert( a_link );
|
||||||
|
@ -719,7 +719,7 @@ void KBoolLine::Set( KBoolLink *a_link )
|
||||||
m_valid_parameters = false;
|
m_valid_parameters = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
KBoolLink* KBoolLine::GetLink()
|
kbLink* kbLine::GetLink()
|
||||||
{
|
{
|
||||||
return m_link;
|
return m_link;
|
||||||
}
|
}
|
||||||
|
@ -727,7 +727,7 @@ KBoolLink* KBoolLine::GetLink()
|
||||||
// makes a line same as these
|
// makes a line same as these
|
||||||
// usage : line1 = line2;
|
// usage : line1 = line2;
|
||||||
//
|
//
|
||||||
KBoolLine& KBoolLine::operator=( const KBoolLine& a_line )
|
kbLine& kbLine::operator=( const kbLine& a_line )
|
||||||
{
|
{
|
||||||
m_AA = a_line.m_AA;
|
m_AA = a_line.m_AA;
|
||||||
m_BB = a_line.m_BB;
|
m_BB = a_line.m_BB;
|
||||||
|
@ -738,37 +738,37 @@ KBoolLine& KBoolLine::operator=( const KBoolLine& a_line )
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node* KBoolLine::OffsetContour( KBoolLine* const nextline, Node* _last_ins, double factor, Graph *shape )
|
kbNode* kbLine::OffsetContour( kbLine* const nextline, kbNode* _last_ins, double factor, kbGraph *shape )
|
||||||
{
|
{
|
||||||
KBoolLink * offs_currentlink;
|
kbLink * offs_currentlink;
|
||||||
KBoolLine offs_currentline( m_GC );
|
kbLine offs_currentline( m_GC );
|
||||||
KBoolLink* offs_nextlink;
|
kbLink* offs_nextlink;
|
||||||
KBoolLine offs_nextline( m_GC );
|
kbLine offs_nextline( m_GC );
|
||||||
Node* offs_end;
|
kbNode* offs_end;
|
||||||
|
|
||||||
Node* offs_bgn_next;
|
kbNode* offs_bgn_next;
|
||||||
Node* offs_end_next;
|
kbNode* offs_end_next;
|
||||||
|
|
||||||
// make a node from this point
|
// make a node from this point
|
||||||
offs_end = new Node( GetEndNode(), m_GC );
|
offs_end = new kbNode( GetEndNode(), m_GC );
|
||||||
Virtual_Point( offs_end, factor );
|
Virtual_Point( offs_end, factor );
|
||||||
offs_currentlink = new KBoolLink( 0, _last_ins, offs_end, m_GC );
|
offs_currentlink = new kbLink( 0, _last_ins, offs_end, m_GC );
|
||||||
offs_currentline.Set( offs_currentlink );
|
offs_currentline.Set( offs_currentlink );
|
||||||
|
|
||||||
offs_bgn_next = new Node( nextline->m_link->GetBeginNode(), m_GC );
|
offs_bgn_next = new kbNode( nextline->m_link->GetBeginNode(), m_GC );
|
||||||
nextline->Virtual_Point( offs_bgn_next, factor );
|
nextline->Virtual_Point( offs_bgn_next, factor );
|
||||||
|
|
||||||
offs_end_next = new Node( nextline->m_link->GetEndNode(), m_GC );
|
offs_end_next = new kbNode( nextline->m_link->GetEndNode(), m_GC );
|
||||||
nextline->Virtual_Point( offs_end_next, factor );
|
nextline->Virtual_Point( offs_end_next, factor );
|
||||||
|
|
||||||
offs_nextlink = new KBoolLink( 0, offs_bgn_next, offs_end_next, m_GC );
|
offs_nextlink = new kbLink( 0, offs_bgn_next, offs_end_next, m_GC );
|
||||||
offs_nextline.Set( offs_nextlink );
|
offs_nextline.Set( offs_nextlink );
|
||||||
|
|
||||||
offs_currentline.CalculateLineParameters();
|
offs_currentline.CalculateLineParameters();
|
||||||
offs_nextline.CalculateLineParameters();
|
offs_nextline.CalculateLineParameters();
|
||||||
offs_currentline.Intersect2( offs_end, &offs_nextline );
|
offs_currentline.Intersect2( offs_end, &offs_nextline );
|
||||||
|
|
||||||
// make a link between the current and the previous and add this to graph
|
// make a link between the current and the previous and add this to kbGraph
|
||||||
shape->AddLink( offs_currentlink );
|
shape->AddLink( offs_currentlink );
|
||||||
|
|
||||||
delete offs_nextlink;
|
delete offs_nextlink;
|
||||||
|
@ -777,35 +777,35 @@ Node* KBoolLine::OffsetContour( KBoolLine* const nextline, Node* _last_ins, doub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Node* KBoolLine::OffsetContour_rounded( KBoolLine* const nextline, Node* _last_ins, double factor, Graph *shape )
|
kbNode* kbLine::OffsetContour_rounded( kbLine* const nextline, kbNode* _last_ins, double factor, kbGraph *shape )
|
||||||
{
|
{
|
||||||
KBoolLink * offs_currentlink;
|
kbLink * offs_currentlink;
|
||||||
KBoolLine offs_currentline( m_GC );
|
kbLine offs_currentline( m_GC );
|
||||||
KBoolLink* offs_nextlink;
|
kbLink* offs_nextlink;
|
||||||
KBoolLine offs_nextline( m_GC );
|
kbLine offs_nextline( m_GC );
|
||||||
Node* offs_end;
|
kbNode* offs_end;
|
||||||
Node* medial_axes_point = new Node( m_GC );
|
kbNode* medial_axes_point = new kbNode( m_GC );
|
||||||
Node* bu_last_ins = new Node( _last_ins, m_GC );
|
kbNode* bu_last_ins = new kbNode( _last_ins, m_GC );
|
||||||
|
|
||||||
Node* offs_bgn_next;
|
kbNode* offs_bgn_next;
|
||||||
Node* offs_end_next;
|
kbNode* offs_end_next;
|
||||||
|
|
||||||
// make a node from this point
|
// make a node from this point
|
||||||
offs_end = new Node( GetEndNode(), m_GC );
|
offs_end = new kbNode( GetEndNode(), m_GC );
|
||||||
|
|
||||||
*_last_ins = *GetBeginNode();
|
*_last_ins = *GetBeginNode();
|
||||||
Virtual_Point( _last_ins, factor );
|
Virtual_Point( _last_ins, factor );
|
||||||
Virtual_Point( offs_end, factor );
|
Virtual_Point( offs_end, factor );
|
||||||
offs_currentlink = new KBoolLink( 0, _last_ins, offs_end, m_GC );
|
offs_currentlink = new kbLink( 0, _last_ins, offs_end, m_GC );
|
||||||
offs_currentline.Set( offs_currentlink );
|
offs_currentline.Set( offs_currentlink );
|
||||||
|
|
||||||
offs_bgn_next = new Node( nextline->m_link->GetBeginNode(), m_GC );
|
offs_bgn_next = new kbNode( nextline->m_link->GetBeginNode(), m_GC );
|
||||||
nextline->Virtual_Point( offs_bgn_next, factor );
|
nextline->Virtual_Point( offs_bgn_next, factor );
|
||||||
|
|
||||||
offs_end_next = new Node( nextline->m_link->GetEndNode(), m_GC );
|
offs_end_next = new kbNode( nextline->m_link->GetEndNode(), m_GC );
|
||||||
nextline->Virtual_Point( offs_end_next, factor );
|
nextline->Virtual_Point( offs_end_next, factor );
|
||||||
|
|
||||||
offs_nextlink = new KBoolLink( 0, offs_bgn_next, offs_end_next, m_GC );
|
offs_nextlink = new kbLink( 0, offs_bgn_next, offs_end_next, m_GC );
|
||||||
offs_nextline.Set( offs_nextlink );
|
offs_nextline.Set( offs_nextlink );
|
||||||
|
|
||||||
offs_currentline.CalculateLineParameters();
|
offs_currentline.CalculateLineParameters();
|
||||||
|
@ -821,7 +821,7 @@ Node* KBoolLine::OffsetContour_rounded( KBoolLine* const nextline, Node* _last_i
|
||||||
*offs_end = *medial_axes_point;
|
*offs_end = *medial_axes_point;
|
||||||
delete medial_axes_point;
|
delete medial_axes_point;
|
||||||
delete bu_last_ins;
|
delete bu_last_ins;
|
||||||
// make a link between the current and the previous and add this to graph
|
// make a link between the current and the previous and add this to kbGraph
|
||||||
delete offs_nextlink;
|
delete offs_nextlink;
|
||||||
shape->AddLink( offs_currentlink );
|
shape->AddLink( offs_currentlink );
|
||||||
return( offs_end );
|
return( offs_end );
|
||||||
|
@ -831,7 +831,7 @@ Node* KBoolLine::OffsetContour_rounded( KBoolLine* const nextline, Node* _last_i
|
||||||
*_last_ins = *bu_last_ins;
|
*_last_ins = *bu_last_ins;
|
||||||
delete medial_axes_point;
|
delete medial_axes_point;
|
||||||
delete bu_last_ins;
|
delete bu_last_ins;
|
||||||
Node* endarc = new Node( offs_bgn_next, m_GC );
|
kbNode* endarc = new kbNode( offs_bgn_next, m_GC );
|
||||||
shape->AddLink( offs_currentlink );
|
shape->AddLink( offs_currentlink );
|
||||||
delete offs_nextlink;
|
delete offs_nextlink;
|
||||||
shape->CreateArc( GetEndNode(), &offs_currentline, endarc, fabs( factor ), m_GC->GetInternalCorrectionAber() );
|
shape->CreateArc( GetEndNode(), &offs_currentline, endarc, fabs( factor ), m_GC->GetInternalCorrectionAber() );
|
||||||
|
@ -840,7 +840,7 @@ Node* KBoolLine::OffsetContour_rounded( KBoolLine* const nextline, Node* _last_i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool KBoolLine::OkeForContour( KBoolLine* const nextline, double factor, Node* LastLeft, Node* LastRight, LinkStatus& _outproduct )
|
bool kbLine::OkeForContour( kbLine* const nextline, double factor, kbNode* LastLeft, kbNode* LastRight, LinkStatus& _outproduct )
|
||||||
{
|
{
|
||||||
assert( m_link );
|
assert( m_link );
|
||||||
assert( m_valid_parameters );
|
assert( m_valid_parameters );
|
||||||
|
@ -852,7 +852,7 @@ bool KBoolLine::OkeForContour( KBoolLine* const nextline, double factor, Node* L
|
||||||
// PointStatus status=ON_AREA;
|
// PointStatus status=ON_AREA;
|
||||||
double distance = 0;
|
double distance = 0;
|
||||||
|
|
||||||
Node offs_end_next( nextline->m_link->GetEndNode(), m_GC );
|
kbNode offs_end_next( nextline->m_link->GetEndNode(), m_GC );
|
||||||
|
|
||||||
_outproduct = m_link->OutProduct( nextline->m_link, m_GC->GetAccur() );
|
_outproduct = m_link->OutProduct( nextline->m_link, m_GC->GetAccur() );
|
||||||
|
|
||||||
|
@ -899,9 +899,9 @@ bool KBoolLine::OkeForContour( KBoolLine* const nextline, double factor, Node* L
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool KBoolLine::Create_Ring_Shape( KBoolLine* nextline, Node** _last_ins_left, Node** _last_ins_right, double factor, Graph *shape )
|
bool kbLine::Create_Ring_Shape( kbLine* nextline, kbNode** _last_ins_left, kbNode** _last_ins_right, double factor, kbGraph *shape )
|
||||||
{
|
{
|
||||||
Node * _current;
|
kbNode * _current;
|
||||||
LinkStatus _outproduct = IS_ON;
|
LinkStatus _outproduct = IS_ON;
|
||||||
|
|
||||||
if ( OkeForContour( nextline, factor, *_last_ins_left, *_last_ins_right, _outproduct ) )
|
if ( OkeForContour( nextline, factor, *_last_ins_left, *_last_ins_right, _outproduct ) )
|
||||||
|
@ -926,14 +926,14 @@ bool KBoolLine::Create_Ring_Shape( KBoolLine* nextline, Node** _last_ins_left, N
|
||||||
case IS_ON :
|
case IS_ON :
|
||||||
{
|
{
|
||||||
// make a node from this point
|
// make a node from this point
|
||||||
_current = new Node( m_link->GetEndNode(), m_GC );
|
_current = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
Virtual_Point( _current, factor );
|
Virtual_Point( _current, factor );
|
||||||
|
|
||||||
// make a link between the current and the previous and add this to graph
|
// make a link between the current and the previous and add this to kbGraph
|
||||||
shape->AddLink( *_last_ins_left, _current );
|
shape->AddLink( *_last_ins_left, _current );
|
||||||
*_last_ins_left = _current;
|
*_last_ins_left = _current;
|
||||||
|
|
||||||
_current = new Node( m_link->GetEndNode(), m_GC );
|
_current = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
Virtual_Point( _current, -factor );
|
Virtual_Point( _current, -factor );
|
||||||
|
|
||||||
shape->AddLink( *_last_ins_right, _current );
|
shape->AddLink( *_last_ins_right, _current );
|
||||||
|
@ -965,14 +965,14 @@ bool KBoolLine::Create_Ring_Shape( KBoolLine* nextline, Node** _last_ins_left, N
|
||||||
case IS_ON :
|
case IS_ON :
|
||||||
{
|
{
|
||||||
// make a node from this point
|
// make a node from this point
|
||||||
_current = new Node(m_link->GetEndNode());
|
_current = new kbNode(m_link->GetEndNode());
|
||||||
Virtual_Point(_current,factor);
|
Virtual_Point(_current,factor);
|
||||||
|
|
||||||
// make a link between the current and the previous and add this to graph
|
// make a link between the current and the previous and add this to kbGraph
|
||||||
Ishape->AddLink(*_last_ins_left, _current);
|
Ishape->AddLink(*_last_ins_left, _current);
|
||||||
*_last_ins_left=_current;
|
*_last_ins_left=_current;
|
||||||
|
|
||||||
_current = new Node(m_link->GetEndNode());
|
_current = new kbNode(m_link->GetEndNode());
|
||||||
Virtual_Point(_current,-factor);
|
Virtual_Point(_current,-factor);
|
||||||
|
|
||||||
Ishape->AddLink(*_last_ins_right, _current);
|
Ishape->AddLink(*_last_ins_right, _current);
|
||||||
|
@ -987,7 +987,7 @@ bool KBoolLine::Create_Ring_Shape( KBoolLine* nextline, Node** _last_ins_left, N
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KBoolLine::Create_Begin_Shape( KBoolLine* nextline, Node** _last_ins_left, Node** _last_ins_right, double factor, Graph *shape )
|
void kbLine::Create_Begin_Shape( kbLine* nextline, kbNode** _last_ins_left, kbNode** _last_ins_right, double factor, kbGraph *shape )
|
||||||
{
|
{
|
||||||
factor = fabs( factor );
|
factor = fabs( factor );
|
||||||
LinkStatus _outproduct;
|
LinkStatus _outproduct;
|
||||||
|
@ -997,11 +997,11 @@ void KBoolLine::Create_Begin_Shape( KBoolLine* nextline, Node** _last_ins_left,
|
||||||
{
|
{
|
||||||
case IS_RIGHT :
|
case IS_RIGHT :
|
||||||
{
|
{
|
||||||
*_last_ins_left = new Node( m_link->GetEndNode(), m_GC );
|
*_last_ins_left = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
|
|
||||||
Virtual_Point( *_last_ins_left, factor );
|
Virtual_Point( *_last_ins_left, factor );
|
||||||
|
|
||||||
*_last_ins_right = new Node( nextline->m_link->GetBeginNode(), m_GC );
|
*_last_ins_right = new kbNode( nextline->m_link->GetBeginNode(), m_GC );
|
||||||
nextline->Virtual_Point( *_last_ins_right, -factor );
|
nextline->Virtual_Point( *_last_ins_right, -factor );
|
||||||
|
|
||||||
shape->AddLink( *_last_ins_left, *_last_ins_right );
|
shape->AddLink( *_last_ins_left, *_last_ins_right );
|
||||||
|
@ -1011,10 +1011,10 @@ void KBoolLine::Create_Begin_Shape( KBoolLine* nextline, Node** _last_ins_left,
|
||||||
break;
|
break;
|
||||||
case IS_LEFT :
|
case IS_LEFT :
|
||||||
{
|
{
|
||||||
*_last_ins_left = new Node( nextline->m_link->GetBeginNode(), m_GC );
|
*_last_ins_left = new kbNode( nextline->m_link->GetBeginNode(), m_GC );
|
||||||
nextline->Virtual_Point( *_last_ins_left, factor );
|
nextline->Virtual_Point( *_last_ins_left, factor );
|
||||||
|
|
||||||
*_last_ins_right = new Node( m_link->GetEndNode(), m_GC );
|
*_last_ins_right = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
Virtual_Point( *_last_ins_right, -factor );
|
Virtual_Point( *_last_ins_right, -factor );
|
||||||
|
|
||||||
shape->AddLink( *_last_ins_left, *_last_ins_right );
|
shape->AddLink( *_last_ins_left, *_last_ins_right );
|
||||||
|
@ -1025,10 +1025,10 @@ void KBoolLine::Create_Begin_Shape( KBoolLine* nextline, Node** _last_ins_left,
|
||||||
// Line 2 lies on this line
|
// Line 2 lies on this line
|
||||||
case IS_ON :
|
case IS_ON :
|
||||||
{
|
{
|
||||||
*_last_ins_left = new Node( nextline->m_link->GetBeginNode(), m_GC );
|
*_last_ins_left = new kbNode( nextline->m_link->GetBeginNode(), m_GC );
|
||||||
Virtual_Point( *_last_ins_left, factor );
|
Virtual_Point( *_last_ins_left, factor );
|
||||||
|
|
||||||
*_last_ins_right = new Node( nextline->m_link->GetBeginNode(), m_GC );
|
*_last_ins_right = new kbNode( nextline->m_link->GetBeginNode(), m_GC );
|
||||||
Virtual_Point( *_last_ins_right, -factor );
|
Virtual_Point( *_last_ins_right, -factor );
|
||||||
|
|
||||||
shape->AddLink( *_last_ins_left, *_last_ins_right );
|
shape->AddLink( *_last_ins_left, *_last_ins_right );
|
||||||
|
@ -1038,9 +1038,9 @@ void KBoolLine::Create_Begin_Shape( KBoolLine* nextline, Node** _last_ins_left,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLine::Create_End_Shape( KBoolLine* nextline, Node* _last_ins_left, Node* _last_ins_right, double factor, Graph *shape )
|
void kbLine::Create_End_Shape( kbLine* nextline, kbNode* _last_ins_left, kbNode* _last_ins_right, double factor, kbGraph *shape )
|
||||||
{
|
{
|
||||||
Node * _current;
|
kbNode * _current;
|
||||||
factor = fabs( factor );
|
factor = fabs( factor );
|
||||||
LinkStatus _outproduct;
|
LinkStatus _outproduct;
|
||||||
_outproduct = m_link->OutProduct( nextline->m_link, m_GC->GetAccur() );
|
_outproduct = m_link->OutProduct( nextline->m_link, m_GC->GetAccur() );
|
||||||
|
@ -1049,7 +1049,7 @@ void KBoolLine::Create_End_Shape( KBoolLine* nextline, Node* _last_ins_left, Nod
|
||||||
{
|
{
|
||||||
case IS_RIGHT :
|
case IS_RIGHT :
|
||||||
{
|
{
|
||||||
_current = new Node( m_link->GetEndNode(), m_GC );
|
_current = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
Virtual_Point( _current, -factor );
|
Virtual_Point( _current, -factor );
|
||||||
shape->AddLink( _last_ins_right, _current );
|
shape->AddLink( _last_ins_right, _current );
|
||||||
_last_ins_right = _current;
|
_last_ins_right = _current;
|
||||||
|
@ -1060,7 +1060,7 @@ void KBoolLine::Create_End_Shape( KBoolLine* nextline, Node* _last_ins_left, Nod
|
||||||
break;
|
break;
|
||||||
case IS_LEFT :
|
case IS_LEFT :
|
||||||
{
|
{
|
||||||
_current = new Node( m_link->GetEndNode(), m_GC );
|
_current = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
Virtual_Point( _current, factor );
|
Virtual_Point( _current, factor );
|
||||||
shape->AddLink( _last_ins_left, _current );
|
shape->AddLink( _last_ins_left, _current );
|
||||||
_last_ins_left = _current;
|
_last_ins_left = _current;
|
||||||
|
@ -1072,12 +1072,12 @@ void KBoolLine::Create_End_Shape( KBoolLine* nextline, Node* _last_ins_left, Nod
|
||||||
// Line 2 lies on this line
|
// Line 2 lies on this line
|
||||||
case IS_ON :
|
case IS_ON :
|
||||||
{
|
{
|
||||||
_current = new Node( m_link->GetEndNode(), m_GC );
|
_current = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
Virtual_Point( _current, factor );
|
Virtual_Point( _current, factor );
|
||||||
shape->AddLink( _last_ins_left, _current );
|
shape->AddLink( _last_ins_left, _current );
|
||||||
_last_ins_left = _current;
|
_last_ins_left = _current;
|
||||||
|
|
||||||
_current = new Node( m_link->GetEndNode(), m_GC );
|
_current = new kbNode( m_link->GetEndNode(), m_GC );
|
||||||
Virtual_Point( _current, -factor );
|
Virtual_Point( _current, -factor );
|
||||||
shape->AddLink( _last_ins_right, _current );
|
shape->AddLink( _last_ins_right, _current );
|
||||||
_last_ins_right = _current;
|
_last_ins_right = _current;
|
||||||
|
@ -1090,11 +1090,11 @@ void KBoolLine::Create_End_Shape( KBoolLine* nextline, Node* _last_ins_left, Nod
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Generate from the found crossings a part of the graph
|
// Generate from the found crossings a part of the kbGraph
|
||||||
//
|
//
|
||||||
bool KBoolLine::ProcessCrossings( TDLI<KBoolLink>* _LI )
|
bool kbLine::ProcessCrossings( TDLI<kbLink>* _LI )
|
||||||
{
|
{
|
||||||
Node * last; KBoolLink *dummy;
|
kbNode * last; kbLink *dummy;
|
||||||
// assert (beginnode && endnode);
|
// assert (beginnode && endnode);
|
||||||
|
|
||||||
if ( !linecrosslist ) return false;
|
if ( !linecrosslist ) return false;
|
||||||
|
@ -1106,11 +1106,11 @@ bool KBoolLine::ProcessCrossings( TDLI<KBoolLink>* _LI )
|
||||||
// Make new links :
|
// Make new links :
|
||||||
while ( !linecrosslist->empty() )
|
while ( !linecrosslist->empty() )
|
||||||
{
|
{
|
||||||
dummy = new KBoolLink( m_link->GetGraphNum(), ( Node* ) linecrosslist->tailitem(), last, m_GC );
|
dummy = new kbLink( m_link->GetGraphNum(), ( kbNode* ) linecrosslist->tailitem(), last, m_GC );
|
||||||
dummy->SetBeenHere();
|
dummy->SetBeenHere();
|
||||||
dummy->SetGroup( m_link->Group() );
|
dummy->SetGroup( m_link->Group() );
|
||||||
_LI->insbegin( dummy );
|
_LI->insbegin( dummy );
|
||||||
last = ( Node* )linecrosslist->tailitem();
|
last = ( kbNode* )linecrosslist->tailitem();
|
||||||
linecrosslist->removetail();
|
linecrosslist->removetail();
|
||||||
}
|
}
|
||||||
// Recycle this link :
|
// Recycle this link :
|
||||||
|
@ -1123,7 +1123,7 @@ bool KBoolLine::ProcessCrossings( TDLI<KBoolLink>* _LI )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// Sorts the links on the X values
|
// Sorts the links on the X values
|
||||||
int NodeXYsorter(Node* a, Node* b)
|
int NodeXYsorter(kbNode* a, kbNode* b)
|
||||||
{
|
{
|
||||||
if ( a->GetX() < b->GetX())
|
if ( a->GetX() < b->GetX())
|
||||||
return(1);
|
return(1);
|
||||||
|
@ -1147,11 +1147,11 @@ int NodeXYsorter(Node* a, Node* b)
|
||||||
// The mostleft link most become the new link for the beam record
|
// The mostleft link most become the new link for the beam record
|
||||||
// therefore the mostleft new/old link is returned to become the beam record link
|
// therefore the mostleft new/old link is returned to become the beam record link
|
||||||
// also the part returned needs to have the bin flag set to the original value it had in the beam
|
// also the part returned needs to have the bin flag set to the original value it had in the beam
|
||||||
KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
kbLink* kbLine::ProcessCrossingsSmart(TDLI<kbLink>* _LI)
|
||||||
{
|
{
|
||||||
Node *lastinserted;
|
kbNode *lastinserted;
|
||||||
KBoolLink *new_link;
|
kbLink *new_link;
|
||||||
KBoolLink *returnlink;
|
kbLink *returnlink;
|
||||||
assert (beginnode && endnode);
|
assert (beginnode && endnode);
|
||||||
if (!linecrosslist) return this;
|
if (!linecrosslist) return this;
|
||||||
|
|
||||||
|
@ -1168,7 +1168,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
//re_use this link
|
//re_use this link
|
||||||
endnode->RemoveLink(this);
|
endnode->RemoveLink(this);
|
||||||
linecrosslist->insend(endnode); //the last link to create is towards this node
|
linecrosslist->insend(endnode); //the last link to create is towards this node
|
||||||
endnode=(Node*) linecrosslist->headitem();
|
endnode=(kbNode*) linecrosslist->headitem();
|
||||||
endnode->AddLink(this);
|
endnode->AddLink(this);
|
||||||
inbeam=NodeXYsorter(_LI->item()->beginnode,beginnode);
|
inbeam=NodeXYsorter(_LI->item()->beginnode,beginnode);
|
||||||
switch (inbeam)
|
switch (inbeam)
|
||||||
|
@ -1188,7 +1188,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
// Make new links starting at endnode
|
// Make new links starting at endnode
|
||||||
while (!linecrosslist->empty())
|
while (!linecrosslist->empty())
|
||||||
{
|
{
|
||||||
new_link=new KBoolLink(graphnum,lastinserted,(Node*) linecrosslist->headitem());
|
new_link=new kbLink(graphnum,lastinserted,(kbNode*) linecrosslist->headitem());
|
||||||
|
|
||||||
new_link->group=group;
|
new_link->group=group;
|
||||||
int inbeam=NodeXYsorter(_LI->item()->beginnode,lastinserted);
|
int inbeam=NodeXYsorter(_LI->item()->beginnode,lastinserted);
|
||||||
|
@ -1198,8 +1198,8 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
{
|
{
|
||||||
double x,y,xl,yl;
|
double x,y,xl,yl;
|
||||||
char buf[80];
|
char buf[80];
|
||||||
x=((Node*)(linecrosslist->headitem()))->GetX();
|
x=((kbNode*)(linecrosslist->headitem()))->GetX();
|
||||||
y=((Node*)(linecrosslist->headitem()))->GetY();
|
y=((kbNode*)(linecrosslist->headitem()))->GetY();
|
||||||
xl=_LI->item()->beginnode->GetX();
|
xl=_LI->item()->beginnode->GetX();
|
||||||
yl=_LI->item()->beginnode->GetY();
|
yl=_LI->item()->beginnode->GetY();
|
||||||
sprintf(buf," x=%f , y=%f inserted before %f,%f",x,y,xl,yl);
|
sprintf(buf," x=%f , y=%f inserted before %f,%f",x,y,xl,yl);
|
||||||
|
@ -1238,7 +1238,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
_LI->insbefore_unsave(new_link);
|
_LI->insbefore_unsave(new_link);
|
||||||
if (insert==0 && _LI->item()->beginnode!=new_link->beginnode)
|
if (insert==0 && _LI->item()->beginnode!=new_link->beginnode)
|
||||||
//the begin nodes are equal but not the same merge them into one node
|
//the begin nodes are equal but not the same merge them into one node
|
||||||
{ Node* todelete=_LI->item()->beginnode;
|
{ kbNode* todelete=_LI->item()->beginnode;
|
||||||
new_link->beginnode->Merge(todelete);
|
new_link->beginnode->Merge(todelete);
|
||||||
delete todelete;
|
delete todelete;
|
||||||
}
|
}
|
||||||
|
@ -1247,7 +1247,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
(*_LI) << (i+1);
|
(*_LI) << (i+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastinserted=(Node*)linecrosslist->headitem();
|
lastinserted=(kbNode*)linecrosslist->headitem();
|
||||||
linecrosslist->removehead();
|
linecrosslist->removehead();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1256,7 +1256,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
//re_use this link
|
//re_use this link
|
||||||
endnode->RemoveLink(this);
|
endnode->RemoveLink(this);
|
||||||
linecrosslist->insend(endnode); //the last link to create is towards this node
|
linecrosslist->insend(endnode); //the last link to create is towards this node
|
||||||
endnode=(Node*) linecrosslist->headitem();
|
endnode=(kbNode*) linecrosslist->headitem();
|
||||||
endnode->AddLink(this);
|
endnode->AddLink(this);
|
||||||
inbeam=NodeXYsorter(_LI->item()->beginnode,endnode);
|
inbeam=NodeXYsorter(_LI->item()->beginnode,endnode);
|
||||||
switch (inbeam)
|
switch (inbeam)
|
||||||
|
@ -1277,10 +1277,10 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
// Make new links starting at endnode
|
// Make new links starting at endnode
|
||||||
while (!linecrosslist->empty())
|
while (!linecrosslist->empty())
|
||||||
{
|
{
|
||||||
new_link=new KBoolLink(graphnum,lastinserted,(Node*) linecrosslist->headitem());
|
new_link=new kbLink(graphnum,lastinserted,(kbNode*) linecrosslist->headitem());
|
||||||
new_link->group=group;
|
new_link->group=group;
|
||||||
|
|
||||||
inbeam=NodeXYsorter(_LI->item()->beginnode,(Node*) linecrosslist->headitem());
|
inbeam=NodeXYsorter(_LI->item()->beginnode,(kbNode*) linecrosslist->headitem());
|
||||||
switch (inbeam)
|
switch (inbeam)
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
|
@ -1335,7 +1335,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
_LI->insbefore_unsave(new_link);
|
_LI->insbefore_unsave(new_link);
|
||||||
if (insert==0 && _LI->item()->beginnode!=new_link->beginnode)
|
if (insert==0 && _LI->item()->beginnode!=new_link->beginnode)
|
||||||
//the begin nodes are equal but not the same merge them into one node
|
//the begin nodes are equal but not the same merge them into one node
|
||||||
{ Node* todelete=_LI->item()->beginnode;
|
{ kbNode* todelete=_LI->item()->beginnode;
|
||||||
new_link->beginnode->Merge(todelete);
|
new_link->beginnode->Merge(todelete);
|
||||||
delete todelete;
|
delete todelete;
|
||||||
}
|
}
|
||||||
|
@ -1343,7 +1343,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
(*_LI) << (i+1);
|
(*_LI) << (i+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastinserted=(Node*)linecrosslist->headitem();
|
lastinserted=(kbNode*)linecrosslist->headitem();
|
||||||
linecrosslist->removehead();
|
linecrosslist->removehead();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1354,7 +1354,7 @@ KBoolLink* KBoolLine::ProcessCrossingsSmart(TDLI<KBoolLink>* _LI)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int NODE_X_ASCENDING_L ( Node* a, Node* b )
|
static int NODE_X_ASCENDING_L ( kbNode* a, kbNode* b )
|
||||||
{
|
{
|
||||||
if( b->GetX() > a->GetX() ) return( 1 );
|
if( b->GetX() > a->GetX() ) return( 1 );
|
||||||
else
|
else
|
||||||
|
@ -1363,7 +1363,7 @@ static int NODE_X_ASCENDING_L ( Node* a, Node* b )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static int NODE_X_DESCENDING_L( Node* a, Node* b )
|
static int NODE_X_DESCENDING_L( kbNode* a, kbNode* b )
|
||||||
{
|
{
|
||||||
if( a->GetX() > b->GetX() ) return( 1 );
|
if( a->GetX() > b->GetX() ) return( 1 );
|
||||||
else
|
else
|
||||||
|
@ -1372,7 +1372,7 @@ static int NODE_X_DESCENDING_L( Node* a, Node* b )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static int NODE_Y_ASCENDING_L ( Node* a, Node* b )
|
static int NODE_Y_ASCENDING_L ( kbNode* a, kbNode* b )
|
||||||
{
|
{
|
||||||
if( b->GetY() > a->GetY() ) return( 1 );
|
if( b->GetY() > a->GetY() ) return( 1 );
|
||||||
else
|
else
|
||||||
|
@ -1380,7 +1380,7 @@ static int NODE_Y_ASCENDING_L ( Node* a, Node* b )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static int NODE_Y_DESCENDING_L( Node* a, Node* b )
|
static int NODE_Y_DESCENDING_L( kbNode* a, kbNode* b )
|
||||||
{
|
{
|
||||||
if( a->GetY() > b->GetY() ) return( 1 );
|
if( a->GetY() > b->GetY() ) return( 1 );
|
||||||
else
|
else
|
||||||
|
@ -1393,9 +1393,9 @@ static int NODE_Y_DESCENDING_L( Node* a, Node* b )
|
||||||
// This function finds out which sortfunction to use with sorting
|
// This function finds out which sortfunction to use with sorting
|
||||||
// the crossings.
|
// the crossings.
|
||||||
//
|
//
|
||||||
void KBoolLine::SortLineCrossings()
|
void kbLine::SortLineCrossings()
|
||||||
{
|
{
|
||||||
TDLI<Node> I( linecrosslist );
|
TDLI<kbNode> I( linecrosslist );
|
||||||
|
|
||||||
B_INT dx, dy;
|
B_INT dx, dy;
|
||||||
dx = babs( m_link->GetEndNode()->GetX() - m_link->GetBeginNode()->GetX() );
|
dx = babs( m_link->GetEndNode()->GetX() - m_link->GetBeginNode()->GetX() );
|
||||||
|
@ -1419,7 +1419,7 @@ void KBoolLine::SortLineCrossings()
|
||||||
//
|
//
|
||||||
// Adds a cross Node to this. a_node may not be deleted before processing the crossings
|
// Adds a cross Node to this. a_node may not be deleted before processing the crossings
|
||||||
//
|
//
|
||||||
void KBoolLine::AddCrossing( Node *a_node )
|
void kbLine::AddCrossing( kbNode *a_node )
|
||||||
{
|
{
|
||||||
if ( a_node == m_link->GetBeginNode() || a_node == m_link->GetEndNode() ) return;
|
if ( a_node == m_link->GetBeginNode() || a_node == m_link->GetEndNode() ) return;
|
||||||
|
|
||||||
|
@ -1431,7 +1431,7 @@ void KBoolLine::AddCrossing( Node *a_node )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TDLI<Node> I( linecrosslist );
|
TDLI<kbNode> I( linecrosslist );
|
||||||
if ( !I.has( a_node ) )
|
if ( !I.has( a_node ) )
|
||||||
I.insend( a_node );
|
I.insend( a_node );
|
||||||
}
|
}
|
||||||
|
@ -1440,21 +1440,21 @@ void KBoolLine::AddCrossing( Node *a_node )
|
||||||
//
|
//
|
||||||
// see above
|
// see above
|
||||||
//
|
//
|
||||||
Node* KBoolLine::AddCrossing( B_INT X, B_INT Y )
|
kbNode* kbLine::AddCrossing( B_INT X, B_INT Y )
|
||||||
{
|
{
|
||||||
Node * result = new Node( X, Y, m_GC );
|
kbNode * result = new kbNode( X, Y, m_GC );
|
||||||
AddCrossing( result );
|
AddCrossing( result );
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DL_List<void*>* KBoolLine::GetCrossList()
|
DL_List<void*>* kbLine::GetCrossList()
|
||||||
{
|
{
|
||||||
if ( linecrosslist )
|
if ( linecrosslist )
|
||||||
return linecrosslist;
|
return linecrosslist;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLine::CrossListEmpty()
|
bool kbLine::CrossListEmpty()
|
||||||
{
|
{
|
||||||
if ( linecrosslist )
|
if ( linecrosslist )
|
||||||
return linecrosslist->empty();
|
return linecrosslist->empty();
|
||||||
|
@ -1462,11 +1462,11 @@ bool KBoolLine::CrossListEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
bool KBoolLine::HasInCrossList(Node *n)
|
bool kbLine::HasInCrossList(kbNode *n)
|
||||||
{
|
{
|
||||||
if(linecrosslist!=NULL)
|
if(linecrosslist!=NULL)
|
||||||
{
|
{
|
||||||
TDLI<Node> I(linecrosslist);
|
TDLI<kbNode> I(linecrosslist);
|
||||||
return I.has(n);
|
return I.has(n);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: link.cpp,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: link.cpp,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kbool/booleng.h"
|
#include "kbool/booleng.h"
|
||||||
|
@ -19,12 +19,12 @@
|
||||||
#include "kbool/graph.h"
|
#include "kbool/graph.h"
|
||||||
#include "kbool/graphlst.h"
|
#include "kbool/graphlst.h"
|
||||||
|
|
||||||
int linkXYsorter( KBoolLink *, KBoolLink * );
|
int linkXYsorter( kbLink *, kbLink * );
|
||||||
|
|
||||||
//
|
//
|
||||||
// Default constructor
|
// Default constructor
|
||||||
//
|
//
|
||||||
KBoolLink::KBoolLink( Bool_Engine* GC )
|
kbLink::kbLink( Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
Reset();
|
Reset();
|
||||||
|
@ -34,7 +34,7 @@ KBoolLink::KBoolLink( Bool_Engine* GC )
|
||||||
//
|
//
|
||||||
// This constructor makes this link a valid part of a graph
|
// This constructor makes this link a valid part of a graph
|
||||||
//
|
//
|
||||||
KBoolLink::KBoolLink( int graphnr, Node *begin, Node *end, Bool_Engine* GC )
|
kbLink::kbLink( int graphnr, kbNode *begin, kbNode *end, Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
Reset();
|
Reset();
|
||||||
|
@ -50,7 +50,7 @@ KBoolLink::KBoolLink( int graphnr, Node *begin, Node *end, Bool_Engine* GC )
|
||||||
//
|
//
|
||||||
// This constructor makes this link a valid part of a graph
|
// This constructor makes this link a valid part of a graph
|
||||||
//
|
//
|
||||||
KBoolLink::KBoolLink( Node *begin, Node *end, Bool_Engine* GC )
|
kbLink::kbLink( kbNode *begin, kbNode *end, Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
Reset();
|
Reset();
|
||||||
|
@ -67,7 +67,7 @@ KBoolLink::KBoolLink( Node *begin, Node *end, Bool_Engine* GC )
|
||||||
//
|
//
|
||||||
// Destructor
|
// Destructor
|
||||||
//
|
//
|
||||||
KBoolLink::~KBoolLink()
|
kbLink::~kbLink()
|
||||||
{
|
{
|
||||||
UnLink();
|
UnLink();
|
||||||
}
|
}
|
||||||
|
@ -75,13 +75,13 @@ KBoolLink::~KBoolLink()
|
||||||
//
|
//
|
||||||
// Checks whether the current algorithm has been on this link
|
// Checks whether the current algorithm has been on this link
|
||||||
//
|
//
|
||||||
bool KBoolLink::BeenHere()
|
bool kbLink::BeenHere()
|
||||||
{
|
{
|
||||||
if ( m_bin ) return true;
|
if ( m_bin ) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::TakeOverOperationFlags( KBoolLink* link )
|
void kbLink::TakeOverOperationFlags( kbLink* link )
|
||||||
{
|
{
|
||||||
m_merge_L = link->m_merge_L;
|
m_merge_L = link->m_merge_L;
|
||||||
m_a_substract_b_L = link->m_a_substract_b_L;
|
m_a_substract_b_L = link->m_a_substract_b_L;
|
||||||
|
@ -98,7 +98,7 @@ void KBoolLink::TakeOverOperationFlags( KBoolLink* link )
|
||||||
//
|
//
|
||||||
// Returns the next link from the argument
|
// Returns the next link from the argument
|
||||||
//
|
//
|
||||||
KBoolLink* KBoolLink::Forth( Node *node )
|
kbLink* kbLink::Forth( kbNode *node )
|
||||||
{
|
{
|
||||||
assert( node == m_beginnode || node == m_endnode );
|
assert( node == m_beginnode || node == m_endnode );
|
||||||
return node->GetOtherLink( this );
|
return node->GetOtherLink( this );
|
||||||
|
@ -107,7 +107,7 @@ KBoolLink* KBoolLink::Forth( Node *node )
|
||||||
//
|
//
|
||||||
// Returns the Beginnode
|
// Returns the Beginnode
|
||||||
//
|
//
|
||||||
Node *KBoolLink::GetBeginNode()
|
kbNode *kbLink::GetBeginNode()
|
||||||
{
|
{
|
||||||
return m_beginnode;
|
return m_beginnode;
|
||||||
}
|
}
|
||||||
|
@ -115,17 +115,17 @@ Node *KBoolLink::GetBeginNode()
|
||||||
//
|
//
|
||||||
// Returns the endnode
|
// Returns the endnode
|
||||||
//
|
//
|
||||||
Node* KBoolLink::GetEndNode()
|
kbNode* kbLink::GetEndNode()
|
||||||
{
|
{
|
||||||
return m_endnode;
|
return m_endnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node* KBoolLink::GetLowNode()
|
kbNode* kbLink::GetLowNode()
|
||||||
{
|
{
|
||||||
return ( ( m_beginnode->GetY() < m_endnode->GetY() ) ? m_beginnode : m_endnode );
|
return ( ( m_beginnode->GetY() < m_endnode->GetY() ) ? m_beginnode : m_endnode );
|
||||||
}
|
}
|
||||||
|
|
||||||
Node* KBoolLink::GetHighNode()
|
kbNode* kbLink::GetHighNode()
|
||||||
{
|
{
|
||||||
return ( ( m_beginnode->GetY() > m_endnode->GetY() ) ? m_beginnode : m_endnode );
|
return ( ( m_beginnode->GetY() > m_endnode->GetY() ) ? m_beginnode : m_endnode );
|
||||||
}
|
}
|
||||||
|
@ -133,61 +133,61 @@ Node* KBoolLink::GetHighNode()
|
||||||
//
|
//
|
||||||
// Returns the graphnumber
|
// Returns the graphnumber
|
||||||
//
|
//
|
||||||
int KBoolLink::GetGraphNum()
|
int kbLink::GetGraphNum()
|
||||||
{
|
{
|
||||||
return m_graphnum;
|
return m_graphnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLink::GetInc()
|
bool kbLink::GetInc()
|
||||||
{
|
{
|
||||||
return m_Inc;
|
return m_Inc;
|
||||||
// if (Inc) return true;
|
// if (Inc) return true;
|
||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetInc( bool inc )
|
void kbLink::SetInc( bool inc )
|
||||||
{
|
{
|
||||||
m_Inc = inc;
|
m_Inc = inc;
|
||||||
// Inc=0;
|
// Inc=0;
|
||||||
// if (inc) Inc=1;
|
// if (inc) Inc=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLink::GetLeftA()
|
bool kbLink::GetLeftA()
|
||||||
{
|
{
|
||||||
return m_LeftA;
|
return m_LeftA;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetLeftA( bool la )
|
void kbLink::SetLeftA( bool la )
|
||||||
{
|
{
|
||||||
m_LeftA = la;
|
m_LeftA = la;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLink::GetLeftB()
|
bool kbLink::GetLeftB()
|
||||||
{
|
{
|
||||||
return m_LeftB;
|
return m_LeftB;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetLeftB( bool lb )
|
void kbLink::SetLeftB( bool lb )
|
||||||
{
|
{
|
||||||
m_LeftB = lb;
|
m_LeftB = lb;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLink::GetRightA()
|
bool kbLink::GetRightA()
|
||||||
{
|
{
|
||||||
return m_RightA;
|
return m_RightA;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetRightA( bool ra )
|
void kbLink::SetRightA( bool ra )
|
||||||
{
|
{
|
||||||
m_RightA = ra;
|
m_RightA = ra;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLink::GetRightB()
|
bool kbLink::GetRightB()
|
||||||
{
|
{
|
||||||
return m_RightB;
|
return m_RightB;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetRightB( bool rb )
|
void kbLink::SetRightB( bool rb )
|
||||||
{
|
{
|
||||||
m_RightB = rb;
|
m_RightB = rb;
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,7 @@ void KBoolLink::SetRightB( bool rb )
|
||||||
// This function is very popular by GP-faults
|
// This function is very popular by GP-faults
|
||||||
// It returns the node different from a
|
// It returns the node different from a
|
||||||
//
|
//
|
||||||
Node* KBoolLink::GetOther( const Node *const a )
|
kbNode* kbLink::GetOther( const kbNode *const a )
|
||||||
{
|
{
|
||||||
return ( ( a != m_beginnode ) ? m_beginnode : m_endnode );
|
return ( ( a != m_beginnode ) ? m_beginnode : m_endnode );
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,7 @@ Node* KBoolLink::GetOther( const Node *const a )
|
||||||
//
|
//
|
||||||
// Is this marked for given operation
|
// Is this marked for given operation
|
||||||
//
|
//
|
||||||
bool KBoolLink::IsMarked( BOOL_OP operation )
|
bool kbLink::IsMarked( BOOL_OP operation )
|
||||||
{
|
{
|
||||||
switch ( operation )
|
switch ( operation )
|
||||||
{
|
{
|
||||||
|
@ -218,7 +218,7 @@ bool KBoolLink::IsMarked( BOOL_OP operation )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLink::IsMarkedLeft( BOOL_OP operation )
|
bool kbLink::IsMarkedLeft( BOOL_OP operation )
|
||||||
{
|
{
|
||||||
switch ( operation )
|
switch ( operation )
|
||||||
{
|
{
|
||||||
|
@ -231,7 +231,7 @@ bool KBoolLink::IsMarkedLeft( BOOL_OP operation )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KBoolLink::IsMarkedRight( BOOL_OP operation )
|
bool kbLink::IsMarkedRight( BOOL_OP operation )
|
||||||
{
|
{
|
||||||
switch ( operation )
|
switch ( operation )
|
||||||
{
|
{
|
||||||
|
@ -247,7 +247,7 @@ bool KBoolLink::IsMarkedRight( BOOL_OP operation )
|
||||||
//
|
//
|
||||||
// Is this a hole for given operation
|
// Is this a hole for given operation
|
||||||
// beginnode must be to the left
|
// beginnode must be to the left
|
||||||
bool KBoolLink::IsHole( BOOL_OP operation )
|
bool kbLink::IsHole( BOOL_OP operation )
|
||||||
{
|
{
|
||||||
|
|
||||||
bool topsideA, topsideB;
|
bool topsideA, topsideB;
|
||||||
|
@ -271,13 +271,13 @@ bool KBoolLink::IsHole( BOOL_OP operation )
|
||||||
//
|
//
|
||||||
// Is this a part of a hole
|
// Is this a part of a hole
|
||||||
//
|
//
|
||||||
bool KBoolLink::GetHole()
|
bool kbLink::GetHole()
|
||||||
{
|
{
|
||||||
return ( m_hole );
|
return ( m_hole );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KBoolLink::SetHole( bool h )
|
void kbLink::SetHole( bool h )
|
||||||
{
|
{
|
||||||
m_hole = h;
|
m_hole = h;
|
||||||
}
|
}
|
||||||
|
@ -286,7 +286,7 @@ void KBoolLink::SetHole( bool h )
|
||||||
//
|
//
|
||||||
// Is this not marked at all
|
// Is this not marked at all
|
||||||
//
|
//
|
||||||
bool KBoolLink::IsUnused()
|
bool kbLink::IsUnused()
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
!( m_merge_L || m_merge_R ||
|
!( m_merge_L || m_merge_R ||
|
||||||
|
@ -297,13 +297,13 @@ bool KBoolLink::IsUnused()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool KBoolLink::IsZero( B_INT marge )
|
bool kbLink::IsZero( B_INT marge )
|
||||||
{
|
{
|
||||||
return ( m_beginnode->Equal( m_endnode, marge ) ) ;
|
return ( m_beginnode->Equal( m_endnode, marge ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool KBoolLink::ShorterThan( B_INT marge )
|
bool kbLink::ShorterThan( B_INT marge )
|
||||||
{
|
{
|
||||||
return ( m_beginnode->ShorterThan( m_endnode, marge ) ) ;
|
return ( m_beginnode->ShorterThan( m_endnode, marge ) ) ;
|
||||||
}
|
}
|
||||||
|
@ -312,7 +312,7 @@ bool KBoolLink::ShorterThan( B_INT marge )
|
||||||
//
|
//
|
||||||
// Mark this link
|
// Mark this link
|
||||||
//
|
//
|
||||||
void KBoolLink::Mark()
|
void kbLink::Mark()
|
||||||
{
|
{
|
||||||
m_mark = true;
|
m_mark = true;
|
||||||
}
|
}
|
||||||
|
@ -328,7 +328,7 @@ void KBoolLink::Mark()
|
||||||
// The references to this link in the node will also be deleted
|
// The references to this link in the node will also be deleted
|
||||||
// After doing that, link link can be deleted or be recycled.
|
// After doing that, link link can be deleted or be recycled.
|
||||||
//
|
//
|
||||||
void KBoolLink::MergeNodes( Node *const begin_or_end_node )
|
void kbLink::MergeNodes( kbNode *const begin_or_end_node )
|
||||||
{
|
{
|
||||||
// assert(beginnode && endnode);
|
// assert(beginnode && endnode);
|
||||||
// assert ((begin_or_end_node == beginnode)||(begin_or_end_node == endnode));
|
// assert ((begin_or_end_node == beginnode)||(begin_or_end_node == endnode));
|
||||||
|
@ -350,15 +350,15 @@ void KBoolLink::MergeNodes( Node *const begin_or_end_node )
|
||||||
// Here Left and Right is defined as being left or right from
|
// Here Left and Right is defined as being left or right from
|
||||||
// the this link towards the center (common) node
|
// the this link towards the center (common) node
|
||||||
//
|
//
|
||||||
LinkStatus KBoolLink::OutProduct( KBoolLink* const two, double accur )
|
LinkStatus kbLink::OutProduct( kbLink* const two, double accur )
|
||||||
{
|
{
|
||||||
Node * center;
|
kbNode * center;
|
||||||
double distance;
|
double distance;
|
||||||
if ( two->GetBeginNode()->Equal( two->GetEndNode(), 1 ) )
|
if ( two->GetBeginNode()->Equal( two->GetEndNode(), 1 ) )
|
||||||
assert( !two );
|
assert( !two );
|
||||||
if ( GetBeginNode()->Equal( GetEndNode(), 1 ) )
|
if ( GetBeginNode()->Equal( GetEndNode(), 1 ) )
|
||||||
assert( !this );
|
assert( !this );
|
||||||
KBoolLine* temp_line = new KBoolLine( this, _GC );
|
kbLine* temp_line = new kbLine( this, _GC );
|
||||||
|
|
||||||
//the this link should connect to the other two link at at least one node
|
//the this link should connect to the other two link at at least one node
|
||||||
if ( m_endnode == two->m_endnode || m_endnode == two->m_beginnode )
|
if ( m_endnode == two->m_endnode || m_endnode == two->m_beginnode )
|
||||||
|
@ -405,7 +405,7 @@ LinkStatus KBoolLink::OutProduct( KBoolLink* const two, double accur )
|
||||||
// the second link
|
// the second link
|
||||||
// Result = IS_ON | IS_LEFT | IS_RIGHT
|
// Result = IS_ON | IS_LEFT | IS_RIGHT
|
||||||
//
|
//
|
||||||
LinkStatus KBoolLink::PointOnCorner( KBoolLink* const two, KBoolLink* const third )
|
LinkStatus kbLink::PointOnCorner( kbLink* const two, kbLink* const third )
|
||||||
{
|
{
|
||||||
LinkStatus
|
LinkStatus
|
||||||
TwoToOne, // Position of two to this line
|
TwoToOne, // Position of two to this line
|
||||||
|
@ -413,7 +413,7 @@ LinkStatus KBoolLink::PointOnCorner( KBoolLink* const two, KBoolLink* const thir
|
||||||
ThirdToTwo, // Position of third to two
|
ThirdToTwo, // Position of third to two
|
||||||
Result;
|
Result;
|
||||||
|
|
||||||
//m Node* center;
|
//m kbNode* center;
|
||||||
|
|
||||||
//the this link should connect to the other two link at at least one node
|
//the this link should connect to the other two link at at least one node
|
||||||
//m if (endnode==two->endnode || endnode==two->beginnode)
|
//m if (endnode==two->endnode || endnode==two->beginnode)
|
||||||
|
@ -462,7 +462,7 @@ LinkStatus KBoolLink::PointOnCorner( KBoolLink* const two, KBoolLink* const thir
|
||||||
//
|
//
|
||||||
// Remove the reference from this link to a_node
|
// Remove the reference from this link to a_node
|
||||||
//
|
//
|
||||||
void KBoolLink::Remove( Node *a_node )
|
void kbLink::Remove( kbNode *a_node )
|
||||||
{
|
{
|
||||||
( m_beginnode == a_node ) ? m_beginnode = NULL : m_endnode = NULL;
|
( m_beginnode == a_node ) ? m_beginnode = NULL : m_endnode = NULL;
|
||||||
}
|
}
|
||||||
|
@ -471,7 +471,7 @@ void KBoolLink::Remove( Node *a_node )
|
||||||
//
|
//
|
||||||
// Replace oldnode by newnode and correct the references
|
// Replace oldnode by newnode and correct the references
|
||||||
//
|
//
|
||||||
void KBoolLink::Replace( Node *oldnode, Node *newnode )
|
void kbLink::Replace( kbNode *oldnode, kbNode *newnode )
|
||||||
{
|
{
|
||||||
if ( m_beginnode == oldnode )
|
if ( m_beginnode == oldnode )
|
||||||
{
|
{
|
||||||
|
@ -491,7 +491,7 @@ void KBoolLink::Replace( Node *oldnode, Node *newnode )
|
||||||
//
|
//
|
||||||
// Reset all values
|
// Reset all values
|
||||||
//
|
//
|
||||||
void KBoolLink::Reset()
|
void kbLink::Reset()
|
||||||
{
|
{
|
||||||
m_beginnode = 0;
|
m_beginnode = 0;
|
||||||
m_endnode = 0;
|
m_endnode = 0;
|
||||||
|
@ -502,7 +502,7 @@ void KBoolLink::Reset()
|
||||||
//
|
//
|
||||||
// Reset all flags
|
// Reset all flags
|
||||||
//
|
//
|
||||||
void KBoolLink::Reset_flags()
|
void kbLink::Reset_flags()
|
||||||
{
|
{
|
||||||
m_bin = false; // Marker for walking over the graph
|
m_bin = false; // Marker for walking over the graph
|
||||||
m_hole = false; // Is this a part of hole ?
|
m_hole = false; // Is this a part of hole ?
|
||||||
|
@ -525,7 +525,7 @@ void KBoolLink::Reset_flags()
|
||||||
//
|
//
|
||||||
// Refill this link by the arguments
|
// Refill this link by the arguments
|
||||||
//
|
//
|
||||||
void KBoolLink::Reset( Node *begin, Node *end, int graphnr )
|
void kbLink::Reset( kbNode *begin, kbNode *end, int graphnr )
|
||||||
{
|
{
|
||||||
// Remove all the previous references
|
// Remove all the previous references
|
||||||
UnLink();
|
UnLink();
|
||||||
|
@ -540,29 +540,29 @@ void KBoolLink::Reset( Node *begin, Node *end, int graphnr )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KBoolLink::Set( Node *begin, Node *end )
|
void kbLink::Set( kbNode *begin, kbNode *end )
|
||||||
{
|
{
|
||||||
m_beginnode = begin;
|
m_beginnode = begin;
|
||||||
m_endnode = end;
|
m_endnode = end;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetBeenHere()
|
void kbLink::SetBeenHere()
|
||||||
{
|
{
|
||||||
m_bin = true;
|
m_bin = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetNotBeenHere()
|
void kbLink::SetNotBeenHere()
|
||||||
{
|
{
|
||||||
m_bin = false;
|
m_bin = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetBeginNode( Node* new_node )
|
void kbLink::SetBeginNode( kbNode* new_node )
|
||||||
{
|
{
|
||||||
m_beginnode = new_node;
|
m_beginnode = new_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KBoolLink::SetEndNode( Node* new_node )
|
void kbLink::SetEndNode( kbNode* new_node )
|
||||||
{
|
{
|
||||||
m_endnode = new_node;
|
m_endnode = new_node;
|
||||||
}
|
}
|
||||||
|
@ -571,12 +571,12 @@ void KBoolLink::SetEndNode( Node* new_node )
|
||||||
//
|
//
|
||||||
// Sets the graphnumber to argument num
|
// Sets the graphnumber to argument num
|
||||||
//
|
//
|
||||||
void KBoolLink::SetGraphNum( int num )
|
void kbLink::SetGraphNum( int num )
|
||||||
{
|
{
|
||||||
m_graphnum = num;
|
m_graphnum = num;
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupType KBoolLink::Group()
|
GroupType kbLink::Group()
|
||||||
{
|
{
|
||||||
return m_group;
|
return m_group;
|
||||||
}
|
}
|
||||||
|
@ -585,7 +585,7 @@ GroupType KBoolLink::Group()
|
||||||
//
|
//
|
||||||
// Reset the groupflag to argument groep
|
// Reset the groupflag to argument groep
|
||||||
//
|
//
|
||||||
void KBoolLink::SetGroup( GroupType groep )
|
void kbLink::SetGroup( GroupType groep )
|
||||||
{
|
{
|
||||||
m_group = groep;
|
m_group = groep;
|
||||||
}
|
}
|
||||||
|
@ -594,7 +594,7 @@ void KBoolLink::SetGroup( GroupType groep )
|
||||||
//
|
//
|
||||||
// Remove all references to this link and from this link
|
// Remove all references to this link and from this link
|
||||||
//
|
//
|
||||||
void KBoolLink::UnLink()
|
void kbLink::UnLink()
|
||||||
{
|
{
|
||||||
if ( m_beginnode )
|
if ( m_beginnode )
|
||||||
{
|
{
|
||||||
|
@ -611,13 +611,13 @@ void KBoolLink::UnLink()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KBoolLink::UnMark()
|
void kbLink::UnMark()
|
||||||
{
|
{
|
||||||
m_mark = false;
|
m_mark = false;
|
||||||
m_bin = false;
|
m_bin = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KBoolLink::SetMark( bool value )
|
void kbLink::SetMark( bool value )
|
||||||
{
|
{
|
||||||
m_mark = value;
|
m_mark = value;
|
||||||
}
|
}
|
||||||
|
@ -625,16 +625,16 @@ void KBoolLink::SetMark( bool value )
|
||||||
//
|
//
|
||||||
// general purpose mark checker
|
// general purpose mark checker
|
||||||
//
|
//
|
||||||
bool KBoolLink::IsMarked() { return m_mark; }
|
bool kbLink::IsMarked() { return m_mark; }
|
||||||
|
|
||||||
void KBoolLink::SetTopHole( bool value ) { m_hole_top = value; }
|
void kbLink::SetTopHole( bool value ) { m_hole_top = value; }
|
||||||
|
|
||||||
bool KBoolLink::IsTopHole() { return m_hole_top; }
|
bool kbLink::IsTopHole() { return m_hole_top; }
|
||||||
|
|
||||||
//
|
//
|
||||||
// Calculates the merge/substact/exor/intersect flags
|
// Calculates the merge/substact/exor/intersect flags
|
||||||
//
|
//
|
||||||
void KBoolLink::SetLineTypes()
|
void kbLink::SetLineTypes()
|
||||||
{
|
{
|
||||||
m_merge_R =
|
m_merge_R =
|
||||||
m_a_substract_b_R =
|
m_a_substract_b_R =
|
||||||
|
@ -681,12 +681,12 @@ void KBoolLink::SetLineTypes()
|
||||||
|
|
||||||
|
|
||||||
//put in direction with a_node as beginnode
|
//put in direction with a_node as beginnode
|
||||||
void KBoolLink::Redirect( Node* a_node )
|
void kbLink::Redirect( kbNode* a_node )
|
||||||
{
|
{
|
||||||
if ( a_node != m_beginnode )
|
if ( a_node != m_beginnode )
|
||||||
{
|
{
|
||||||
// swap the begin- and endnode of the current link
|
// swap the begin- and endnode of the current link
|
||||||
Node * dummy = m_beginnode;
|
kbNode * dummy = m_beginnode;
|
||||||
m_beginnode = m_endnode;
|
m_beginnode = m_endnode;
|
||||||
m_endnode = dummy;
|
m_endnode = dummy;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*! \file src/lpoint.cpp
|
/*! \file src/lpoint.cpp
|
||||||
\brief Definition of GDSII LPoint type structure
|
\brief Definition of GDSII kbLPoint type structure
|
||||||
\author Klaas Holwerda
|
\author Klaas Holwerda
|
||||||
|
|
||||||
Copyright: 2001-2004 (C) Klaas Holwerda
|
Copyright: 2001-2004 (C) Klaas Holwerda
|
||||||
|
@ -13,73 +13,73 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
LPoint::LPoint()
|
kbLPoint::kbLPoint()
|
||||||
{
|
{
|
||||||
_x = 0;
|
_x = 0;
|
||||||
_y = 0;
|
_y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LPoint::LPoint( B_INT const X, B_INT const Y )
|
kbLPoint::kbLPoint( B_INT const X, B_INT const Y )
|
||||||
{
|
{
|
||||||
_x = X;
|
_x = X;
|
||||||
_y = Y;
|
_y = Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LPoint::LPoint( LPoint* const a_point )
|
kbLPoint::kbLPoint( kbLPoint* const a_point )
|
||||||
{
|
{
|
||||||
if ( !a_point )
|
if ( !a_point )
|
||||||
throw Bool_Engine_Error( "Cannot copy a NULL Point Object.\n\nCould not create a LPoint Object.",
|
throw Bool_Engine_Error( "Cannot copy a NULL Point Object.\n\nCould not create a kbLPoint Object.",
|
||||||
"Fatal Creation Error", 0, 1 );
|
"Fatal Creation Error", 0, 1 );
|
||||||
_x = a_point->_x;
|
_x = a_point->_x;
|
||||||
_y = a_point->_y;
|
_y = a_point->_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
B_INT LPoint::GetX()
|
B_INT kbLPoint::GetX()
|
||||||
{
|
{
|
||||||
return _x;
|
return _x;
|
||||||
}
|
}
|
||||||
|
|
||||||
B_INT LPoint::GetY()
|
B_INT kbLPoint::GetY()
|
||||||
{
|
{
|
||||||
return _y;
|
return _y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LPoint::SetX( B_INT a_point_x )
|
void kbLPoint::SetX( B_INT a_point_x )
|
||||||
{
|
{
|
||||||
_x = a_point_x;
|
_x = a_point_x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LPoint::SetY( B_INT a_point_y )
|
void kbLPoint::SetY( B_INT a_point_y )
|
||||||
{
|
{
|
||||||
_y = a_point_y;
|
_y = a_point_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
LPoint LPoint::GetPoint()
|
kbLPoint kbLPoint::GetPoint()
|
||||||
{
|
{
|
||||||
return * this;
|
return * this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LPoint::Set( const B_INT X, const B_INT Y )
|
void kbLPoint::Set( const B_INT X, const B_INT Y )
|
||||||
{
|
{
|
||||||
_x = X;
|
_x = X;
|
||||||
_y = Y;
|
_y = Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LPoint::Set( const LPoint &a_point )
|
void kbLPoint::Set( const kbLPoint &a_point )
|
||||||
{
|
{
|
||||||
_x = a_point._x;
|
_x = a_point._x;
|
||||||
_y = a_point._y;
|
_y = a_point._y;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LPoint::Equal( const LPoint a_point, B_INT Marge )
|
bool kbLPoint::Equal( const kbLPoint a_point, B_INT Marge )
|
||||||
{
|
{
|
||||||
B_INT delta_x, delta_y;
|
B_INT delta_x, delta_y;
|
||||||
|
|
||||||
|
@ -93,12 +93,12 @@ bool LPoint::Equal( const LPoint a_point, B_INT Marge )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LPoint::Equal( const B_INT X, const B_INT Y, B_INT Marge )
|
bool kbLPoint::Equal( const B_INT X, const B_INT Y, B_INT Marge )
|
||||||
{
|
{
|
||||||
return ( bool )( ( babs( _x - X ) <= Marge ) && ( babs( _y - Y ) <= Marge ) );
|
return ( bool )( ( babs( _x - X ) <= Marge ) && ( babs( _y - Y ) <= Marge ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LPoint::ShorterThan( const LPoint a_point, B_INT Marge )
|
bool kbLPoint::ShorterThan( const kbLPoint a_point, B_INT Marge )
|
||||||
{
|
{
|
||||||
double a, b;
|
double a, b;
|
||||||
a = ( double ) ( a_point._x - _x );
|
a = ( double ) ( a_point._x - _x );
|
||||||
|
@ -110,7 +110,7 @@ bool LPoint::ShorterThan( const LPoint a_point, B_INT Marge )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LPoint::ShorterThan( const B_INT X, const B_INT Y, B_INT Marge )
|
bool kbLPoint::ShorterThan( const B_INT X, const B_INT Y, B_INT Marge )
|
||||||
{
|
{
|
||||||
double a, b;
|
double a, b;
|
||||||
a = ( double ) ( X - _x );
|
a = ( double ) ( X - _x );
|
||||||
|
@ -125,7 +125,7 @@ bool LPoint::ShorterThan( const B_INT X, const B_INT Y, B_INT Marge )
|
||||||
// overload the assign (=) operator
|
// overload the assign (=) operator
|
||||||
// usage : a_point = another_point;
|
// usage : a_point = another_point;
|
||||||
|
|
||||||
LPoint &LPoint::operator=( const LPoint &other_point )
|
kbLPoint &kbLPoint::operator=( const kbLPoint &other_point )
|
||||||
{
|
{
|
||||||
_x = other_point._x;
|
_x = other_point._x;
|
||||||
_y = other_point._y;
|
_y = other_point._y;
|
||||||
|
@ -136,7 +136,7 @@ LPoint &LPoint::operator=( const LPoint &other_point )
|
||||||
// overload the + operator
|
// overload the + operator
|
||||||
// usage : a_point = point1 + point2;
|
// usage : a_point = point1 + point2;
|
||||||
|
|
||||||
LPoint &LPoint::operator+( const LPoint &other_point )
|
kbLPoint &kbLPoint::operator+( const kbLPoint &other_point )
|
||||||
{
|
{
|
||||||
_x += other_point._x;
|
_x += other_point._x;
|
||||||
_y += other_point._y;
|
_y += other_point._y;
|
||||||
|
@ -148,7 +148,7 @@ LPoint &LPoint::operator+( const LPoint &other_point )
|
||||||
// overload the - operator
|
// overload the - operator
|
||||||
// usage : a_point = point1 - point2;
|
// usage : a_point = point1 - point2;
|
||||||
|
|
||||||
LPoint &LPoint::operator-( const LPoint &other_point )
|
kbLPoint &kbLPoint::operator-( const kbLPoint &other_point )
|
||||||
{
|
{
|
||||||
_x -= other_point._x;
|
_x -= other_point._x;
|
||||||
_y -= other_point._y;
|
_y -= other_point._y;
|
||||||
|
@ -159,7 +159,7 @@ LPoint &LPoint::operator-( const LPoint &other_point )
|
||||||
// overload the * operator
|
// overload the * operator
|
||||||
// usage: a_point = point1 * 100;
|
// usage: a_point = point1 * 100;
|
||||||
|
|
||||||
LPoint &LPoint::operator*( int factor )
|
kbLPoint &kbLPoint::operator*( int factor )
|
||||||
{
|
{
|
||||||
_x *= factor;
|
_x *= factor;
|
||||||
_y *= factor;
|
_y *= factor;
|
||||||
|
@ -170,7 +170,7 @@ LPoint &LPoint::operator*( int factor )
|
||||||
// overload the / operator
|
// overload the / operator
|
||||||
// usage: a_point = point1 / 100;
|
// usage: a_point = point1 / 100;
|
||||||
|
|
||||||
LPoint &LPoint::operator/( int factor )
|
kbLPoint &kbLPoint::operator/( int factor )
|
||||||
{
|
{
|
||||||
_x /= factor;
|
_x /= factor;
|
||||||
_y /= factor;
|
_y /= factor;
|
||||||
|
@ -181,7 +181,7 @@ LPoint &LPoint::operator/( int factor )
|
||||||
// overload the compare (==) operator
|
// overload the compare (==) operator
|
||||||
// usage: if (point1 == point2) { };
|
// usage: if (point1 == point2) { };
|
||||||
|
|
||||||
int LPoint::operator==( const LPoint &other_point ) const
|
int kbLPoint::operator==( const kbLPoint &other_point ) const
|
||||||
{
|
{
|
||||||
return ( ( other_point._x == _x ) && ( other_point._y == _y ) );
|
return ( ( other_point._x == _x ) && ( other_point._y == _y ) );
|
||||||
}
|
}
|
||||||
|
@ -190,7 +190,7 @@ int LPoint::operator==( const LPoint &other_point ) const
|
||||||
// overload the diffrent (!=) operator
|
// overload the diffrent (!=) operator
|
||||||
// usage: if (point1 != point2) { };
|
// usage: if (point1 != point2) { };
|
||||||
|
|
||||||
int LPoint::operator!=( const LPoint &other_point ) const
|
int kbLPoint::operator!=( const kbLPoint &other_point ) const
|
||||||
{
|
{
|
||||||
return ( ( other_point._x != _x ) || ( other_point._y != _y ) );
|
return ( ( other_point._x != _x ) || ( other_point._y != _y ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: node.cpp,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: node.cpp,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kbool/node.h"
|
#include "kbool/node.h"
|
||||||
|
@ -16,31 +16,31 @@
|
||||||
|
|
||||||
//this here is to initialize the static iterator of node
|
//this here is to initialize the static iterator of node
|
||||||
//with NOLIST constructor
|
//with NOLIST constructor
|
||||||
//TDLI<KBoolLink> Node::_linkiter=TDLI<KBoolLink>(_GC);
|
//TDLI<kbLink> kbNode::_linkiter=TDLI<kbLink>(_GC);
|
||||||
|
|
||||||
Node::Node( Bool_Engine* GC ) : LPoint( 0, 0 )
|
kbNode::kbNode( Bool_Engine* GC ) : kbLPoint( 0, 0 )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
_linklist = new DL_List<void*>();
|
_linklist = new DL_List<void*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Node::Node( B_INT const X, B_INT const Y, Bool_Engine* GC ) : LPoint( X, Y )
|
kbNode::kbNode( B_INT const X, B_INT const Y, Bool_Engine* GC ) : kbLPoint( X, Y )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
_linklist = new DL_List<void*>();
|
_linklist = new DL_List<void*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Node::Node( LPoint* const a_point, Bool_Engine* GC ) : LPoint( a_point )
|
kbNode::kbNode( kbLPoint* const a_point, Bool_Engine* GC ) : kbLPoint( a_point )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
_linklist = new DL_List<void*>();
|
_linklist = new DL_List<void*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Node::Node(Node * const other) : LPoint(other)
|
//kbNode::kbNode(kbNode * const other) : kbLPoint(other)
|
||||||
Node::Node( Node * const other, Bool_Engine* GC )
|
kbNode::kbNode( kbNode * const other, Bool_Engine* GC )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
_x = other->_x;
|
_x = other->_x;
|
||||||
|
@ -48,7 +48,7 @@ Node::Node( Node * const other, Bool_Engine* GC )
|
||||||
_linklist = new DL_List<void*>();
|
_linklist = new DL_List<void*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Node& Node::operator=( const Node &other_node )
|
kbNode& kbNode::operator=( const kbNode &other_node )
|
||||||
{
|
{
|
||||||
_x = other_node._x;
|
_x = other_node._x;
|
||||||
_y = other_node._y;
|
_y = other_node._y;
|
||||||
|
@ -59,64 +59,64 @@ Node& Node::operator=( const Node &other_node )
|
||||||
|
|
||||||
// x and y of the point will be rounded to the nearest
|
// x and y of the point will be rounded to the nearest
|
||||||
// xnew=N*grid and ynew=N*grid
|
// xnew=N*grid and ynew=N*grid
|
||||||
void Node::RoundInt( B_INT grid )
|
void kbNode::RoundInt( B_INT grid )
|
||||||
{
|
{
|
||||||
_x = ( B_INT ) floor( ( _x + grid * 0.5 ) / grid ) * grid;
|
_x = ( B_INT ) floor( ( _x + grid * 0.5 ) / grid ) * grid;
|
||||||
_y = ( B_INT ) floor( ( _y + grid * 0.5 ) / grid ) * grid;
|
_y = ( B_INT ) floor( ( _y + grid * 0.5 ) / grid ) * grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node::~Node()
|
kbNode::~kbNode()
|
||||||
{
|
{
|
||||||
delete _linklist;
|
delete _linklist;
|
||||||
}
|
}
|
||||||
|
|
||||||
DL_List<void*>* Node::GetLinklist()
|
DL_List<void*>* kbNode::GetLinklist()
|
||||||
{
|
{
|
||||||
return _linklist;
|
return _linklist;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::AddLink( KBoolLink *a_link )
|
void kbNode::AddLink( kbLink *a_link )
|
||||||
{
|
{
|
||||||
// assert(a_link);
|
// assert(a_link);
|
||||||
_linklist->insbegin( a_link );
|
_linklist->insbegin( a_link );
|
||||||
}
|
}
|
||||||
|
|
||||||
KBoolLink* Node::GetIncomingLink()
|
kbLink* kbNode::GetIncomingLink()
|
||||||
{
|
{
|
||||||
if ( ( ( KBoolLink* )_linklist->headitem() )->GetEndNode() == this )
|
if ( ( ( kbLink* )_linklist->headitem() )->GetEndNode() == this )
|
||||||
return ( KBoolLink* )_linklist->headitem();
|
return ( kbLink* )_linklist->headitem();
|
||||||
else
|
else
|
||||||
return ( KBoolLink* )_linklist->tailitem();
|
return ( kbLink* )_linklist->tailitem();
|
||||||
}
|
}
|
||||||
|
|
||||||
KBoolLink* Node::GetOutgoingLink()
|
kbLink* kbNode::GetOutgoingLink()
|
||||||
{
|
{
|
||||||
if ( ( ( KBoolLink* )_linklist->headitem() )->GetBeginNode() == this )
|
if ( ( ( kbLink* )_linklist->headitem() )->GetBeginNode() == this )
|
||||||
return ( KBoolLink* )_linklist->headitem();
|
return ( kbLink* )_linklist->headitem();
|
||||||
else
|
else
|
||||||
return ( KBoolLink* )_linklist->tailitem();
|
return ( kbLink* )_linklist->tailitem();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Returns the number of connected links
|
// Returns the number of connected links
|
||||||
//
|
//
|
||||||
int Node::GetNumberOfLinks()
|
int kbNode::GetNumberOfLinks()
|
||||||
{
|
{
|
||||||
return _linklist->count();
|
return _linklist->count();
|
||||||
}
|
}
|
||||||
|
|
||||||
KBoolLink* Node::GetOtherLink( KBoolLink* prev )
|
kbLink* kbNode::GetOtherLink( kbLink* prev )
|
||||||
{
|
{
|
||||||
if ( prev == ( KBoolLink* )_linklist->headitem() )
|
if ( prev == ( kbLink* )_linklist->headitem() )
|
||||||
return ( KBoolLink* )_linklist->tailitem();
|
return ( kbLink* )_linklist->tailitem();
|
||||||
if ( prev == ( KBoolLink* )_linklist->tailitem() )
|
if ( prev == ( kbLink* )_linklist->tailitem() )
|
||||||
return ( KBoolLink* )_linklist->headitem();
|
return ( kbLink* )_linklist->headitem();
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int Node::Merge( Node *other )
|
int kbNode::Merge( kbNode *other )
|
||||||
{
|
{
|
||||||
if ( this == other ) //they are already merged dummy
|
if ( this == other ) //they are already merged dummy
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -127,8 +127,8 @@ int Node::Merge( Node *other )
|
||||||
// otherwise there can't be a takeover, because for takeover there can't
|
// otherwise there can't be a takeover, because for takeover there can't
|
||||||
// be an iterator on other->_linklist;
|
// be an iterator on other->_linklist;
|
||||||
{
|
{
|
||||||
TDLI<KBoolLink> Iother( other->_linklist );
|
TDLI<kbLink> Iother( other->_linklist );
|
||||||
KBoolLink* temp;
|
kbLink* temp;
|
||||||
|
|
||||||
Counter = Iother.count();
|
Counter = Iother.count();
|
||||||
|
|
||||||
|
@ -153,7 +153,7 @@ int Node::Merge( Node *other )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Node::RemoveLink( KBoolLink *a_link )
|
void kbNode::RemoveLink( kbLink *a_link )
|
||||||
{
|
{
|
||||||
// assert(a_link);
|
// assert(a_link);
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
|
@ -172,7 +172,7 @@ void Node::RemoveLink( KBoolLink *a_link )
|
||||||
// output: -
|
// output: -
|
||||||
// return: true if points can be simplified
|
// return: true if points can be simplified
|
||||||
// false if points can't be simplified
|
// false if points can't be simplified
|
||||||
bool Node::Simplify( Node *First, Node *Second, B_INT Marge )
|
bool kbNode::Simplify( kbNode *First, kbNode *Second, B_INT Marge )
|
||||||
{
|
{
|
||||||
double distance = 0;
|
double distance = 0;
|
||||||
|
|
||||||
|
@ -189,9 +189,9 @@ bool Node::Simplify( Node *First, Node *Second, B_INT Marge )
|
||||||
// Used tmp_link.set here, because the link may not be linked in the graph,
|
// Used tmp_link.set here, because the link may not be linked in the graph,
|
||||||
// because the point of the graphs are used, after use of the line we have
|
// because the point of the graphs are used, after use of the line we have
|
||||||
//to set the link to zero so the nodes will not be destructed by exit of the function
|
//to set the link to zero so the nodes will not be destructed by exit of the function
|
||||||
KBoolLink tmp_link( _GC );
|
kbLink tmp_link( _GC );
|
||||||
tmp_link.Set( First, Second );
|
tmp_link.Set( First, Second );
|
||||||
KBoolLine tmp_line( _GC );
|
kbLine tmp_line( _GC );
|
||||||
tmp_line.Set( &tmp_link );
|
tmp_line.Set( &tmp_link );
|
||||||
|
|
||||||
// If third point is on the same line which is made from the first
|
// If third point is on the same line which is made from the first
|
||||||
|
@ -215,7 +215,7 @@ bool Node::Simplify( Node *First, Node *Second, B_INT Marge )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
KBoolLink* Node::GetNextLink()
|
kbLink* kbNode::GetNextLink()
|
||||||
{
|
{
|
||||||
int Aantal = _linklist->count();
|
int Aantal = _linklist->count();
|
||||||
|
|
||||||
|
@ -225,7 +225,7 @@ KBoolLink* Node::GetNextLink()
|
||||||
if ( Aantal == 1 )
|
if ( Aantal == 1 )
|
||||||
return NULL;
|
return NULL;
|
||||||
int Marked_Counter = 0;
|
int Marked_Counter = 0;
|
||||||
KBoolLink *the_link = NULL;
|
kbLink *the_link = NULL;
|
||||||
|
|
||||||
// count the marked links
|
// count the marked links
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
|
@ -255,7 +255,7 @@ KBoolLink* Node::GetNextLink()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
KBoolLink* Node::GetPrevLink()
|
kbLink* kbNode::GetPrevLink()
|
||||||
{
|
{
|
||||||
int Aantal;
|
int Aantal;
|
||||||
if ( !_linklist )
|
if ( !_linklist )
|
||||||
|
@ -270,7 +270,7 @@ KBoolLink* Node::GetPrevLink()
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
int Marked_Counter = 0;
|
int Marked_Counter = 0;
|
||||||
KBoolLink *the_link = NULL;
|
kbLink *the_link = NULL;
|
||||||
|
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
// count the marked links
|
// count the marked links
|
||||||
|
@ -299,7 +299,7 @@ KBoolLink* Node::GetPrevLink()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Node::SameSides( KBoolLink* const prev , KBoolLink* const link, BOOL_OP operation )
|
bool kbNode::SameSides( kbLink* const prev , kbLink* const link, BOOL_OP operation )
|
||||||
{
|
{
|
||||||
bool directedLeft;
|
bool directedLeft;
|
||||||
bool directedRight;
|
bool directedRight;
|
||||||
|
@ -331,16 +331,16 @@ bool Node::SameSides( KBoolLink* const prev , KBoolLink* const link, BOOL_OP ope
|
||||||
// on the node get the link
|
// on the node get the link
|
||||||
// is the most right or left one
|
// is the most right or left one
|
||||||
// This function is used to collect the simple graphs from a graph
|
// This function is used to collect the simple graphs from a graph
|
||||||
KBoolLink* Node::GetMost( KBoolLink* const prev , LinkStatus whatside, BOOL_OP operation )
|
kbLink* kbNode::GetMost( kbLink* const prev , LinkStatus whatside, BOOL_OP operation )
|
||||||
{
|
{
|
||||||
KBoolLink * reserve = 0;
|
kbLink * reserve = 0;
|
||||||
KBoolLink *Result = NULL, *link;
|
kbLink *Result = NULL, *link;
|
||||||
Node* prevbegin = prev->GetOther( this );
|
kbNode* prevbegin = prev->GetOther( this );
|
||||||
|
|
||||||
if ( _linklist->count() == 2 ) // only two links to this node take the one != prev
|
if ( _linklist->count() == 2 ) // only two links to this node take the one != prev
|
||||||
{
|
{
|
||||||
if ( ( link = ( KBoolLink* )_linklist->headitem() ) == prev ) //this is NOT the one to go on
|
if ( ( link = ( kbLink* )_linklist->headitem() ) == prev ) //this is NOT the one to go on
|
||||||
link = ( KBoolLink* )_linklist->tailitem();
|
link = ( kbLink* )_linklist->tailitem();
|
||||||
if ( !link->BeenHere() && SameSides( prev, link, operation ) )
|
if ( !link->BeenHere() && SameSides( prev, link, operation ) )
|
||||||
//we are back where we started (bin is true) return Null
|
//we are back where we started (bin is true) return Null
|
||||||
return link;
|
return link;
|
||||||
|
@ -349,7 +349,7 @@ KBoolLink* Node::GetMost( KBoolLink* const prev , LinkStatus whatside, BOOL_OP o
|
||||||
|
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
_GC->_linkiter->tohead();
|
_GC->_linkiter->tohead();
|
||||||
//more then 2 links to the Node
|
//more then 2 links to the kbNode
|
||||||
while( !_GC->_linkiter->hitroot() )
|
while( !_GC->_linkiter->hitroot() )
|
||||||
{
|
{
|
||||||
link = _GC->_linkiter->item();
|
link = _GC->_linkiter->item();
|
||||||
|
@ -387,16 +387,16 @@ KBoolLink* Node::GetMost( KBoolLink* const prev , LinkStatus whatside, BOOL_OP o
|
||||||
// on the node get the link
|
// on the node get the link
|
||||||
// is the most right or left one
|
// is the most right or left one
|
||||||
// This function is used to collect the simple graphs from a graph
|
// This function is used to collect the simple graphs from a graph
|
||||||
KBoolLink* Node::GetMostHole( KBoolLink* const prev, LinkStatus whatside, BOOL_OP operation )
|
kbLink* kbNode::GetMostHole( kbLink* const prev, LinkStatus whatside, BOOL_OP operation )
|
||||||
{
|
{
|
||||||
KBoolLink * reserve = 0;
|
kbLink * reserve = 0;
|
||||||
KBoolLink *Result = NULL, *link;
|
kbLink *Result = NULL, *link;
|
||||||
Node* prevbegin = prev->GetOther( this );
|
kbNode* prevbegin = prev->GetOther( this );
|
||||||
|
|
||||||
if ( _linklist->count() == 2 ) // only two links to this node take the one != prev
|
if ( _linklist->count() == 2 ) // only two links to this node take the one != prev
|
||||||
{
|
{
|
||||||
if ( ( link = ( KBoolLink* )_linklist->headitem() ) == prev ) //this is NOT the one to go on
|
if ( ( link = ( kbLink* )_linklist->headitem() ) == prev ) //this is NOT the one to go on
|
||||||
link = ( KBoolLink* )_linklist->tailitem();
|
link = ( kbLink* )_linklist->tailitem();
|
||||||
if ( link->GetHole() && !link->GetHoleLink() && !link->BeenHere() && SameSides( prev, link, operation ) )
|
if ( link->GetHole() && !link->GetHoleLink() && !link->BeenHere() && SameSides( prev, link, operation ) )
|
||||||
//we are back where we started (bin is true) return Null
|
//we are back where we started (bin is true) return Null
|
||||||
return link;
|
return link;
|
||||||
|
@ -405,7 +405,7 @@ KBoolLink* Node::GetMostHole( KBoolLink* const prev, LinkStatus whatside, BOOL_O
|
||||||
|
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
_GC->_linkiter->tohead();
|
_GC->_linkiter->tohead();
|
||||||
//more then 2 links to the Node
|
//more then 2 links to the kbNode
|
||||||
while( !_GC->_linkiter->hitroot() )
|
while( !_GC->_linkiter->hitroot() )
|
||||||
{
|
{
|
||||||
link = _GC->_linkiter->item();
|
link = _GC->_linkiter->item();
|
||||||
|
@ -443,9 +443,9 @@ KBoolLink* Node::GetMostHole( KBoolLink* const prev, LinkStatus whatside, BOOL_O
|
||||||
}
|
}
|
||||||
|
|
||||||
// this function gets the highest not flat link
|
// this function gets the highest not flat link
|
||||||
KBoolLink* Node::GetHoleLink( KBoolLink* const prev, bool checkbin, BOOL_OP operation )
|
kbLink* kbNode::GetHoleLink( kbLink* const prev, bool checkbin, BOOL_OP operation )
|
||||||
{
|
{
|
||||||
KBoolLink * Result = NULL, *link;
|
kbLink * Result = NULL, *link;
|
||||||
|
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
|
|
||||||
|
@ -467,9 +467,9 @@ KBoolLink* Node::GetHoleLink( KBoolLink* const prev, bool checkbin, BOOL_OP oper
|
||||||
}
|
}
|
||||||
|
|
||||||
// this function gets the highest not flat link
|
// this function gets the highest not flat link
|
||||||
KBoolLink* Node::GetNotFlat()
|
kbLink* kbNode::GetNotFlat()
|
||||||
{
|
{
|
||||||
KBoolLink * Result = NULL, *link;
|
kbLink * Result = NULL, *link;
|
||||||
|
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
|
|
||||||
|
@ -519,9 +519,9 @@ KBoolLink* Node::GetNotFlat()
|
||||||
|
|
||||||
// on the node get the link that is not BIN
|
// on the node get the link that is not BIN
|
||||||
// and that has the same graphnumber and is in same direction
|
// and that has the same graphnumber and is in same direction
|
||||||
KBoolLink *Node::Follow( KBoolLink* const prev )
|
kbLink *kbNode::Follow( kbLink* const prev )
|
||||||
{
|
{
|
||||||
KBoolLink * temp;
|
kbLink * temp;
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
|
|
||||||
_GC->_linkiter->tohead();
|
_GC->_linkiter->tohead();
|
||||||
|
@ -555,9 +555,9 @@ KBoolLink *Node::Follow( KBoolLink* const prev )
|
||||||
// this function gets the highest (other node) link ascending from the node
|
// this function gets the highest (other node) link ascending from the node
|
||||||
// that has the bin flag set as the argument binset
|
// that has the bin flag set as the argument binset
|
||||||
// if no such link exists return 0
|
// if no such link exists return 0
|
||||||
KBoolLink* Node::GetBinHighest( bool binset )
|
kbLink* kbNode::GetBinHighest( bool binset )
|
||||||
{
|
{
|
||||||
KBoolLink * Result = NULL, *link;
|
kbLink * Result = NULL, *link;
|
||||||
_GC->_linkiter->Attach( _linklist );
|
_GC->_linkiter->Attach( _linklist );
|
||||||
|
|
||||||
double tangold = 0.0;
|
double tangold = 0.0;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: record.cpp,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: record.cpp,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kbool/booleng.h"
|
#include "kbool/booleng.h"
|
||||||
|
@ -28,11 +28,11 @@
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
Record::~Record()
|
kbRecord::~kbRecord()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
//void* Record::operator new(size_t size)
|
//void* kbRecord::operator new(size_t size)
|
||||||
//{
|
//{
|
||||||
//
|
//
|
||||||
// if (r_index!=-1)
|
// if (r_index!=-1)
|
||||||
|
@ -43,7 +43,7 @@ Record::~Record()
|
||||||
// return malloc(size);
|
// return malloc(size);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//void Record::operator delete(void* recordptr)
|
//void kbRecord::operator delete(void* recordptr)
|
||||||
//{
|
//{
|
||||||
//
|
//
|
||||||
// if (r_index < 28)
|
// if (r_index < 28)
|
||||||
|
@ -55,7 +55,7 @@ Record::~Record()
|
||||||
// free (recordptr);
|
// free (recordptr);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//void Record::deletepool()
|
//void kbRecord::deletepool()
|
||||||
//{
|
//{
|
||||||
//
|
//
|
||||||
// while (r_index!=-1)
|
// while (r_index!=-1)
|
||||||
|
@ -64,7 +64,7 @@ Record::~Record()
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
Record::Record( KBoolLink* link, Bool_Engine* GC )
|
kbRecord::kbRecord( kbLink* link, Bool_Engine* GC )
|
||||||
: _line( GC )
|
: _line( GC )
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
|
@ -77,14 +77,14 @@ Record::Record( KBoolLink* link, Bool_Engine* GC )
|
||||||
|
|
||||||
|
|
||||||
//when the dimensions of a link for a record changes, its line parameters need to be recalculated
|
//when the dimensions of a link for a record changes, its line parameters need to be recalculated
|
||||||
void Record::SetNewLink( KBoolLink* link )
|
void kbRecord::SetNewLink( kbLink* link )
|
||||||
{
|
{
|
||||||
_line.Set( link );
|
_line.Set( link );
|
||||||
_line.CalculateLineParameters();
|
_line.CalculateLineParameters();
|
||||||
}
|
}
|
||||||
|
|
||||||
//for beams calculate the ysp on the low scanline
|
//for beams calculate the ysp on the low scanline
|
||||||
void Record::Calc_Ysp( Node* low )
|
void kbRecord::Calc_Ysp( kbNode* low )
|
||||||
{
|
{
|
||||||
if ( ( LNK->GetEndNode() == low ) || ( LNK->GetBeginNode() == low ) )
|
if ( ( LNK->GetEndNode() == low ) || ( LNK->GetBeginNode() == low ) )
|
||||||
{
|
{
|
||||||
|
@ -103,7 +103,7 @@ void Record::Calc_Ysp( Node* low )
|
||||||
}
|
}
|
||||||
|
|
||||||
//to set the _dir for new links in the beam
|
//to set the _dir for new links in the beam
|
||||||
void Record::Set_Flags()
|
void kbRecord::Set_Flags()
|
||||||
{
|
{
|
||||||
if ( LNK->GetEndNode()->GetX() == LNK->GetBeginNode()->GetX() ) //flatlink ?
|
if ( LNK->GetEndNode()->GetX() == LNK->GetBeginNode()->GetX() ) //flatlink ?
|
||||||
{ //only happens in flat beams
|
{ //only happens in flat beams
|
||||||
|
@ -121,27 +121,27 @@ void Record::Set_Flags()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KBoolLink* Record::GetLink()
|
kbLink* kbRecord::GetLink()
|
||||||
{
|
{
|
||||||
return LNK;
|
return LNK;
|
||||||
}
|
}
|
||||||
|
|
||||||
B_INT Record::Ysp()
|
B_INT kbRecord::Ysp()
|
||||||
{
|
{
|
||||||
return _ysp;
|
return _ysp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Record::SetYsp( B_INT ysp )
|
void kbRecord::SetYsp( B_INT ysp )
|
||||||
{
|
{
|
||||||
_ysp = ysp;
|
_ysp = ysp;
|
||||||
}
|
}
|
||||||
|
|
||||||
DIRECTION Record::Direction()
|
DIRECTION kbRecord::Direction()
|
||||||
{
|
{
|
||||||
return DIRECTION( _dir );
|
return DIRECTION( _dir );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Record::Calc_Left_Right( Record* record_above_me )
|
bool kbRecord::Calc_Left_Right( kbRecord* record_above_me )
|
||||||
{
|
{
|
||||||
bool par = false;
|
bool par = false;
|
||||||
|
|
||||||
|
@ -337,14 +337,14 @@ bool Record::Calc_Left_Right( Record* record_above_me )
|
||||||
return par;
|
return par;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Record::Equal( Record *a )
|
bool kbRecord::Equal( kbRecord *a )
|
||||||
{
|
{
|
||||||
return( ( bool )( ( LNK->GetOther( a->LNK->GetBeginNode() ) == a->LNK->GetEndNode() ) &&
|
return( ( bool )( ( LNK->GetOther( a->LNK->GetBeginNode() ) == a->LNK->GetEndNode() ) &&
|
||||||
( LNK->GetOther( a->LNK->GetEndNode() ) == a->LNK->GetBeginNode() ) ) );
|
( LNK->GetOther( a->LNK->GetEndNode() ) == a->LNK->GetBeginNode() ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
KBoolLine* Record::GetLine()
|
kbLine* kbRecord::GetLine()
|
||||||
{
|
{
|
||||||
return & _line;
|
return & _line;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
Licence: see kboollicense.txt
|
Licence: see kboollicense.txt
|
||||||
|
|
||||||
RCS-ID: $Id: scanbeam.cpp,v 1.3 2008/06/04 21:23:22 titato Exp $
|
RCS-ID: $Id: scanbeam.cpp,v 1.4 2009/09/07 19:23:28 titato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// class scanbeam
|
// class scanbeam
|
||||||
|
@ -22,12 +22,12 @@
|
||||||
//this here is to initialize the static iterator of scanbeam
|
//this here is to initialize the static iterator of scanbeam
|
||||||
//with NOLIST constructor
|
//with NOLIST constructor
|
||||||
|
|
||||||
int recordsorter( Record* , Record* );
|
int recordsorter( kbRecord* , kbRecord* );
|
||||||
|
|
||||||
int recordsorter_ysp_angle( Record* , Record* );
|
int recordsorter_ysp_angle( kbRecord* , kbRecord* );
|
||||||
int recordsorter_ysp_angle_back( Record* rec1, Record* rec2 );
|
int recordsorter_ysp_angle_back( kbRecord* rec1, kbRecord* rec2 );
|
||||||
|
|
||||||
ScanBeam::ScanBeam( Bool_Engine* GC ): DL_List<Record*>()
|
ScanBeam::ScanBeam( Bool_Engine* GC ): DL_List<kbRecord*>()
|
||||||
{
|
{
|
||||||
_GC = GC;
|
_GC = GC;
|
||||||
_type = NORMAL;
|
_type = NORMAL;
|
||||||
|
@ -43,7 +43,7 @@ ScanBeam::~ScanBeam()
|
||||||
//DeleteRecordPool();
|
//DeleteRecordPool();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScanBeam::SetType( Node* low, Node* high )
|
void ScanBeam::SetType( kbNode* low, kbNode* high )
|
||||||
{
|
{
|
||||||
if ( low->GetX() < high->GetX() )
|
if ( low->GetX() < high->GetX() )
|
||||||
_type = NORMAL;
|
_type = NORMAL;
|
||||||
|
@ -54,12 +54,12 @@ void ScanBeam::SetType( Node* low, Node* high )
|
||||||
/*
|
/*
|
||||||
//catch node to link crossings
|
//catch node to link crossings
|
||||||
// must be sorted on ysp
|
// must be sorted on ysp
|
||||||
int ScanBeam::FindCloseLinksAndCross(TDLI<KBoolLink>* _I,Node* _lowf)
|
int ScanBeam::FindCloseLinksAndCross(TDLI<kbLink>* _I,kbNode* _lowf)
|
||||||
{
|
{
|
||||||
int merges = 0;
|
int merges = 0;
|
||||||
Record* record;
|
kbRecord* record;
|
||||||
|
|
||||||
TDLI<Record> _BBI=TDLI<Record>(this);
|
TDLI<kbRecord> _BBI=TDLI<kbRecord>(this);
|
||||||
|
|
||||||
if (_BI.count() > 1)
|
if (_BI.count() > 1)
|
||||||
{
|
{
|
||||||
|
@ -131,16 +131,16 @@ int ScanBeam::FindCloseLinksAndCross(TDLI<KBoolLink>* _I,Node* _lowf)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
bool ScanBeam::Update(TDLI<KBoolLink>* _I,Node* _lowf)
|
bool ScanBeam::Update(TDLI<kbLink>* _I,kbNode* _lowf)
|
||||||
{
|
{
|
||||||
bool found=false;
|
bool found=false;
|
||||||
KBoolLink* link;
|
kbLink* link;
|
||||||
|
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
|
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
record->Calc_Ysp(_type,_low);
|
record->Calc_Ysp(_type,_low);
|
||||||
_BI++;
|
_BI++;
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ bool ScanBeam::Update(TDLI<KBoolLink>* _I,Node* _lowf)
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be marked for removal
|
//are links to be marked for removal
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ bool ScanBeam::Update(TDLI<KBoolLink>* _I,Node* _lowf)
|
||||||
_BI--;
|
_BI--;
|
||||||
if (!_BI.hitroot() && (_BI.count() > 1))
|
if (!_BI.hitroot() && (_BI.count() > 1))
|
||||||
{
|
{
|
||||||
Record* prev=_BI.item();
|
kbRecord* prev=_BI.item();
|
||||||
_BI++;
|
_BI++;
|
||||||
if (!_BI.hitroot())
|
if (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
|
@ -195,7 +195,7 @@ bool ScanBeam::Update(TDLI<KBoolLink>* _I,Node* _lowf)
|
||||||
//so for following beams it will not be checked again
|
//so for following beams it will not be checked again
|
||||||
while ( bool(link=_lowf->GetBinHighest(false)) )
|
while ( bool(link=_lowf->GetBinHighest(false)) )
|
||||||
{
|
{
|
||||||
Record* record=new Record(link);
|
kbRecord* record=new kbRecord(link);
|
||||||
// yp_new will always be the y of low node since all new links are
|
// yp_new will always be the y of low node since all new links are
|
||||||
// from this node
|
// from this node
|
||||||
record->SetYsp(_lowf->GetY());
|
record->SetYsp(_lowf->GetY());
|
||||||
|
@ -222,7 +222,7 @@ bool ScanBeam::Update(TDLI<KBoolLink>* _I,Node* _lowf)
|
||||||
_BI--;_BI--; //just before the new record inserted
|
_BI--;_BI--; //just before the new record inserted
|
||||||
if (!_BI.hitroot())
|
if (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* prev=_BI.item();
|
kbRecord* prev=_BI.item();
|
||||||
_BI++; //goto the new record inserted
|
_BI++; //goto the new record inserted
|
||||||
if (!_BI.item()->Equal(prev)) // records NOT parallel
|
if (!_BI.item()->Equal(prev)) // records NOT parallel
|
||||||
{
|
{
|
||||||
|
@ -238,11 +238,11 @@ bool ScanBeam::Update(TDLI<KBoolLink>* _I,Node* _lowf)
|
||||||
else
|
else
|
||||||
_BI++;
|
_BI++;
|
||||||
|
|
||||||
Record* prev=_BI.item(); //the new record
|
kbRecord* prev=_BI.item(); //the new record
|
||||||
_BI++;
|
_BI++;
|
||||||
if (!_BI.hitroot() && !_BI.item()->Equal(prev)) // records NOT parallel
|
if (!_BI.hitroot() && !_BI.item()->Equal(prev)) // records NOT parallel
|
||||||
{
|
{
|
||||||
Record* cur=_BI.item();
|
kbRecord* cur=_BI.item();
|
||||||
if (cur->GetLine()->Intersect(prev->GetLine(),MARGE))
|
if (cur->GetLine()->Intersect(prev->GetLine(),MARGE))
|
||||||
{
|
{
|
||||||
//this may modify the links already part of the record
|
//this may modify the links already part of the record
|
||||||
|
@ -264,13 +264,13 @@ bool ScanBeam::Update(TDLI<KBoolLink>* _I,Node* _lowf)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool ScanBeam::FindNew( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
bool ScanBeam::FindNew( SCANTYPE scantype, TDLI<kbLink>* _I, bool& holes )
|
||||||
{
|
{
|
||||||
bool foundnew = false;
|
bool foundnew = false;
|
||||||
|
|
||||||
_low = _I->item()->GetBeginNode();
|
_low = _I->item()->GetBeginNode();
|
||||||
|
|
||||||
KBoolLink* link;
|
kbLink* link;
|
||||||
|
|
||||||
//if (!checksort())
|
//if (!checksort())
|
||||||
// SortTheBeam();
|
// SortTheBeam();
|
||||||
|
@ -291,7 +291,7 @@ bool ScanBeam::FindNew( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
{
|
{
|
||||||
//all vertical links in flatbeam are ignored
|
//all vertical links in flatbeam are ignored
|
||||||
//normal link in beam
|
//normal link in beam
|
||||||
Record * record = new Record( link, _GC );
|
kbRecord * record = new kbRecord( link, _GC );
|
||||||
// yp_new will always be the y of low node since all new links are
|
// yp_new will always be the y of low node since all new links are
|
||||||
// from this node
|
// from this node
|
||||||
record->SetYsp( _low->GetY() );
|
record->SetYsp( _low->GetY() );
|
||||||
|
@ -309,7 +309,7 @@ bool ScanBeam::FindNew( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
case LINKLINK:
|
case LINKLINK:
|
||||||
//is the new record a flat link
|
//is the new record a flat link
|
||||||
{
|
{
|
||||||
KBoolLine flatline = KBoolLine( link, _GC );
|
kbLine flatline = kbLine( link, _GC );
|
||||||
foundnew = Process_LinkToLink_Flat( &flatline ) || foundnew;
|
foundnew = Process_LinkToLink_Flat( &flatline ) || foundnew;
|
||||||
//flatlinks are not part of the beams, still they are used to find new beams
|
//flatlinks are not part of the beams, still they are used to find new beams
|
||||||
//they can be processed now if the beginnode does not change, since this is used to
|
//they can be processed now if the beginnode does not change, since this is used to
|
||||||
|
@ -327,7 +327,7 @@ bool ScanBeam::FindNew( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//normal link in beam
|
//normal link in beam
|
||||||
Record* record = new Record( link, _GC );
|
kbRecord* record = new kbRecord( link, _GC );
|
||||||
// yp_new will always be the y of low node since all new links are
|
// yp_new will always be the y of low node since all new links are
|
||||||
// from this node
|
// from this node
|
||||||
record->SetYsp( _low->GetY() );
|
record->SetYsp( _low->GetY() );
|
||||||
|
@ -361,7 +361,7 @@ bool ScanBeam::FindNew( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
//now we can set the a/b group flags based on the above link
|
//now we can set the a/b group flags based on the above link
|
||||||
_BI--;
|
_BI--;
|
||||||
_BI--;
|
_BI--;
|
||||||
Record* above = 0;
|
kbRecord* above = 0;
|
||||||
if ( !_BI.hitroot() )
|
if ( !_BI.hitroot() )
|
||||||
above = _BI.item();
|
above = _BI.item();
|
||||||
_BI++;
|
_BI++;
|
||||||
|
@ -396,11 +396,11 @@ bool ScanBeam::FindNew( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
return foundnew;
|
return foundnew;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<kbLink>* _I, bool& holes )
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
bool foundnew = false;
|
bool foundnew = false;
|
||||||
DL_Iter<Record*> _BBI = DL_Iter<Record*>();
|
DL_Iter<kbRecord*> _BBI = DL_Iter<kbRecord*>();
|
||||||
bool attached = false;
|
bool attached = false;
|
||||||
|
|
||||||
_low = _I->item()->GetBeginNode();
|
_low = _I->item()->GetBeginNode();
|
||||||
|
@ -416,10 +416,14 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
{
|
{
|
||||||
if ( scantype == LINKHOLES )
|
if ( scantype == LINKHOLES )
|
||||||
{
|
{
|
||||||
|
// Tophole links can be linked at the begin or end point, depending on
|
||||||
|
// which is higher in Y.
|
||||||
|
// A link pointing to the low node, and which is a tophole link,
|
||||||
|
// and which was not linked in sofar should be linked now.
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
||||||
|
@ -435,37 +439,17 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
||||||
( record->GetLink()->GetBeginNode() == _low )
|
( record->GetLink()->GetBeginNode() == _low )
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ( attached ) //there is a bug
|
|
||||||
{
|
|
||||||
_BBI.Detach();
|
|
||||||
if ( !checksort() )
|
|
||||||
SortTheBeam( true );
|
|
||||||
_BI.tohead();
|
|
||||||
attached = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
delete _BI.item();
|
delete _BI.item();
|
||||||
_BI.remove();
|
_BI.remove();
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
else if ( found ) //only once in here
|
|
||||||
{
|
|
||||||
attached = true;
|
|
||||||
found = false;
|
|
||||||
_BBI.Attach( this );
|
|
||||||
_BBI.toiter( &_BI ); //this is the position new records will be inserted
|
|
||||||
|
|
||||||
//recalculate ysp for the new scanline
|
|
||||||
record->Calc_Ysp( _low );
|
|
||||||
_BI++;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//recalculate ysp for the new scanline
|
//recalculate ysp for the new scanline
|
||||||
|
@ -474,21 +458,35 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( attached )
|
// all records are renewed in Ysp.
|
||||||
|
// found links to remove, we search the new insert position for new links.
|
||||||
|
if ( found )
|
||||||
{
|
{
|
||||||
_BI.toiter( &_BBI );
|
_BI.tohead();
|
||||||
_BBI.Detach();
|
while ( !_BI.hitroot() )
|
||||||
|
{
|
||||||
|
kbRecord * record = _BI.item();
|
||||||
|
if ( record->Ysp() < _low->GetY() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_BI++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// nothing is removed from the beam, still we moved forward with the scanline
|
||||||
|
// at the new _low, so we need to recalculate the intersections of the links
|
||||||
|
// with the new scanline.
|
||||||
|
// Also the the insert position for new links is determined, being the first
|
||||||
|
// link below _low.
|
||||||
_BBI.Attach( this );
|
_BBI.Attach( this );
|
||||||
_BBI.toroot();
|
_BBI.toroot();
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
|
|
||||||
record->Calc_Ysp( _low );
|
record->Calc_Ysp( _low );
|
||||||
if ( !found && ( record->Ysp() < _low->GetY() ) )
|
if ( !found && ( record->Ysp() < _low->GetY() ) )
|
||||||
|
@ -502,7 +500,7 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BBI.Detach();
|
_BBI.Detach();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else // _type == NORMAL
|
||||||
{ //because the previous beam was flat the links to remove are
|
{ //because the previous beam was flat the links to remove are
|
||||||
//below the last insert position
|
//below the last insert position
|
||||||
if ( _low->GetBinHighest( true ) ) //is there something to remove
|
if ( _low->GetBinHighest( true ) ) //is there something to remove
|
||||||
|
@ -513,7 +511,7 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
||||||
|
@ -531,14 +529,10 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
//if there was no record before the last deleted record this means
|
//if there was no record before the last deleted record this means
|
||||||
//we where at the beginning of the beam, so at root
|
//we where at the beginning of the beam, so at root
|
||||||
|
|
||||||
//_BI << (lastinserted+1);
|
|
||||||
//_BI--;
|
|
||||||
//if (_BI.hitroot()) //only possible when at the begin of the beam
|
|
||||||
|
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
||||||
|
@ -566,13 +560,10 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
//if there was no record before the last deleted record this means
|
//if there was no record before the last deleted record this means
|
||||||
//we where at the beginning of the beam, so at root
|
//we where at the beginning of the beam, so at root
|
||||||
|
|
||||||
//_BI << (lastinserted+ 1);
|
|
||||||
//_BI--;
|
|
||||||
//if (_BI.hitroot()) //only possible when at the begin of the beam
|
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
if ( record->Ysp() < _low->GetY() )
|
if ( record->Ysp() < _low->GetY() )
|
||||||
break;
|
break;
|
||||||
_BI++;
|
_BI++;
|
||||||
|
@ -601,14 +592,14 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
if ( ( record->GetLink()->GetEndNode() == _low ) ||
|
||||||
( record->GetLink()->GetBeginNode() == _low )
|
( record->GetLink()->GetBeginNode() == _low )
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
KBoolLine * line = record->GetLine();
|
kbLine * line = record->GetLine();
|
||||||
if ( scantype == NODELINK )
|
if ( scantype == NODELINK )
|
||||||
foundnew = Process_PointToLink_Crossings() != 0 || foundnew;
|
foundnew = Process_PointToLink_Crossings() != 0 || foundnew;
|
||||||
line->ProcessCrossings( _I );
|
line->ProcessCrossings( _I );
|
||||||
|
@ -629,7 +620,7 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
//because the beam is sorted on ysp, stop when
|
//because the beam is sorted on ysp, stop when
|
||||||
//the right insertion point for new links has been found
|
//the right insertion point for new links has been found
|
||||||
if ( ( record->Ysp() < _low->GetY() ) )
|
if ( ( record->Ysp() < _low->GetY() ) )
|
||||||
|
@ -647,11 +638,11 @@ bool ScanBeam::RemoveOld( SCANTYPE scantype, TDLI<KBoolLink>* _I, bool& holes )
|
||||||
return foundnew;
|
return foundnew;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<kbLink>* _I, bool& holes )
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
bool foundnew = false;
|
bool foundnew = false;
|
||||||
DL_Iter<Record*> _BBI=DL_Iter<Record*>();
|
DL_Iter<kbRecord*> _BBI=DL_Iter<kbRecord*>();
|
||||||
bool attached=false;
|
bool attached=false;
|
||||||
|
|
||||||
_low = _I->item()->GetBeginNode();
|
_low = _I->item()->GetBeginNode();
|
||||||
|
@ -663,7 +654,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
case LINKHOLES:
|
case LINKHOLES:
|
||||||
if (_type==NORMAL )
|
if (_type==NORMAL )
|
||||||
{
|
{
|
||||||
KBoolLink* link = _low->GetBinHighest(true);
|
kbLink* link = _low->GetBinHighest(true);
|
||||||
if ( link ) //is there something to remove
|
if ( link ) //is there something to remove
|
||||||
{
|
{
|
||||||
link->SetRecordNode( NULL );
|
link->SetRecordNode( NULL );
|
||||||
|
@ -673,7 +664,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record = _BI.item();
|
kbRecord* record = _BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ((record->GetLink()->GetEndNode() == _low) ||
|
if ((record->GetLink()->GetEndNode() == _low) ||
|
||||||
|
@ -689,7 +680,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ((record->GetLink()->GetEndNode() == _low) ||
|
if ((record->GetLink()->GetEndNode() == _low) ||
|
||||||
|
@ -721,7 +712,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
record->Calc_Ysp(_low);
|
record->Calc_Ysp(_low);
|
||||||
_BI++;
|
_BI++;
|
||||||
}
|
}
|
||||||
|
@ -730,7 +721,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
else
|
else
|
||||||
{ //because the previous beam was flat the links to remove are
|
{ //because the previous beam was flat the links to remove are
|
||||||
//below the last insert position
|
//below the last insert position
|
||||||
KBoolLink* link;
|
kbLink* link;
|
||||||
link = _low->GetBinHighest(true);
|
link = _low->GetBinHighest(true);
|
||||||
if( link )//is there something to remove
|
if( link )//is there something to remove
|
||||||
{
|
{
|
||||||
|
@ -740,7 +731,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record = _BI.item();
|
kbRecord* record = _BI.item();
|
||||||
if (record->GetLink() == link)
|
if (record->GetLink() == link)
|
||||||
linkf = true;
|
linkf = true;
|
||||||
_BI++;
|
_BI++;
|
||||||
|
@ -755,7 +746,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ((record->GetLink()->GetEndNode() == _low) ||
|
if ((record->GetLink()->GetEndNode() == _low) ||
|
||||||
|
@ -786,7 +777,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ((record->GetLink()->GetEndNode() == _low) ||
|
if ((record->GetLink()->GetEndNode() == _low) ||
|
||||||
|
@ -835,7 +826,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
if (record->Ysp() < _low->GetY())
|
if (record->Ysp() < _low->GetY())
|
||||||
break;
|
break;
|
||||||
_BI++;
|
_BI++;
|
||||||
|
@ -865,14 +856,14 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
//records containing links towards the new low node
|
//records containing links towards the new low node
|
||||||
//are links to be removed
|
//are links to be removed
|
||||||
if ((record->GetLink()->GetEndNode() == _low) ||
|
if ((record->GetLink()->GetEndNode() == _low) ||
|
||||||
(record->GetLink()->GetBeginNode() == _low)
|
(record->GetLink()->GetBeginNode() == _low)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
KBoolLine* line=record->GetLine();
|
kbLine* line=record->GetLine();
|
||||||
if (scantype==NODELINK)
|
if (scantype==NODELINK)
|
||||||
foundnew = Process_PointToLink_Crossings() !=0 || foundnew;
|
foundnew = Process_PointToLink_Crossings() !=0 || foundnew;
|
||||||
line->ProcessCrossings(_I);
|
line->ProcessCrossings(_I);
|
||||||
|
@ -893,7 +884,7 @@ bool ScanBeam::RemoveOld(SCANTYPE scantype,TDLI<KBoolLink>* _I, bool& holes )
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while (!_BI.hitroot())
|
while (!_BI.hitroot())
|
||||||
{
|
{
|
||||||
Record* record=_BI.item();
|
kbRecord* record=_BI.item();
|
||||||
//because the beam is sorted on ysp, stop when
|
//because the beam is sorted on ysp, stop when
|
||||||
//the right insertion point for new links has been found
|
//the right insertion point for new links has been found
|
||||||
if ((record->Ysp() < _low->GetY()))
|
if ((record->Ysp() < _low->GetY()))
|
||||||
|
@ -925,8 +916,8 @@ void ScanBeam::Calc_Ysp()
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while ( !_BI.hitroot() )
|
while ( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * record = _BI.item();
|
kbRecord * record = _BI.item();
|
||||||
// KBoolLink* link=_BI.item()->GetLink();
|
// kbLink* link=_BI.item()->GetLink();
|
||||||
record->Calc_Ysp( _low );
|
record->Calc_Ysp( _low );
|
||||||
_BI++;
|
_BI++;
|
||||||
}
|
}
|
||||||
|
@ -940,7 +931,7 @@ void ScanBeam::Generate_INOUT( int graphnumber )
|
||||||
DIRECTION first_dir = GO_LEFT;
|
DIRECTION first_dir = GO_LEFT;
|
||||||
int diepte = 0;
|
int diepte = 0;
|
||||||
|
|
||||||
DL_Iter<Record*> _BBI = DL_Iter<Record*>();
|
DL_Iter<kbRecord*> _BBI = DL_Iter<kbRecord*>();
|
||||||
_BBI.Attach( this );
|
_BBI.Attach( this );
|
||||||
for( _BBI.tohead(); !_BBI.hitroot(); _BBI++ )
|
for( _BBI.tohead(); !_BBI.hitroot(); _BBI++ )
|
||||||
{
|
{
|
||||||
|
@ -999,14 +990,14 @@ void ScanBeam::Generate_INOUT( int graphnumber )
|
||||||
// in a later beam will be higher than the current, if so we will wait
|
// in a later beam will be higher than the current, if so we will wait
|
||||||
// till that node comes around otherwise we will link this node to the
|
// till that node comes around otherwise we will link this node to the
|
||||||
// closest link (prev in beam)
|
// closest link (prev in beam)
|
||||||
bool ScanBeam::ProcessHoles( bool atinsert, TDLI<KBoolLink>* _LI )
|
bool ScanBeam::ProcessHoles( bool atinsert, TDLI<kbLink>* _LI )
|
||||||
{
|
{
|
||||||
// The scanbeam must already be sorted at this moment
|
// The scanbeam must already be sorted at this moment
|
||||||
Node * topnode;
|
kbNode * topnode;
|
||||||
bool foundholes = false;
|
bool foundholes = false;
|
||||||
|
|
||||||
Record* record = _BI.item();
|
kbRecord* record = _BI.item();
|
||||||
KBoolLink* link = record->GetLink();
|
kbLink* link = record->GetLink();
|
||||||
|
|
||||||
if ( !record->GetLine()->CrossListEmpty() )
|
if ( !record->GetLine()->CrossListEmpty() )
|
||||||
{
|
{
|
||||||
|
@ -1018,14 +1009,14 @@ bool ScanBeam::ProcessHoles( bool atinsert, TDLI<KBoolLink>* _LI )
|
||||||
// make new nodes and links and set them, re-use the old link, so the links
|
// make new nodes and links and set them, re-use the old link, so the links
|
||||||
// that still stand in the linecrosslist will not be lost.
|
// that still stand in the linecrosslist will not be lost.
|
||||||
// There is a hole that must be linked to this link !
|
// There is a hole that must be linked to this link !
|
||||||
TDLI<Node> I( record->GetLine()->GetCrossList() );
|
TDLI<kbNode> I( record->GetLine()->GetCrossList() );
|
||||||
I.tohead();
|
I.tohead();
|
||||||
while( !I.hitroot() )
|
while( !I.hitroot() )
|
||||||
{
|
{
|
||||||
topnode = I.item();
|
topnode = I.item();
|
||||||
I.remove();
|
I.remove();
|
||||||
|
|
||||||
KBoolLine line( _GC );
|
kbLine line( _GC );
|
||||||
line.Set( link );
|
line.Set( link );
|
||||||
|
|
||||||
B_INT Y = line.Calculate_Y( topnode->GetX() );
|
B_INT Y = line.Calculate_Y( topnode->GetX() );
|
||||||
|
@ -1053,16 +1044,16 @@ bool ScanBeam::ProcessHoles( bool atinsert, TDLI<KBoolLink>* _LI )
|
||||||
// all holes are oriented left around
|
// all holes are oriented left around
|
||||||
|
|
||||||
|
|
||||||
Node * leftnode; //left node of clossest link
|
kbNode * leftnode; //left node of clossest link
|
||||||
( link->GetBeginNode()->GetX() < link->GetEndNode()->GetX() ) ?
|
( link->GetBeginNode()->GetX() < link->GetEndNode()->GetX() ) ?
|
||||||
leftnode = link->GetBeginNode() :
|
leftnode = link->GetBeginNode() :
|
||||||
leftnode = link->GetEndNode();
|
leftnode = link->GetEndNode();
|
||||||
|
|
||||||
Node *node_A = new Node( topnode->GetX(), Y, _GC );
|
kbNode *node_A = new kbNode( topnode->GetX(), Y, _GC );
|
||||||
KBoolLink *link_A = new KBoolLink( 0, leftnode, node_A, _GC );
|
kbLink *link_A = new kbLink( 0, leftnode, node_A, _GC );
|
||||||
KBoolLink *link_B = new KBoolLink( 0, node_A, topnode, _GC );
|
kbLink *link_B = new kbLink( 0, node_A, topnode, _GC );
|
||||||
KBoolLink *link_BB = new KBoolLink( 0, topnode, node_A, _GC );
|
kbLink *link_BB = new kbLink( 0, topnode, node_A, _GC );
|
||||||
KBoolLink *link_D = _BI.item()->GetLink();
|
kbLink *link_D = _BI.item()->GetLink();
|
||||||
link_D->Replace( leftnode, node_A );
|
link_D->Replace( leftnode, node_A );
|
||||||
_LI->insbegin( link_A );
|
_LI->insbegin( link_A );
|
||||||
_LI->insbegin( link_B );
|
_LI->insbegin( link_B );
|
||||||
|
@ -1137,7 +1128,7 @@ bool ScanBeam::ProcessHoles( bool atinsert, TDLI<KBoolLink>* _LI )
|
||||||
}
|
}
|
||||||
|
|
||||||
//sort the records on Ysp if eqaul, sort on tangent at ysp
|
//sort the records on Ysp if eqaul, sort on tangent at ysp
|
||||||
int recordsorter_ysp_angle( Record* rec1, Record* rec2 )
|
int recordsorter_ysp_angle( kbRecord* rec1, kbRecord* rec2 )
|
||||||
{
|
{
|
||||||
if ( rec1->Ysp() > rec2->Ysp() )
|
if ( rec1->Ysp() > rec2->Ysp() )
|
||||||
return( 1 );
|
return( 1 );
|
||||||
|
@ -1163,7 +1154,7 @@ int recordsorter_ysp_angle( Record* rec1, Record* rec2 )
|
||||||
}
|
}
|
||||||
|
|
||||||
//sort the records on Ysp if eqaul, sort on tangent at ysp
|
//sort the records on Ysp if eqaul, sort on tangent at ysp
|
||||||
int recordsorter_ysp_angle_back( Record* rec1, Record* rec2 )
|
int recordsorter_ysp_angle_back( kbRecord* rec1, kbRecord* rec2 )
|
||||||
{
|
{
|
||||||
if ( rec1->Ysp() > rec2->Ysp() )
|
if ( rec1->Ysp() > rec2->Ysp() )
|
||||||
return( 1 );
|
return( 1 );
|
||||||
|
@ -1189,7 +1180,7 @@ int recordsorter_ysp_angle_back( Record* rec1, Record* rec2 )
|
||||||
}
|
}
|
||||||
|
|
||||||
// swap functie for cocktailsort ==> each swap means an intersection of links
|
// swap functie for cocktailsort ==> each swap means an intersection of links
|
||||||
bool swap_crossing_normal( Record *a, Record *b )
|
bool swap_crossing_normal( kbRecord *a, kbRecord *b )
|
||||||
{
|
{
|
||||||
if ( !a->Equal( b ) ) // records NOT parallel
|
if ( !a->Equal( b ) ) // records NOT parallel
|
||||||
{
|
{
|
||||||
|
@ -1210,11 +1201,11 @@ int ScanBeam::Process_LinkToLink_Crossings()
|
||||||
int ScanBeam::Process_PointToLink_Crossings()
|
int ScanBeam::Process_PointToLink_Crossings()
|
||||||
{
|
{
|
||||||
int merges = 0;
|
int merges = 0;
|
||||||
Record* record;
|
kbRecord* record;
|
||||||
|
|
||||||
if ( _BI.count() > 1 )
|
if ( _BI.count() > 1 )
|
||||||
{
|
{
|
||||||
DL_Iter<Record*> IL = DL_Iter<Record*>( this );
|
DL_Iter<kbRecord*> IL = DL_Iter<kbRecord*>( this );
|
||||||
IL.toiter( &_BI );
|
IL.toiter( &_BI );
|
||||||
|
|
||||||
//from IL search back for close links
|
//from IL search back for close links
|
||||||
|
@ -1263,11 +1254,11 @@ int ScanBeam::Process_PointToLink_Crossings()
|
||||||
return merges;
|
return merges;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ScanBeam::Process_LinkToLink_Flat( KBoolLine* flatline )
|
int ScanBeam::Process_LinkToLink_Flat( kbLine* flatline )
|
||||||
{
|
{
|
||||||
int crossfound = 0;
|
int crossfound = 0;
|
||||||
Record* record;
|
kbRecord* record;
|
||||||
DL_Iter<Record*> _BBI = DL_Iter<Record*>();
|
DL_Iter<kbRecord*> _BBI = DL_Iter<kbRecord*>();
|
||||||
_BBI.Attach( this );
|
_BBI.Attach( this );
|
||||||
_BBI.toiter( &_BI );
|
_BBI.toiter( &_BI );
|
||||||
|
|
||||||
|
@ -1292,7 +1283,7 @@ int ScanBeam::Process_LinkToLink_Flat( KBoolLine* flatline )
|
||||||
( record->GetLink()->GetBeginNode() != flatline->GetLink()->GetLowNode() )
|
( record->GetLink()->GetBeginNode() != flatline->GetLink()->GetLowNode() )
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Node * newnode = new Node( _low->GetX(), _BI.item()->Ysp(), _GC );
|
kbNode * newnode = new kbNode( _low->GetX(), _BI.item()->Ysp(), _GC );
|
||||||
flatline->AddCrossing( newnode );
|
flatline->AddCrossing( newnode );
|
||||||
record->GetLine()->AddCrossing( newnode );
|
record->GetLine()->AddCrossing( newnode );
|
||||||
crossfound++;
|
crossfound++;
|
||||||
|
@ -1313,11 +1304,11 @@ bool ScanBeam::checksort()
|
||||||
|
|
||||||
// put new item left of the one that is bigger
|
// put new item left of the one that is bigger
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
Record* prev = _BI.item();
|
kbRecord* prev = _BI.item();
|
||||||
_BI++;
|
_BI++;
|
||||||
while( !_BI.hitroot() )
|
while( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * curr = _BI.item();
|
kbRecord * curr = _BI.item();
|
||||||
if ( recordsorter_ysp_angle( prev, curr ) == -1 )
|
if ( recordsorter_ysp_angle( prev, curr ) == -1 )
|
||||||
{
|
{
|
||||||
recordsorter_ysp_angle( prev, curr );
|
recordsorter_ysp_angle( prev, curr );
|
||||||
|
@ -1347,17 +1338,17 @@ bool ScanBeam::writebeam()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DL_Iter<Record*> _BI( this );
|
DL_Iter<kbRecord*> _BI( this );
|
||||||
|
|
||||||
// put new item left of the one that is bigger
|
// put new item left of the one that is bigger
|
||||||
_BI.tohead();
|
_BI.tohead();
|
||||||
while( !_BI.hitroot() )
|
while( !_BI.hitroot() )
|
||||||
{
|
{
|
||||||
Record * cur = _BI.item();
|
kbRecord * cur = _BI.item();
|
||||||
|
|
||||||
fprintf( file, " ysp %I64d \n", cur->Ysp() );
|
fprintf( file, " ysp %I64d \n", cur->Ysp() );
|
||||||
|
|
||||||
KBoolLink* curl = cur->GetLink();
|
kbLink* curl = cur->GetLink();
|
||||||
|
|
||||||
fprintf( file, " linkbegin %I64d %I64d \n", curl->GetBeginNode()->GetX(), curl->GetBeginNode()->GetY() );
|
fprintf( file, " linkbegin %I64d %I64d \n", curl->GetBeginNode()->GetX(), curl->GetBeginNode()->GetY() );
|
||||||
fprintf( file, " linkend %I64d %I64d \n", curl->GetEndNode()->GetX(), curl->GetEndNode()->GetY() );
|
fprintf( file, " linkend %I64d %I64d \n", curl->GetEndNode()->GetX(), curl->GetEndNode()->GetY() );
|
||||||
|
|
Loading…
Reference in New Issue