kicad/polygon/kbool/include/link.h

235 lines
6.0 KiB
C++

/*! \file kbool/include/kbool/link.h
\brief Part of a graph, connection between nodes (Header)
\author Probably Klaas Holwerda or Julian Smart
Copyright: 2001-2004 (C) Probably Klaas Holwerda
Licence: wxWidgets Licence
RCS-ID: $Id: link.h,v 1.1 2005/05/24 19:13:37 titato Exp $
*/
#ifndef LINK_H
#define LINK_H
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma interface
#endif
#include "../include/booleng.h"
#include "../include/_lnk_itr.h"
enum LinkStatus {IS_LEFT,IS_ON,IS_RIGHT};
class LPoint;
class Node;
class Record;
//! segment within a graph
/*
A Graph contains a list of KBoolLink, the KBoolLink or connected by Node's.
Several KBoolLink can be connected to one Node.
A KBoolLink has a direction defined by its begin and end node.
Node do have a list of connected KBoolLink's.
So one can walk trough a graph in two ways:
1- via its KBoolLink list
2- via the node connected to the KBoolLink's
*/
class A2DKBOOLDLLEXP KBoolLink
{
protected:
Bool_Engine* _GC;
public:
//! contructors
KBoolLink(Bool_Engine* GC);
//! contructors
KBoolLink(int graphnr, Node* begin, Node* end, Bool_Engine* GC);
//! contructors
KBoolLink(Node *begin, Node *end, Bool_Engine* GC);
//! destructors
~KBoolLink();
//! Merges the other node with argument
void MergeNodes(Node* const);
//! outproduct of two links
LinkStatus OutProduct(KBoolLink* const two,double accur);
//! link three compared to this and two
LinkStatus PointOnCorner(KBoolLink* const, KBoolLink* const);
//! Removes argument from the link
void Remove(Node*);
//! replaces olddone in the link by newnode
void Replace(Node* oldnode, Node* newnode);
//!top hole marking
void SetTopHole(bool value);
//!top hole marking
bool IsTopHole();
//! Marking functions
void UnMark();
//! Marking functions
void Mark();
//! Marking functions
void SetMark(bool);
//! Marking functions
bool IsMarked();
//! holelink Marking functions
void SetHoleLink(bool val){ m_holelink = val;};
//! holelink Marking functions
bool GetHoleLink(){ return m_holelink;};
//! Bin functions
void SetNotBeenHere();
//! Bin functions
void SetBeenHere();
//! Have you been here ??
bool BeenHere();
//! Removes all the references to this
void UnLink();
//! functions for maximum performance
Node* GetBeginNode();
//! Datamember access functions
Node* GetEndNode();
Node* GetLowNode();
Node* GetHighNode();
//! Returns a next link beginning with argument
KBoolLink* Forth(Node*);
int GetGraphNum();
bool GetInc();
bool GetLeftA();
bool GetLeftB();
bool GetRightA();
bool GetRightB();
void GetLRO(LPoint*, int&, int&, double);
//! Return a node not equal to arg.
Node* GetOther(const Node* const);
//! Is this link unused ?
bool IsUnused();
//! Used for given operation ?
bool IsMarked(BOOL_OP operation);
//! return true if Left side is marked true for operation
bool IsMarkedLeft(BOOL_OP operation);
//! return true if Right side is marked true for operation
bool IsMarkedRight(BOOL_OP operation);
//! is this a hole link for given operation
bool IsHole(BOOL_OP operation);
//! set the hole mark
void SetHole(bool);
//! is the hole mark set?
bool GetHole();
//! Are the nodes on about the same coordinates ?
bool IsZero(B_INT marge );
bool ShorterThan(B_INT marge );
//! Resets the link
void Reset(Node* begin, Node* end, int graphnr = 0);
void Set(Node* begin, Node* end);
void SetBeginNode(Node*);
void SetEndNode(Node*);
void SetGraphNum(int);
void SetInc(bool);
void SetLeftA(bool);
void SetLeftB(bool);
void SetRightA(bool);
void SetRightB(bool);
void SetGroup(GroupType);
GroupType Group();
//! Flag calculation (internal only)
void SetLineTypes();
void Reset();
void Reset_flags();
//!put in this direction
void Redirect(Node* a_node);
void TakeOverOperationFlags( KBoolLink* link );
void SetRecordNode( DL_Node<Record*>* recordNode ) { m_record = recordNode; }
DL_Node<Record*>* GetRecordNode() { return m_record; }
protected:
//! The mainitems of a link
Node *m_beginnode, *m_endnode;
//! Marker for walking over the graph
bool m_bin : 1;
//! Is this a part of hole ?
bool m_hole : 1;
//! link that is toplink of hole?
bool m_hole_top : 1;
//! going in one more time in this graph if true else going out one time
bool m_Inc : 1;
//! Is left in polygongroup A
bool m_LeftA : 1;
//! Is right in polygon group A
bool m_RightA : 1;
//! Is left in polygon group B
bool m_LeftB : 1;
//! Is right in polygongroup B
bool m_RightB : 1;
//! General purose marker, internally unused
bool m_mark : 1;
//! link for linking holes
bool m_holelink : 1;
//! Marker for Merge Left
bool m_merge_L : 1;
//! Marker for substract a-b Left
bool m_a_substract_b_L: 1;
//! Marker for substract b-a Left
bool m_b_substract_a_L: 1;
//! Marker for intersect Left
bool m_intersect_L: 1;
//! Marker for X-OR Left
bool m_exor_L: 1;
//! Marker for Merge Right
bool m_merge_R : 1;
//! Marker for substract a-b Right
bool m_a_substract_b_R: 1;
//! Marker for substract b-a Right
bool m_b_substract_a_R: 1;
//! Marker for intersect Right
bool m_intersect_R: 1;
//! Marker for X-OR Right
bool m_exor_R: 1;
//! belongs to group A or B
GroupType m_group : 1;
//! belongs to this polygon part in the graph.
int m_graphnum;
DL_Node<Record*>* m_record;
};
#endif