code easier to understand
This commit is contained in:
parent
c974c42daf
commit
6c3968a178
|
@ -1168,6 +1168,18 @@ void LIB_COMPONENT::MirrorSelectedItemsH( const wxPoint& center )
|
|||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Locate a draw object.
|
||||
*
|
||||
* @param unit - Unit number of draw item.
|
||||
* @param convert - Body style of draw item.
|
||||
* @param type - Draw object type, set to 0 to search for any type.
|
||||
* @param pt - Coordinate for hit testing.
|
||||
*
|
||||
* @return LIB_DRAW_ITEM - Pointer the the draw object if found.
|
||||
* Otherwise NULL.
|
||||
*/
|
||||
LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int unit, int convert,
|
||||
KICAD_T type, const wxPoint& pt )
|
||||
{
|
||||
|
@ -1201,6 +1213,46 @@ LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int unit, int convert,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/** Function HitTest (overlaid)
|
||||
* @return true if the point aPosRef is near this object
|
||||
* @param aPosRef = a wxPoint to test
|
||||
* @param aThreshold = max distance to this object (usually the half
|
||||
* thickness of a line)
|
||||
* @param aTransMat = the transform matrix
|
||||
*
|
||||
* @return LIB_DRAW_ITEM - Pointer the the draw object if found.
|
||||
* Otherwise NULL.
|
||||
*/
|
||||
LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int unit, int convert,
|
||||
KICAD_T type, const wxPoint& pt, const int aTransMat[2][2] )
|
||||
{
|
||||
/* we use LocateDrawItem( int unit, int convert, KICAD_T type, const wxPoint& pt )
|
||||
* to search items.
|
||||
* because this function uses DefaultTransformMatrix as orient/mirror matrix
|
||||
* we temporary copy aTransMat in DefaultTransformMatrix
|
||||
*/
|
||||
LIB_DRAW_ITEM * item;
|
||||
int matrix[2][2];
|
||||
for ( int ii =0; ii<2;ii++ )
|
||||
{
|
||||
for ( int jj =0; jj<2;jj++ )
|
||||
{
|
||||
matrix[ii][jj] = aTransMat[ii][jj];
|
||||
EXCHG(matrix[ii][jj], DefaultTransformMatrix[ii][jj]);
|
||||
}
|
||||
}
|
||||
item = LocateDrawItem( unit, convert, type, pt );
|
||||
//Restore matrix
|
||||
for ( int ii =0; ii<2;ii++ )
|
||||
{
|
||||
for ( int jj =0; jj<2;jj++ )
|
||||
{
|
||||
EXCHG(matrix[ii][jj], DefaultTransformMatrix[ii][jj]);
|
||||
}
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
void LIB_COMPONENT::SetPartCount( int count )
|
||||
{
|
||||
|
|
|
@ -356,6 +356,21 @@ public:
|
|||
LIB_DRAW_ITEM* LocateDrawItem( int unit, int convert, KICAD_T type,
|
||||
const wxPoint& pt );
|
||||
|
||||
/**
|
||||
* Locate a draw object (overlaid)
|
||||
*
|
||||
* @param unit - Unit number of draw item.
|
||||
* @param convert - Body style of draw item.
|
||||
* @param type - Draw object type, set to 0 to search for any type.
|
||||
* @param pt - Coordinate for hit testing.
|
||||
* @param aTransMat = the transform matrix
|
||||
*
|
||||
* @return LIB_DRAW_ITEM - Pointer the the draw object if found.
|
||||
* Otherwise NULL.
|
||||
*/
|
||||
LIB_DRAW_ITEM* LocateDrawItem( int unit, int convert, KICAD_T type,
|
||||
const wxPoint& pt, const int aTransMat[2][2] );
|
||||
|
||||
/**
|
||||
* Return a reference to the draw item list.
|
||||
*
|
||||
|
|
|
@ -686,38 +686,6 @@ Hierarchical_PIN_Sheet_Struct* LocateSheetLabel( DrawSheetStruct* Sheet,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* helper function used to locate graphics items in a lib component (in library space)
|
||||
* to a given location given in schematic space
|
||||
* in schematic space, a component is an image of the lib component, rotated and mirorred
|
||||
* by its mirror/rotation matrix
|
||||
* this function calculates the invert matrix of the mirror/rotation matrix
|
||||
* it is used to calculate the position in in library space from
|
||||
* the position in schematic space of a test point, corresponding to a given component
|
||||
*/
|
||||
bool InvertMatrix(int aSource[2][2], int aDest[2][2] )
|
||||
{
|
||||
/* for a source matrix (a,b, c,d) a, if the first line, and cd the second line
|
||||
* the invert matrix is 1/det * comatrix
|
||||
* det = ad-bc
|
||||
* comatrix = (d,-b, -c,a)
|
||||
* a = aSource[0][0]
|
||||
* b = aSource[0][1]
|
||||
* c = aSource[1][0]
|
||||
* d = aSource[1][1]
|
||||
* in eeschema, values are 1, 0 or -1 only and we can use integers only
|
||||
*/
|
||||
bool success = true;
|
||||
int det = aSource[0][0]*aSource[1][1] - aSource[0][1]*aSource[1][0];
|
||||
wxASSERT(det);
|
||||
if( det == 0 ) // Should not occur with eeschema matrix transform
|
||||
det = 1;
|
||||
aDest[0][0] = aSource[1][1]/det;
|
||||
aDest[0][1] = -aSource[0][1]/det;
|
||||
aDest[1][0] = -aSource[1][0]/det;
|
||||
aDest[1][1] = aSource[0][0]/det;
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
LibDrawPin* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos,
|
||||
SCH_COMPONENT** libpart )
|
||||
|
@ -738,24 +706,14 @@ LibDrawPin* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos,
|
|||
if( Entry == NULL )
|
||||
continue;
|
||||
/* we use LocateDrawItem to locate pîns. but this function suppose a component
|
||||
* at 0,0 location, in normal orientation/mirror
|
||||
* So we must calculate the ref position in component space
|
||||
* at 0,0 location
|
||||
* So we must calculate the ref position relative to the component
|
||||
*/
|
||||
// Calculate the position relative to the component (in library space the component is at location 0,0)
|
||||
wxPoint libPos = RefPos - schItem->m_Pos;
|
||||
// Calculate the equivalent position of the test point for a normal orient component
|
||||
int itransMat[2][2];
|
||||
InvertMatrix(schItem->m_Transform, itransMat );
|
||||
libPos = TransformCoordinate(itransMat, libPos);
|
||||
// LocateDrawItem uses DefaultTransformMatrix as matrix orientation of the component
|
||||
// so we must recalculate libPos for this orientation before calling LocateDrawItem
|
||||
InvertMatrix(DefaultTransformMatrix, itransMat );
|
||||
libPos = TransformCoordinate(itransMat, libPos);
|
||||
wxPoint schPos = TransformCoordinate(schItem->m_Transform, libPos);
|
||||
Pin = (LibDrawPin*) Entry->LocateDrawItem( schItem->m_Multi,
|
||||
schItem->m_Convert,
|
||||
COMPONENT_PIN_DRAW_TYPE,
|
||||
libPos );
|
||||
libPos, schItem->m_Transform );
|
||||
if( Pin )
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue