/* * Draw (on m_panelShowPin) the pin currently edited * accroding to current settings in dialog */ void DIALOG_LIB_EDIT_PIN::OnPaintShowPanel( wxPaintEvent& event ) { wxPaintDC dc( m_panelShowPin ); wxSize dc_size = dc.GetSize(); dc.SetDeviceOrigin( dc_size.x / 2, dc_size.y / 2 ); // Give a parent to m_dummyPin only from draw purpose. // In fact m_dummyPin should not have a parent, but draw functions need a parent // to know some options, about pin texts LIB_EDIT_FRAME* libframe = (LIB_EDIT_FRAME*) GetParent(); m_dummyPin->SetParent( libframe->GetComponent() ); // Calculate a suitable scale to fit the available draw area EDA_RECT bBox = m_dummyPin->GetBoundingBox(); double xscale = (double) dc_size.x / bBox.GetWidth(); double yscale = (double) dc_size.y / bBox.GetHeight(); double scale = std::min( xscale, yscale ); // Give a 10% margin scale *= 0.9; dc.SetUserScale( scale, scale ); wxPoint offset = bBox.Centre(); NEGATE( offset.x ); NEGATE( offset.y ); GRResetPenAndBrush( &dc ); m_dummyPin->Draw( NULL, &dc, offset, UNSPECIFIED_COLOR, GR_COPY, NULL, DefaultTransform ); m_dummyPin->SetParent(NULL); event.Skip(); }
wxPoint GERBER_DRAW_ITEM::GetABPosition( const wxPoint& aXYPosition ) const { /* Note: RS274Xrevd_e is obscure about the order of transforms: * For instance: Rotation must be made after or before mirroring ? * Note: if something is changed here, GetYXPosition must reflect changes */ wxPoint abPos = aXYPosition + m_imageParams->m_ImageJustifyOffset; if( m_swapAxis ) EXCHG( abPos.x, abPos.y ); abPos += m_layerOffset + m_imageParams->m_ImageOffset; abPos.x = KiROUND( abPos.x * m_drawScale.x ); abPos.y = KiROUND( abPos.y * m_drawScale.y ); double rotation = m_lyrRotation * 10 + m_imageParams->m_ImageRotation * 10; if( rotation ) RotatePoint( &abPos, -rotation ); // Negate A axis if mirrored if( m_mirrorA ) NEGATE( abPos.x ); // abPos.y must be negated when no mirror, because draw axis is top to bottom if( !m_mirrorB ) NEGATE( abPos.y ); return abPos; }
// Render the preview in our m_componentView. If this gets more complicated, we should // probably have a derived class from wxPanel; but this keeps things local. void DIALOG_CHOOSE_COMPONENT::renderPreview( LIB_PART* aComponent, int aUnit ) { wxPaintDC dc( m_componentView ); EDA_COLOR_T bgcolor = m_parent->GetDrawBgColor(); dc.SetBackground( bgcolor == BLACK ? *wxBLACK_BRUSH : *wxWHITE_BRUSH ); dc.Clear(); if( aComponent == NULL ) return; if( aUnit <= 0 ) aUnit = 1; const wxSize dc_size = dc.GetSize(); dc.SetDeviceOrigin( dc_size.x / 2, dc_size.y / 2 ); // Find joint bounding box for everything we are about to draw. EDA_RECT bBox = aComponent->GetBoundingBox( aUnit, m_deMorganConvert ); const double xscale = (double) dc_size.x / bBox.GetWidth(); const double yscale = (double) dc_size.y / bBox.GetHeight(); const double scale = std::min( xscale, yscale ) * 0.85; dc.SetUserScale( scale, scale ); wxPoint offset = bBox.Centre(); NEGATE( offset.x ); NEGATE( offset.y ); aComponent->Draw( NULL, &dc, offset, aUnit, m_deMorganConvert, GR_COPY, UNSPECIFIED_COLOR, DefaultTransform, true, true, false ); }
wxPoint GERBER_DRAW_ITEM::GetXYPosition( const wxPoint& aABPosition ) { // do the inverse transform made by GetABPosition wxPoint xyPos = aABPosition; if( m_mirrorA ) NEGATE( xyPos.x ); if( !m_mirrorB ) NEGATE( xyPos.y ); double rotation = m_lyrRotation * 10 + m_imageParams->m_ImageRotation * 10; if( rotation ) RotatePoint( &xyPos, rotation ); xyPos.x = KiROUND( xyPos.x / m_drawScale.x ); xyPos.y = KiROUND( xyPos.y / m_drawScale.y ); xyPos -= m_layerOffset + m_imageParams->m_ImageOffset; if( m_swapAxis ) EXCHG( xyPos.x, xyPos.y ); return xyPos - m_imageParams->m_ImageJustifyOffset; }
void ZONE_CONTAINER::Mirror( const wxPoint& mirror_ref ) { for( unsigned ic = 0; ic < m_Poly->m_CornersList.GetCornersCount(); ic++ ) { int py = m_Poly->m_CornersList.GetY( ic ) - mirror_ref.y; NEGATE( py ); m_Poly->m_CornersList.SetY( ic, py + mirror_ref.y ); } m_Poly->Hatch(); /* mirror filled areas: */ for( unsigned ic = 0; ic < m_FilledPolysList.GetCornersCount(); ic++ ) { int py = m_FilledPolysList.GetY( ic ) - mirror_ref.y; NEGATE( py ); m_FilledPolysList.SetY( ic, py + mirror_ref.y ); } for( unsigned ic = 0; ic < m_FillSegmList.size(); ic++ ) { m_FillSegmList[ic].m_Start.y -= mirror_ref.y; NEGATE( m_FillSegmList[ic].m_Start.y ); m_FillSegmList[ic].m_Start.y += mirror_ref.y; m_FillSegmList[ic].m_End.y -= mirror_ref.y; NEGATE( m_FillSegmList[ic].m_End.y ); m_FillSegmList[ic].m_End.y += mirror_ref.y; } }
void SCH_BUS_ENTRY::MirrorY( int aYaxis_position ) { m_pos.x -= aYaxis_position; NEGATE( m_pos.x ); m_pos.x += aYaxis_position; NEGATE( m_size.x ); }
void SCH_BUS_ENTRY::MirrorX( int aXaxis_position ) { m_pos.y -= aXaxis_position; NEGATE( m_pos.y ); m_pos.y += aXaxis_position; NEGATE( m_size.y ); }
EDA_RECT SCH_FIELD::GetBoundingBox() const { SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent; int linewidth = ( m_Thickness == 0 ) ? GetDefaultLineThickness() : m_Thickness; // We must pass the effective text thickness to GetTextBox // when calculating the bounding box linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold ); // Calculate the text bounding box: EDA_RECT rect; // set USE_TEXT_JUSTIFY_INITIAL_BEHAVIOR to 0 to use // a justification relative to the text itself // i.e. justification relative to an horizontal text // or to 1 to keep the initial behavior #if (USE_TEXT_JUSTIFY_INITIAL_BEHAVIOR == 1 ) if( m_Orient == TEXT_ORIENT_VERT ) { // For vertical texts, exchange the horizontal and the vertical justification // The idea is to keep the justification always left or top for instance, // no matter the text orientation SCH_FIELD text( *this ); // Make a local copy to swap justifications // because GetBoundingBox() is const int tmp = (int)text.m_VJustify; NEGATE( tmp ); text.m_VJustify = (EDA_TEXT_VJUSTIFY_T)text.m_HJustify; text.m_HJustify = (EDA_TEXT_HJUSTIFY_T)tmp; rect = text.GetTextBox( -1, linewidth ); } else #endif rect = GetTextBox( -1, linewidth ); // Calculate the bounding box position relative to the component: wxPoint origin = parentComponent->GetPosition(); wxPoint pos = m_Pos - origin; wxPoint begin = rect.GetOrigin() - origin; wxPoint end = rect.GetEnd() - origin; RotatePoint( &begin, pos, m_Orient ); RotatePoint( &end, pos, m_Orient ); // Due to the Y axis direction, we must mirror the bounding box, // relative to the text position: begin.y -= pos.y; end.y -= pos.y; NEGATE( begin.y ); NEGATE( end.y ); begin.y += pos.y; end.y += pos.y; // Now, apply the component transform (mirror/rot) begin = parentComponent->GetTransform().TransformCoordinate( begin ); end = parentComponent->GetTransform().TransformCoordinate( end ); rect.SetOrigin( begin); rect.SetEnd( end); rect.Move( origin ); rect.Normalize(); return rect; }
void GBR_TO_PCB_EXPORTER::export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ) { wxPoint seg_start, seg_end; seg_start = aGbrItem->m_Start; seg_end = aGbrItem->m_End; // Reverse Y axis: NEGATE( seg_start.y ); NEGATE( seg_end.y ); writePcbLineItem( 0, TRACK_TYPE, seg_start, seg_end, aGbrItem->m_Size.x, aLayer, -1 ); }
void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ) { double a = atan2( (double) ( aGbrItem->m_Start.y - aGbrItem->m_ArcCentre.y ), (double) ( aGbrItem->m_Start.x - aGbrItem->m_ArcCentre.x ) ); double b = atan2( (double) ( aGbrItem->m_End.y - aGbrItem->m_ArcCentre.y ), (double) ( aGbrItem->m_End.x - aGbrItem->m_ArcCentre.x ) ); wxPoint start = aGbrItem->m_Start; wxPoint end = aGbrItem->m_End; /* Because Pcbnew does not know arcs in tracks, * approximate arc by segments (SEG_COUNT__CIRCLE segment per 360 deg) * The arc is drawn in an anticlockwise direction from the start point to the end point. */ #define SEG_COUNT_CIRCLE 16 #define DELTA_ANGLE 2 * M_PI / SEG_COUNT_CIRCLE // calculate the number of segments from a to b. // we want CNT_PER_360 segments fo a circle if( a > b ) b += 2 * M_PI; wxPoint curr_start = start; wxPoint seg_start, seg_end; int ii = 1; for( double rot = a; rot < (b - DELTA_ANGLE); rot += DELTA_ANGLE, ii++ ) { seg_start = curr_start; wxPoint curr_end = start; RotatePoint( &curr_end, aGbrItem->m_ArcCentre, -RAD2DECIDEG( DELTA_ANGLE * ii ) ); seg_end = curr_end; // Reverse Y axis: NEGATE( seg_start.y ); NEGATE( seg_end.y ); writePcbLineItem( 0, TRACK_TYPE, seg_start, seg_end, aGbrItem->m_Size.x, aLayer, -1 ); curr_start = curr_end; } if( end != curr_start ) { seg_start = curr_start; seg_end = end; // Reverse Y axis: NEGATE( seg_start.y ); NEGATE( seg_end.y ); writePcbLineItem( 0, TRACK_TYPE, seg_start, seg_end, aGbrItem->m_Size.x, aLayer, -1 ); } }
const EDA_RECT SCH_FIELD::GetBoundingBox() const { SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent; int linewidth = ( m_Thickness == 0 ) ? GetDefaultLineThickness() : m_Thickness; // We must pass the effective text thickness to GetTextBox // when calculating the bounding box linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold ); // Calculate the text bounding box: EDA_RECT rect; if( m_id == REFERENCE ) // multi units have one letter or more added to reference { SCH_FIELD text( *this ); // Make a local copy to change text // because GetBoundingBox() is const text.SetText( GetFullyQualifiedText() ); rect = text.GetTextBox( -1, linewidth ); } else rect = GetTextBox( -1, linewidth ); // Calculate the bounding box position relative to the component: wxPoint origin = parentComponent->GetPosition(); wxPoint pos = m_Pos - origin; wxPoint begin = rect.GetOrigin() - origin; wxPoint end = rect.GetEnd() - origin; RotatePoint( &begin, pos, m_Orient ); RotatePoint( &end, pos, m_Orient ); // Due to the Y axis direction, we must mirror the bounding box, // relative to the text position: begin.y -= pos.y; end.y -= pos.y; NEGATE( begin.y ); NEGATE( end.y ); begin.y += pos.y; end.y += pos.y; // Now, apply the component transform (mirror/rot) begin = parentComponent->GetTransform().TransformCoordinate( begin ); end = parentComponent->GetTransform().TransformCoordinate( end ); rect.SetOrigin( begin); rect.SetEnd( end); rect.Move( origin ); rect.Normalize(); return rect; }
/* * creates a via from a flashed gerber item. * Flashed items are usually pads or vias, so we try to export all of them * using vias */ void GBR_TO_PCB_EXPORTER::export_flashed_copper_item( GERBER_DRAW_ITEM* aGbrItem ) { // First, explore already created vias, before creating a new via for( unsigned ii = 0; ii < m_vias_coordinates.size(); ii++ ) { if( m_vias_coordinates[ii] == aGbrItem->m_Start ) // Already created return; } m_vias_coordinates.push_back( aGbrItem->m_Start ); wxPoint via_pos; int width; via_pos = aGbrItem->m_Start; width = (aGbrItem->m_Size.x + aGbrItem->m_Size.y) / 2; // Reverse Y axis: NEGATE( via_pos.y ); // Layers are 0 to 15 (Cu/Cmp) = 0x0F #define IS_VIA 1 #define SHAPE_VIA_THROUGH 3 // XXX EVIL usage of LAYER writePcbLineItem( SHAPE_VIA_THROUGH, IS_VIA, via_pos, via_pos, width, 0x0F, -1 ); }
EDA_RECT LIB_TEXT::GetBoundingBox() const { /* Y coordinates for LIB_ITEMS are bottom to top, so we must invert the Y position when * calling GetTextBox() that works using top to bottom Y axis orientation. */ EDA_RECT rect = GetTextBox( -1, -1, true ); wxPoint orig = rect.GetOrigin(); wxPoint end = rect.GetEnd(); NEGATE( orig.y); NEGATE( end.y); RotatePoint( &orig, m_Pos, -m_Orient ); RotatePoint( &end, m_Pos, -m_Orient ); rect.SetOrigin( orig ); rect.SetEnd( end ); rect.Normalize(); return rect; }
void D_PAD::Flip( int aTranslationY ) { int y = GetPosition().y - aTranslationY; y = -y; // invert about x axis. y += aTranslationY; SetY( y ); NEGATE( m_Pos0.y ); NEGATE( m_Offset.y ); NEGATE( m_DeltaSize.y ); SetOrientation( -GetOrientation() ); // flip pads layers SetLayerMask( ChangeSideMaskLayer( m_layerMask ) ); // m_boundingRadius = -1; the shape has not been changed }
void D_PAD::Flip( const wxPoint& aCentre ) { int y = GetPosition().y - aCentre.y; y = -y; // invert about x axis. y += aCentre.y; SetY( y ); NEGATE( m_Pos0.y ); NEGATE( m_Offset.y ); NEGATE( m_DeltaSize.y ); SetOrientation( -GetOrientation() ); // flip pads layers SetLayerSet( FlipLayerMask( m_layerMask ) ); // m_boundingRadius = -1; the shape has not been changed }
void DRAWSEGMENT::Flip( const wxPoint& aCentre ) { m_Start.y = aCentre.y - (m_Start.y - aCentre.y); m_End.y = aCentre.y - (m_End.y - aCentre.y); if( m_Shape == S_ARC ) { NEGATE( m_Angle ); } SetLayer( FlipLayer( GetLayer() ) ); }
double RoundTo0( double x, double precision ) { assert( precision != 0 ); long long ix = KiROUND( x * precision ); if ( x < 0.0 ) NEGATE( ix ); int remainder = ix % 10; // remainder is in precision mm if ( remainder <= 2 ) ix -= remainder; // truncate to the near number else if (remainder >= 8 ) ix += 10 - remainder; // round to near number if ( x < 0 ) NEGATE( ix ); return (double) ix / precision; }
void SCH_LABEL::MirrorX( int aXaxis_position ) { // Text is NOT really mirrored; it is moved to a suitable position // which is the closest position for a true mirrored text // The center position is mirrored and the text is moved for half // horizontal len int py = m_Pos.y; py -= aXaxis_position; NEGATE( py ); py += aXaxis_position; m_Pos.y = py; }
void GBR_TO_PCB_EXPORTER::export_non_copper_item( GERBER_DRAW_ITEM* aGbrItem, LAYER_NUM aLayer ) { #define SEG_SHAPE 0 #define ARC_SHAPE 2 int shape = SEG_SHAPE; // please note: the old PCB format only has integer support for angles int angle = 0; wxPoint seg_start, seg_end; seg_start = aGbrItem->m_Start; seg_end = aGbrItem->m_End; if( aGbrItem->m_Shape == GBR_ARC ) { double a = atan2( (double) ( aGbrItem->m_Start.y - aGbrItem->m_ArcCentre.y), (double) ( aGbrItem->m_Start.x - aGbrItem->m_ArcCentre.x ) ); double b = atan2( (double) ( aGbrItem->m_End.y - aGbrItem->m_ArcCentre.y ), (double) ( aGbrItem->m_End.x - aGbrItem->m_ArcCentre.x ) ); shape = ARC_SHAPE; angle = KiROUND( RAD2DECIDEG(a - b) ); seg_start = aGbrItem->m_ArcCentre; if( angle < 0 ) { NEGATE( angle ); seg_end = aGbrItem->m_Start; } } // Reverse Y axis: NEGATE( seg_start.y ); NEGATE( seg_end.y ); writePcbLineItem( shape, 0, seg_start, seg_end, aGbrItem->m_Size.x, aLayer, -2, angle ); }
void EDGE_MODULE::Flip(const wxPoint& aCentre ) { wxPoint pt; switch( GetShape() ) { case S_ARC: SetAngle( -GetAngle() ); //Fall through default: case S_SEGMENT: pt = GetStart(); pt.y -= aCentre.y; pt.y = -pt.y; pt.y += aCentre.y; SetStart( pt ); pt = GetEnd(); pt.y -= aCentre.y; pt.y = -pt.y; pt.y += aCentre.y; SetEnd( pt ); NEGATE( m_Start0.y ); NEGATE( m_End0.y ); break; case S_POLYGON: // polygon corners coordinates are always relative to the // footprint position, orientation 0 for( unsigned ii = 0; ii < m_PolyPoints.size(); ii++ ) NEGATE( m_PolyPoints[ii].y ); } SetLayer( FlipLayer( GetLayer() ) ); }
void Pred_lt_6 ( INT16 exc[], /* in/out: excitation buffer */ INT16 T0, /* input : integer pitch lag */ INT16 frac, /* input : fraction of lag */ INT16 L_subfr /* input : subframe size */ ) { INT16 i, j, k; INT16 *x0, *x1, *x2; const INT16 *c1, *c2; //INT32 s; register INT32 s_hi=0; register UINT32 s_lo=0; VPP_EFR_PROFILE_FUNCTION_ENTER(Pred_lt_6); x0 = &exc[-T0]; frac = NEGATE(frac); if (frac < 0) { frac = ADD(frac, UP_SAMP); x0--; } for (j = 0; j < L_subfr; j++) { x1 = x0++; x2 = x0; c1 = &inter_6[frac]; c2 = &inter_6[SUB (UP_SAMP, frac)]; s_lo = 0; for (i = 0, k = 0; i < L_INTERPOL; i++, k += UP_SAMP) { //s = L_MAC(s, x1[-i], c1[k]); VPP_MLA16(s_hi, s_lo, x1[-i], c1[k]); //s = L_MAC(s, x2[i], c2[k]); VPP_MLA16(s_hi, s_lo, x2[i], c2[k]); } //exc[j] = round(s); //exc[j] = ROUND(VPP_SCALE64_TO_16(s_hi, s_lo)); exc[j] = L_SHR_D(L_ADD((INT32)s_lo,0x4000),15); } VPP_EFR_PROFILE_FUNCTION_EXIT(Pred_lt_6); return; }
void MODULE::Flip( const wxPoint& aCentre ) { // Move module to its final position: wxPoint finalPos = m_Pos; finalPos.y = aCentre.y - ( finalPos.y - aCentre.y ); /// Mirror the Y position SetPosition( finalPos ); // Flip layer SetLayer( FlipLayer( GetLayer() ) ); // Reverse mirror orientation. NEGATE( m_Orient ); NORMALIZE_ANGLE_POS( m_Orient ); // Mirror pads to other side of board about the x axis, i.e. vertically. for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) pad->Flip( m_Pos ); // Mirror reference. m_Reference->FlipWithModule( m_Pos.y ); // Mirror value. m_Value->FlipWithModule( m_Pos.y ); // Reverse mirror module graphics and texts. for( EDA_ITEM* item = m_Drawings; item; item = item->Next() ) { switch( item->Type() ) { case PCB_MODULE_EDGE_T: ( (EDGE_MODULE*) item )->Flip( m_Pos ); break; case PCB_MODULE_TEXT_T: static_cast<TEXTE_MODULE*>( item )->FlipWithModule( m_Pos.y ); break; default: wxMessageBox( wxT( "MODULE::Flip() error: Unknown Draw Type" ) ); break; } } CalculateBoundingBox(); }
void SCH_HIERLABEL::MirrorX( int aXaxis_position ) { switch( GetOrientation() ) { case 1: /* vertical text */ SetOrientation( 3 ); break; case 3: /* invert vertical text*/ SetOrientation( 1 ); break; } m_Pos.y -= aXaxis_position; NEGATE( m_Pos.y ); m_Pos.y += aXaxis_position; }
static void export_vrml_pcbtext( TEXTE_PCB* text ) { // Coupling by globals! Ewwww... s_text_layer = text->GetLayer(); s_text_width = text->m_Thickness; wxSize size = text->m_Size; if( text->m_Mirror ) NEGATE( size.x ); if( text->m_MultilineAllowed ) { wxPoint pos = text->m_Pos; wxArrayString* list = wxStringSplit( text->m_Text, '\n' ); wxPoint offset; offset.y = text->GetInterline(); RotatePoint( &offset, text->GetOrientation() ); for( unsigned i = 0; i<list->Count(); i++ ) { wxString txt = list->Item( i ); DrawGraphicText( NULL, NULL, pos, BLACK, txt, text->GetOrientation(), size, text->m_HJustify, text->m_VJustify, text->m_Thickness, text->m_Italic, true, vrml_text_callback ); pos += offset; } delete (list); } else { DrawGraphicText( NULL, NULL, text->m_Pos, BLACK, text->m_Text, text->GetOrientation(), size, text->m_HJustify, text->m_VJustify, text->m_Thickness, text->m_Italic, true, vrml_text_callback ); } }
static void export_vrml_text_module( TEXTE_MODULE* module ) //{{{ { if( module->IsVisible() ) { wxSize size = module->m_Size; if( module->m_Mirror ) NEGATE( size.x ); // Text is mirrored s_text_layer = module->GetLayer(); s_text_width = module->m_Thickness; DrawGraphicText( NULL, NULL, module->m_Pos, BLACK, module->m_Text, module->GetDrawRotation(), size, module->m_HJustify, module->m_VJustify, module->m_Thickness, module->m_Italic, true, vrml_text_callback ); } }
bool LIB_ARC::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform ) { if( aThreshold < 0 ) aThreshold = GetPenSize() / 2; // TODO: use aTransMat to calculates parameters wxPoint relativePosition = aPosition; NEGATE( relativePosition.y ); // reverse Y axis int distance = wxRound( EuclideanNorm( TwoPointVector( m_Pos, relativePosition ) ) ); if( abs( distance - m_Radius ) > aThreshold ) return false; // We are on the circle, ensure we are only on the arc, i.e. between // m_ArcStart and m_ArcEnd wxPoint startEndVector = TwoPointVector( m_ArcStart, m_ArcEnd); wxPoint startRelativePositionVector = TwoPointVector( m_ArcStart, relativePosition ); wxPoint centerStartVector = TwoPointVector( m_Pos, m_ArcStart ); wxPoint centerEndVector = TwoPointVector( m_Pos, m_ArcEnd ); wxPoint centerRelativePositionVector = TwoPointVector( m_Pos, relativePosition ); // Compute the cross product to check if the point is in the sector int crossProductStart = CrossProduct( centerStartVector, centerRelativePositionVector ); int crossProductEnd = CrossProduct( centerEndVector, centerRelativePositionVector ); // The cross products need to be exchanged, depending on which side the center point // relative to the start point to end point vector lies if( CrossProduct( startEndVector, startRelativePositionVector ) < 0 ) { EXCHG( crossProductStart, crossProductEnd ); } // When the cross products have a different sign, the point lies in sector // also check, if the reference is near start or end point return HitTestPoints( m_ArcStart, relativePosition, MINIMUM_SELECTION_DISTANCE ) || HitTestPoints( m_ArcEnd, relativePosition, MINIMUM_SELECTION_DISTANCE ) || ( crossProductStart <= 0 && crossProductEnd >= 0 ); }
static void export_vrml_pcbtext( MODEL_VRML& aModel, TEXTE_PCB* text ) { model_vrml->s_text_layer = text->GetLayer(); model_vrml->s_text_width = text->GetThickness(); wxSize size = text->GetSize(); if( text->IsMirrored() ) NEGATE( size.x ); EDA_COLOR_T color = BLACK; // not actually used, but needed by DrawGraphicText if( text->IsMultilineAllowed() ) { wxArrayString* list = wxStringSplit( text->GetShownText(), '\n' ); std::vector<wxPoint> positions; positions.reserve( list->Count() ); text->GetPositionsOfLinesOfMultilineText( positions, list->Count() ); for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString txt = list->Item( ii ); DrawGraphicText( NULL, NULL, positions[ii], color, txt, text->GetOrientation(), size, text->GetHorizJustify(), text->GetVertJustify(), text->GetThickness(), text->IsItalic(), true, vrml_text_callback ); } delete (list); } else { DrawGraphicText( NULL, NULL, text->GetTextPosition(), color, text->GetShownText(), text->GetOrientation(), size, text->GetHorizJustify(), text->GetVertJustify(), text->GetThickness(), text->IsItalic(), true, vrml_text_callback ); } }
static void export_vrml_text_module( TEXTE_MODULE* module ) { if( module->IsVisible() ) { wxSize size = module->GetSize(); if( module->IsMirrored() ) NEGATE( size.x ); // Text is mirrored model_vrml->s_text_layer = module->GetLayer(); model_vrml->s_text_width = module->GetThickness(); DrawGraphicText( NULL, NULL, module->GetTextPosition(), BLACK, module->GetShownText(), module->GetDrawRotation(), size, module->GetHorizJustify(), module->GetVertJustify(), module->GetThickness(), module->IsItalic(), true, vrml_text_callback ); } }
void SCH_TEXT::MirrorY( int aYaxis_position ) { // Text is NOT really mirrored; it is moved to a suitable position // which is the closest position for a true mirrored text // The center position is mirrored and the text is moved for half // horizontal len int px = m_Pos.x; int dx; switch( GetOrientation() ) { case 0: /* horizontal text */ dx = LenSize( m_Text ) / 2; break; case 1: /* Vert Orientation UP */ dx = -m_Size.x / 2; break; case 2: /* invert horizontal text*/ dx = -LenSize( m_Text ) / 2; break; case 3: /* Vert Orientation BOTTOM */ dx = m_Size.x / 2; break; default: dx = 0; break; } px += dx; px -= aYaxis_position; NEGATE( px ); px += aYaxis_position; px -= dx; m_Pos.x = px; }
void SCH_TEXT::MirrorX( int aXaxis_position ) { // Text is NOT really mirrored; it is moved to a suitable position // which is the closest position for a true mirrored text // The center position is mirrored and the text is moved for half // horizontal len int py = m_Pos.y; int dy; switch( GetOrientation() ) { case 0: /* horizontal text */ dy = -m_Size.y / 2; break; case 1: /* Vert Orientation UP */ dy = -LenSize( m_Text ) / 2; break; case 2: /* invert horizontal text*/ dy = m_Size.y / 2; // how to calculate text height? break; case 3: /* Vert Orientation BOTTOM */ dy = LenSize( m_Text ) / 2; break; default: dy = 0; break; } py += dy; py -= aXaxis_position; NEGATE( py ); py += aXaxis_position; py -= dy; m_Pos.y = py; }