Loading eeschema/class_libentry.cpp +52 −0 Original line number Original line Diff line number Diff line Loading @@ -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, LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int unit, int convert, KICAD_T type, const wxPoint& pt ) KICAD_T type, const wxPoint& pt ) { { Loading Loading @@ -1201,6 +1213,46 @@ LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int unit, int convert, return NULL; 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 ) void LIB_COMPONENT::SetPartCount( int count ) { { Loading eeschema/class_libentry.h +15 −0 Original line number Original line Diff line number Diff line Loading @@ -356,6 +356,21 @@ public: LIB_DRAW_ITEM* LocateDrawItem( int unit, int convert, KICAD_T type, LIB_DRAW_ITEM* LocateDrawItem( int unit, int convert, KICAD_T type, const wxPoint& pt ); 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. * Return a reference to the draw item list. * * Loading eeschema/locate.cpp +4 −46 Original line number Original line Diff line number Diff line Loading @@ -686,38 +686,6 @@ Hierarchical_PIN_Sheet_Struct* LocateSheetLabel( DrawSheetStruct* Sheet, return NULL; 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, LibDrawPin* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos, SCH_COMPONENT** libpart ) SCH_COMPONENT** libpart ) Loading @@ -738,24 +706,14 @@ LibDrawPin* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos, if( Entry == NULL ) if( Entry == NULL ) continue; continue; /* we use LocateDrawItem to locate pns. but this function suppose a component /* we use LocateDrawItem to locate pns. but this function suppose a component * at 0,0 location, in normal orientation/mirror * at 0,0 location * So we must calculate the ref position in component space * 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; 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, Pin = (LibDrawPin*) Entry->LocateDrawItem( schItem->m_Multi, schItem->m_Convert, schItem->m_Convert, COMPONENT_PIN_DRAW_TYPE, COMPONENT_PIN_DRAW_TYPE, libPos ); libPos, schItem->m_Transform ); if( Pin ) if( Pin ) break; break; } } Loading Loading
eeschema/class_libentry.cpp +52 −0 Original line number Original line Diff line number Diff line Loading @@ -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, LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int unit, int convert, KICAD_T type, const wxPoint& pt ) KICAD_T type, const wxPoint& pt ) { { Loading Loading @@ -1201,6 +1213,46 @@ LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int unit, int convert, return NULL; 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 ) void LIB_COMPONENT::SetPartCount( int count ) { { Loading
eeschema/class_libentry.h +15 −0 Original line number Original line Diff line number Diff line Loading @@ -356,6 +356,21 @@ public: LIB_DRAW_ITEM* LocateDrawItem( int unit, int convert, KICAD_T type, LIB_DRAW_ITEM* LocateDrawItem( int unit, int convert, KICAD_T type, const wxPoint& pt ); 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. * Return a reference to the draw item list. * * Loading
eeschema/locate.cpp +4 −46 Original line number Original line Diff line number Diff line Loading @@ -686,38 +686,6 @@ Hierarchical_PIN_Sheet_Struct* LocateSheetLabel( DrawSheetStruct* Sheet, return NULL; 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, LibDrawPin* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos, SCH_COMPONENT** libpart ) SCH_COMPONENT** libpart ) Loading @@ -738,24 +706,14 @@ LibDrawPin* LocateAnyPin( SCH_ITEM* DrawList, const wxPoint& RefPos, if( Entry == NULL ) if( Entry == NULL ) continue; continue; /* we use LocateDrawItem to locate pns. but this function suppose a component /* we use LocateDrawItem to locate pns. but this function suppose a component * at 0,0 location, in normal orientation/mirror * at 0,0 location * So we must calculate the ref position in component space * 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; 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, Pin = (LibDrawPin*) Entry->LocateDrawItem( schItem->m_Multi, schItem->m_Convert, schItem->m_Convert, COMPONENT_PIN_DRAW_TYPE, COMPONENT_PIN_DRAW_TYPE, libPos ); libPos, schItem->m_Transform ); if( Pin ) if( Pin ) break; break; } } Loading