const EDA_RECT SCH_TEXT::GetBoundingBox() const { // We must pass the effective text thickness to GetTextBox // when calculating the bounding box int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); linewidth = Clamp_Text_PenSize( linewidth, GetTextSize(), IsBold() ); EDA_RECT rect = GetTextBox( -1, linewidth ); if( GetTextAngle() != 0 ) // Rotate rect { wxPoint pos = rect.GetOrigin(); wxPoint end = rect.GetEnd(); RotatePoint( &pos, GetTextPos(), GetTextAngle() ); RotatePoint( &end, GetTextPos(), GetTextAngle() ); rect.SetOrigin( pos ); rect.SetEnd( end ); } rect.Normalize(); return rect; }
const EDA_RECT SCH_GLOBALLABEL::GetBoundingBox() const { int x, y, dx, dy, length, height; x = GetTextPos().x; y = GetTextPos().y; dx = dy = 0; int width = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); height = ( (GetTextHeight() * 15) / 10 ) + width + 2 * TXT_MARGIN; // text X size add height for triangular shapes(bidirectional) length = LenSize( GetShownText(), width ) + height + DANGLING_SYMBOL_SIZE; switch( GetLabelSpinStyle() ) // respect orientation { default: case 0: // Horiz Normal Orientation (left justified) dx = -length; dy = height; x += DANGLING_SYMBOL_SIZE; y -= height / 2; break; case 1: // Vert Orientation UP dx = height; dy = -length; x -= height / 2; y += DANGLING_SYMBOL_SIZE; break; case 2: // Horiz Orientation - Right justified dx = length; dy = height; x -= DANGLING_SYMBOL_SIZE; y -= height / 2; break; case 3: // Vert Orientation BOTTOM dx = height; dy = length; x -= height / 2; y -= DANGLING_SYMBOL_SIZE; break; } EDA_RECT box( wxPoint( x, y ), wxSize( dx, dy ) ); box.Normalize(); return box; }
void EDA_TEXT::Format( OUTPUTFORMATTER* aFormatter, int aNestLevel, int aControlBits ) const throw( IO_ERROR ) { #ifndef GERBVIEW // Gerbview does not use EDA_TEXT::Format // and does not define FMT_IU, used here // however this function should exist if( !IsDefaultFormatting() ) { aFormatter->Print( aNestLevel+1, "(effects" ); if( ( m_Size.x != Mils2iu( DEFAULT_SIZE_TEXT ) ) || ( m_Size.y != Mils2iu( DEFAULT_SIZE_TEXT ) ) || ( m_Thickness != 0 ) || m_Bold || m_Italic ) { aFormatter->Print( 0, " (font" ); // Add font support here at some point in the future. if( ( m_Size.x != Mils2iu( DEFAULT_SIZE_TEXT ) ) || ( m_Size.y != Mils2iu( DEFAULT_SIZE_TEXT ) ) ) aFormatter->Print( 0, " (size %s %s)", FMT_IU( m_Size.GetHeight() ).c_str(), FMT_IU( m_Size.GetWidth() ).c_str() ); if( m_Thickness != 0 ) aFormatter->Print( 0, " (thickness %s)", FMT_IU( GetThickness() ).c_str() ); if( m_Bold ) aFormatter->Print( 0, " bold" ); if( IsItalic() ) aFormatter->Print( 0, " italic" ); aFormatter->Print( 0, ")"); } if( m_Mirror || ( m_HJustify != GR_TEXT_HJUSTIFY_CENTER ) || ( m_VJustify != GR_TEXT_VJUSTIFY_CENTER ) ) { aFormatter->Print( 0, " (justify"); if( m_HJustify != GR_TEXT_HJUSTIFY_CENTER ) aFormatter->Print( 0, (m_HJustify == GR_TEXT_HJUSTIFY_LEFT) ? " left" : " right" ); if( m_VJustify != GR_TEXT_VJUSTIFY_CENTER ) aFormatter->Print( 0, (m_VJustify == GR_TEXT_VJUSTIFY_TOP) ? " top" : " bottom" ); if( m_Mirror ) aFormatter->Print( 0, " mirror" ); aFormatter->Print( 0, ")" ); } // As of now the only place this is used is in Eeschema to hide or show the text. if( m_Attributs ) aFormatter->Print( 0, " hide" ); aFormatter->Print( 0, ")\n" ); } #endif }
void TEXTE_PCB::GetMsgPanelInfo( EDA_UNITS_T aUnits, std::vector< MSG_PANEL_ITEM >& aList ) { wxString msg; wxCHECK_RET( m_Parent != NULL, wxT( "TEXTE_PCB::GetMsgPanelInfo() m_Parent is NULL." ) ); if( m_Parent->Type() == PCB_DIMENSION_T ) aList.push_back( MSG_PANEL_ITEM( _( "Dimension" ), GetShownText(), DARKGREEN ) ); else aList.push_back( MSG_PANEL_ITEM( _( "PCB Text" ), GetShownText(), DARKGREEN ) ); aList.push_back( MSG_PANEL_ITEM( _( "Layer" ), GetLayerName(), BLUE ) ); if( !IsMirrored() ) aList.push_back( MSG_PANEL_ITEM( _( "Mirror" ), _( "No" ), DARKGREEN ) ); else aList.push_back( MSG_PANEL_ITEM( _( "Mirror" ), _( "Yes" ), DARKGREEN ) ); msg.Printf( wxT( "%.1f" ), GetTextAngle() / 10.0 ); aList.push_back( MSG_PANEL_ITEM( _( "Angle" ), msg, DARKGREEN ) ); msg = MessageTextFromValue( aUnits, GetThickness() ); aList.push_back( MSG_PANEL_ITEM( _( "Thickness" ), msg, MAGENTA ) ); msg = MessageTextFromValue( aUnits, GetTextWidth() ); aList.push_back( MSG_PANEL_ITEM( _( "Width" ), msg, RED ) ); msg = MessageTextFromValue( aUnits, GetTextHeight() ); aList.push_back( MSG_PANEL_ITEM( _( "Height" ), msg, RED ) ); }
void SCH_TEXT::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset ) { COLOR4D color = GetLayerColor( m_Layer ); int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL; linewidth = Clamp_Text_PenSize( linewidth, GetTextSize(), IsBold() ); wxPoint text_offset = aOffset + GetSchematicTextOffset(); int savedWidth = GetThickness(); SetThickness( linewidth ); // Set the minimum width EDA_TEXT::Draw( clipbox, DC, text_offset, color, GR_DEFAULT_DRAWMODE ); SetThickness( savedWidth ); }
CDrawingObject* CSpeedLine::Duplicate() const { CSpeedLine *pNewObj = new CSpeedLine( GetColor(), GetThickness(), GetAlphaMax()); pNewObj->CopyParams(this); pNewObj->CopyVertices(this); return pNewObj; }
const EDA_RECT SCH_FIELD::GetBoundingBox() const { SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent; int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); // We must pass the effective text thickness to GetTextBox // when calculating the bounding box linewidth = Clamp_Text_PenSize( linewidth, GetTextSize(), IsBold() ); // 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 = GetTextPos() - origin; wxPoint begin = rect.GetOrigin() - origin; wxPoint end = rect.GetEnd() - origin; RotatePoint( &begin, pos, GetTextAngle() ); RotatePoint( &end, pos, GetTextAngle() ); // Due to the Y axis direction, we must mirror the bounding box, // relative to the text position: MIRROR( begin.y, pos.y ); MIRROR( 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 prefix::CLineRenderable::SetLine( const Moose::Math::CVector3<float> & vStartPos, const Moose::Math::CVector3<float> & vEndPos) { m_Vertices.GetPointer<float>(0)[0] = vStartPos[0]; m_Vertices.GetPointer<float>(0)[1] = vStartPos[1]; m_Vertices.GetPointer<float>(0)[2] = vStartPos[2]; m_Vertices.GetPointer<float>(1)[0] = vStartPos[0]; m_Vertices.GetPointer<float>(1)[1] = vStartPos[1]; m_Vertices.GetPointer<float>(1)[2] = vStartPos[2]; m_Vertices.GetPointer<float>(2)[0] = vEndPos[0]; m_Vertices.GetPointer<float>(2)[1] = vEndPos[1]; m_Vertices.GetPointer<float>(2)[2] = vEndPos[2]; m_Vertices.GetPointer<float>(3)[0] = vEndPos[0]; m_Vertices.GetPointer<float>(3)[1] = vEndPos[1]; m_Vertices.GetPointer<float>(3)[2] = vEndPos[2]; m_EndposThickness.GetPointer<float>()[0] = vEndPos[0]; m_EndposThickness.GetPointer<float>()[1] = vEndPos[1]; m_EndposThickness.GetPointer<float>()[2] = vEndPos[2]; m_EndposThickness.GetPointer<float>()[3] = GetThickness(); m_EndposThickness.GetPointer<float>()[4] = vEndPos[0]; m_EndposThickness.GetPointer<float>()[5] = vEndPos[1]; m_EndposThickness.GetPointer<float>()[6] = vEndPos[2]; m_EndposThickness.GetPointer<float>()[7] = -GetThickness(); m_EndposThickness.GetPointer<float>()[8] = vStartPos[0]; m_EndposThickness.GetPointer<float>()[9] = vStartPos[1]; m_EndposThickness.GetPointer<float>()[10] = vStartPos[2]; m_EndposThickness.GetPointer<float>()[11] = -GetThickness(); m_EndposThickness.GetPointer<float>()[12] = vStartPos[0]; m_EndposThickness.GetPointer<float>()[13] = vStartPos[1]; m_EndposThickness.GetPointer<float>()[14] = vStartPos[2]; m_EndposThickness.GetPointer<float>()[15] = GetThickness(); if ( m_Vertices.IsCached() ) m_Vertices.SetState(Moose::Core::CACHE_REFRESH); if ( m_EndposThickness.IsCached() ) m_EndposThickness.SetState(Moose::Core::CACHE_REFRESH); }
int CPolyLineDrawing::FindXYinLine(CPoint point) { int iter, threshold = 10; float lineSlope = 0; float yintersect = 0; CPoint point1, point2; for (iter = 0; iter < (int)vXYpoints.size() - 1; iter++) { point1 = vXYpoints[iter]; point2 = vXYpoints[iter + 1]; // Check if point is inside the straight vertical line segment if ((point1.x + point2.x - threshold < 2 * point.x) && (point1.x + point2.x + threshold > 2 * point.x) && // Same X axis ((point.y > point1.y && point.y < point2.y) || ((point.y < point1.y && point.y > point2.y)))) // Inside segment { return 1; } // Check if point is inside the straight horizontal line segment else if ((point1.y + point2.y - threshold < 2 * point.y) && (point1.y + point2.y + threshold > 2 * point.y) && // Same Y axis ((point.x > point1.x && point.x < point2.x) || ((point.x < point1.x && point.x > point2.x)))) // Inside segment { return 1; } // Check if point is inside the angled line segment else if (abs((point1.y - point.y)*(point1.x - point.x)) < abs((point1.y - point2.y)*(point1.x - point2.x))) { // Line slope lineSlope = ((float)point1.y - (float)point2.y) / ((float)point1.x - (float)point2.x); // Y intersect yintersect = point1.y - lineSlope * point1.x; // Point is in line or within threshold if ((point.y >= -threshold - GetThickness() + lineSlope * point.x + yintersect) && (point.y <= threshold + GetThickness() + lineSlope * point.x + yintersect)) { return 1; } } } return 0; }
void TEXTE_PCB::TransformShapeWithClearanceToPolygonSet( SHAPE_POLY_SET& aCornerBuffer, int aClearanceValue, int aCircleToSegmentsCount, double aCorrectionFactor ) const { wxSize size = GetSize(); if( IsMirrored() ) size.x = -size.x; s_cornerBuffer = &aCornerBuffer; s_textWidth = GetThickness() + ( 2 * aClearanceValue ); s_textCircle2SegmentCount = aCircleToSegmentsCount; EDA_COLOR_T color = BLACK; // not actually used, but needed by DrawGraphicText if( IsMultilineAllowed() ) { wxArrayString strings_list; wxStringSplit( GetShownText(), strings_list, '\n' ); std::vector<wxPoint> positions; positions.reserve( strings_list.Count() ); GetPositionsOfLinesOfMultilineText( positions, strings_list.Count() ); for( unsigned ii = 0; ii < strings_list.Count(); ii++ ) { wxString txt = strings_list.Item( ii ); DrawGraphicText( NULL, NULL, positions[ii], color, txt, GetOrientation(), size, GetHorizJustify(), GetVertJustify(), GetThickness(), IsItalic(), true, addTextSegmToPoly ); } } else { DrawGraphicText( NULL, NULL, GetTextPosition(), color, GetShownText(), GetOrientation(), size, GetHorizJustify(), GetVertJustify(), GetThickness(), IsItalic(), true, addTextSegmToPoly ); } }
void LIB_TEXT::GetMsgPanelInfo( MSG_PANEL_ITEMS& aList ) { wxString msg; LIB_ITEM::GetMsgPanelInfo( aList ); msg = StringFromValue( g_UserUnit, GetThickness(), true ); aList.push_back( MSG_PANEL_ITEM( _( "Line Width" ), msg, BLUE ) ); }
void SCH_GLOBALLABEL::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& aOffset ) { static std::vector <wxPoint> Poly; COLOR4D color = GetLayerColor( m_Layer ); wxPoint text_offset = aOffset + GetSchematicTextOffset(); int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); linewidth = Clamp_Text_PenSize( linewidth, GetTextSize(), IsBold() ); int save_width = GetThickness(); SetThickness( linewidth ); EDA_RECT* clipbox = panel? panel->GetClipBox() : NULL; EDA_TEXT::Draw( clipbox, DC, text_offset, color, GR_DEFAULT_DRAWMODE ); SetThickness( save_width ); // restore initial value CreateGraphicShape( Poly, GetTextPos() + aOffset ); GRPoly( clipbox, DC, Poly.size(), &Poly[0], 0, linewidth, color, color ); }
// see class_text_mod.h void TEXTE_MODULE::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) { MODULE* module = (MODULE*) m_Parent; if( module == NULL ) // Happens in modedit, and for new texts return; wxString msg, Line; static const wxString text_type_msg[3] = { _( "Ref." ), _( "Value" ), _( "Text" ) }; Line = module->GetReference(); aList.push_back( MSG_PANEL_ITEM( _( "Footprint" ), Line, DARKCYAN ) ); Line = GetShownText(); aList.push_back( MSG_PANEL_ITEM( _( "Text" ), Line, BROWN ) ); wxASSERT( m_Type >= TEXT_is_REFERENCE && m_Type <= TEXT_is_DIVERS ); aList.push_back( MSG_PANEL_ITEM( _( "Type" ), text_type_msg[m_Type], DARKGREEN ) ); if( !IsVisible() ) msg = _( "No" ); else msg = _( "Yes" ); aList.push_back( MSG_PANEL_ITEM( _( "Display" ), msg, DARKGREEN ) ); // Display text layer aList.push_back( MSG_PANEL_ITEM( _( "Layer" ), GetLayerName(), DARKGREEN ) ); if( IsMirrored() ) msg = _( "Yes" ); else msg = _( "No" ); aList.push_back( MSG_PANEL_ITEM( _( "Mirror" ), msg, DARKGREEN ) ); msg.Printf( wxT( "%.1f" ), GetTextAngleDegrees() ); aList.push_back( MSG_PANEL_ITEM( _( "Angle" ), msg, DARKGREEN ) ); msg = ::CoordinateToString( GetThickness() ); aList.push_back( MSG_PANEL_ITEM( _( "Thickness" ), msg, DARKGREEN ) ); msg = ::CoordinateToString( GetTextWidth() ); aList.push_back( MSG_PANEL_ITEM( _( "Width" ), msg, RED ) ); msg = ::CoordinateToString( GetTextHeight() ); aList.push_back( MSG_PANEL_ITEM( _( "Height" ), msg, RED ) ); }
const EDA_RECT SCH_LABEL::GetBoundingBox() const { int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); EDA_RECT rect = GetTextBox( -1, linewidth ); if( GetTextAngle() != 0.0 ) { // Rotate rect wxPoint pos = rect.GetOrigin(); wxPoint end = rect.GetEnd(); RotatePoint( &pos, GetTextPos(), GetTextAngle() ); RotatePoint( &end, GetTextPos(), GetTextAngle() ); rect.SetOrigin( pos ); rect.SetEnd( end ); rect.Normalize(); } return rect; }
void EDA_TEXT::TransformTextShapeToSegmentList( std::vector<wxPoint>& aCornerBuffer ) const { wxSize size = GetSize(); if( IsMirrored() ) NEGATE( size.x ); s_cornerBuffer = &aCornerBuffer; EDA_COLOR_T color = BLACK; // not actually used, but needed by DrawGraphicText if( IsMultilineAllowed() ) { wxArrayString* list = wxStringSplit( GetText(), '\n' ); std::vector<wxPoint> positions; positions.reserve( list->Count() ); GetPositionsOfLinesOfMultilineText( positions, list->Count() ); for( unsigned ii = 0; ii < list->Count(); ii++ ) { wxString txt = list->Item( ii ); DrawGraphicText( NULL, NULL, positions[ii], color, txt, GetOrientation(), size, GetHorizJustify(), GetVertJustify(), GetThickness(), IsItalic(), true, addTextSegmToBuffer ); } delete list; } else { DrawGraphicText( NULL, NULL, GetTextPosition(), color, GetText(), GetOrientation(), size, GetHorizJustify(), GetVertJustify(), GetThickness(), IsItalic(), true, addTextSegmToBuffer ); } }
void CPolyLineDrawing::Draw(CDC& dc) { CPen pen(PS_SOLID, GetThickness(), GetLineColor()); dc.SelectObject(pen); int iter; for (iter = 0; iter < (int)vXYpoints.size() - 1; iter++) { // Starting pt, first xy value in the vector dc.MoveTo(vXYpoints[iter].x, vXYpoints[iter].y); // Ending pt, second xy value in the vector dc.LineTo(vXYpoints[iter + 1].x, vXYpoints[iter + 1].y); } }
void SCH_TEXT::Plot( PLOTTER* aPlotter ) { static std::vector <wxPoint> Poly; COLOR4D color = GetLayerColor( GetLayer() ); int tmp = GetThickness(); int thickness = GetPenSize(); // Two thicknesses are set here: // The first is for EDA_TEXT, which controls the interline spacing based on text thickness // The second is for the output that sets the actual stroke size SetThickness( thickness ); aPlotter->SetCurrentLineWidth( thickness ); if( IsMultilineAllowed() ) { std::vector<wxPoint> positions; wxArrayString strings_list; wxStringSplit( GetShownText(), strings_list, '\n' ); positions.reserve( strings_list.Count() ); GetPositionsOfLinesOfMultilineText(positions, (int) strings_list.Count() ); for( unsigned ii = 0; ii < strings_list.Count(); ii++ ) { wxPoint textpos = positions[ii] + GetSchematicTextOffset(); wxString& txt = strings_list.Item( ii ); aPlotter->Text( textpos, color, txt, GetTextAngle(), GetTextSize(), GetHorizJustify(), GetVertJustify(), thickness, IsItalic(), IsBold() ); } } else { wxPoint textpos = GetTextPos() + GetSchematicTextOffset(); aPlotter->Text( textpos, color, GetShownText(), GetTextAngle(), GetTextSize(), GetHorizJustify(), GetVertJustify(), thickness, IsItalic(), IsBold() ); } // Draw graphic symbol for global or hierarchical labels CreateGraphicShape( Poly, GetTextPos() ); aPlotter->SetCurrentLineWidth( GetPenSize() ); if( Poly.size() ) aPlotter->PlotPoly( Poly, NO_FILL ); SetThickness( tmp ); }
wxPoint SCH_GLOBALLABEL::GetSchematicTextOffset() const { wxPoint text_offset; int width = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); width = Clamp_Text_PenSize( width, GetTextSize(), IsBold() ); int halfSize = GetTextWidth() / 2; int offset = width; switch( m_shape ) { case NET_INPUT: case NET_BIDI: case NET_TRISTATE: offset += halfSize; break; case NET_OUTPUT: case NET_UNSPECIFIED: offset += TXT_MARGIN; break; default: break; } switch( GetLabelSpinStyle() ) { default: case 0: text_offset.x -= offset; break; // Orientation horiz normal case 1: text_offset.y -= offset; break; // Orientation vert UP case 2: text_offset.x += offset; break; // Orientation horiz inverse case 3: text_offset.y += offset; break; // Orientation vert BOTTOM } return text_offset; }
CString CDrawingObject::getStyleString(float fLineWidthFactor) const { CString style; const floatColor& color = GetColor(); if (IsSolid() && !DrawStippled()) { style.Format(_T("\"fill:%s;stroke:none\""), color.GetHexString()); } else { style.Format(_T("\"fill:none;stroke:%s;stroke-width:%f\""), color.GetHexString(), GetThickness()/fLineWidthFactor); } return style; }
int LIB_TEXT::GetPenSize() const { int pensize = GetThickness(); if( pensize == 0 ) // Use default values for pen size { if( IsBold() ) pensize = GetPenSizeForBold( GetTextWidth() ); else pensize = GetDefaultLineThickness(); } // Clip pen size for small texts: pensize = Clamp_Text_PenSize( pensize, GetTextSize(), IsBold() ); return pensize; }
wxPoint SCH_HIERLABEL::GetSchematicTextOffset() const { wxPoint text_offset; int width = std::max( GetThickness(), GetDefaultLineThickness() ); int ii = GetTextWidth() + TXT_MARGIN + width; switch( GetLabelSpinStyle() ) { default: case 0: text_offset.x = -ii; break; // Orientation horiz normale case 1: text_offset.y = -ii; break; // Orientation vert UP case 2: text_offset.x = ii; break; // Orientation horiz inverse case 3: text_offset.y = ii; break; // Orientation vert BOTTOM } return text_offset; }
FX_BOOL CXFA_Stroke::SameStyles(CXFA_Stroke stroke, uint32_t dwFlags) const { if (m_pNode == stroke.GetNode()) return TRUE; if (FXSYS_fabs(GetThickness() - stroke.GetThickness()) >= 0.01f) return FALSE; if ((dwFlags & XFA_STROKE_SAMESTYLE_NoPresence) == 0 && IsVisible() != stroke.IsVisible()) { return FALSE; } if (GetStrokeType() != stroke.GetStrokeType()) return FALSE; if (GetColor() != stroke.GetColor()) return FALSE; if ((dwFlags & XFA_STROKE_SAMESTYLE_Corner) != 0 && FXSYS_fabs(GetRadius() - stroke.GetRadius()) >= 0.01f) { return FALSE; } return TRUE; }
/* Calculate Stiffness Matrix */ void Interface2D::Stiffness(int np) { double fn[MaxElNd],temp,asr; Vector xi; // Load nodal coordinates (ce[]) and material props (pr.C[][]) GetProperties(np); // Zero stiffness (se[][]) and reaction (re[]) ZeroUpperHalfStiffness(); // basic parameters */ MaterialBase *matl=theMaterials[material-1]; double Dn=matl->pr.C[1][1]; double Dt=matl->pr.C[1][2]; double xpxi=(ce[2].x-ce[1].x)/2; double ypxi=(ce[2].y-ce[1].y)/2; double dlxi=sqrt(xpxi*xpxi + ypxi*ypxi); int i; for(i=0;i<GAUSS_INT_PTS;i++) { // get shape function at next xi xi.x=gxi[i]; ShapeFunction(&xi,FALSE,&fn[1],NULL,NULL,&ce[1],NULL,&asr,NULL); // total weight if(np!=AXI_SYM) temp=gwt[i]*GetThickness(); else temp=gwt[i]*asr; // stiffness matrix is force per radian, hence no 2 pi // increment all stiffness elements at this point IncrementStiffnessElements(temp,fn,xpxi,ypxi,dlxi,Dn,Dt); } // Fill in lower half of stiffness matrix FillLowerHalfStiffness(); }
void CRectTool::onMouseMove(CPoint point, CLog * pLog) { if (downClickActive) { //AfxMessageBox(_T("MouseMove from LineTool")); endpt = point; // Create new Drawing if (firstMouseMove) { pLineDrawing = new CRectDrawing(GetThickness(), GetLineColor(), GetFillColor(), startpt); pLineDrawing->setEndpt(endpt); // Add drawing to Log pLog->Append(pLineDrawing); firstMouseMove = 0; } else // Modify existing Drawing { pLineDrawing->setEndpt(endpt); } } }
void CDrawingObject::Draw() { glLineWidth(GetThickness()); glColor4fv(GetColorGL()); }
void SCH_FIELD::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, GR_DRAWMODE aDrawMode, COLOR4D aColor ) { int orient; COLOR4D color; wxPoint textpos; SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent; int lineWidth = GetThickness(); if( lineWidth == 0 ) // Use default values for pen size { if( IsBold() ) lineWidth = GetPenSizeForBold( GetTextWidth() ); else lineWidth = GetDefaultLineThickness(); } // Clip pen size for small texts: lineWidth = Clamp_Text_PenSize( lineWidth, GetTextSize(), IsBold() ); if( ( !IsVisible() && !m_forceVisible) || IsVoid() ) return; GRSetDrawMode( aDC, aDrawMode ); // Calculate the text orientation according to the component orientation. orient = GetTextAngle(); if( parentComponent->GetTransform().y1 ) // Rotate component 90 degrees. { if( orient == TEXT_ANGLE_HORIZ ) orient = TEXT_ANGLE_VERT; else orient = TEXT_ANGLE_HORIZ; } /* Calculate the text justification, according to the component * orientation/mirror this is a bit complicated due to cumulative * calculations: * - numerous cases (mirrored or not, rotation) * - the DrawGraphicText function recalculate also H and H justifications * according to the text orientation. * - When a component is mirrored, the text is not mirrored and * justifications are complicated to calculate * so the more easily way is to use no justifications ( Centered text ) * and use GetBoundaryBox to know the text coordinate considered as centered */ EDA_RECT boundaryBox = GetBoundingBox(); textpos = boundaryBox.Centre() + aOffset; if( m_forceVisible ) { color = COLOR4D( DARKGRAY ); } else { if( m_id == REFERENCE ) color = GetLayerColor( LAYER_REFERENCEPART ); else if( m_id == VALUE ) color = GetLayerColor( LAYER_VALUEPART ); else color = GetLayerColor( LAYER_FIELDS ); } EDA_RECT* clipbox = aPanel ? aPanel->GetClipBox() : NULL; DrawGraphicText( clipbox, aDC, textpos, color, GetFullyQualifiedText(), orient, GetTextSize(), GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, lineWidth, IsItalic(), IsBold() ); // While moving: don't loose visual contact to which component this label belongs. if ( IsWireImage() ) { const wxPoint origin = parentComponent->GetPosition(); textpos = GetTextPos() - origin; textpos = parentComponent->GetScreenCoord( textpos ); textpos += parentComponent->GetPosition(); GRLine( clipbox, aDC, origin, textpos, 2, DARKGRAY ); } /* Enable this to draw the bounding box around the text field to validate * the bounding box calculations. */ #if 0 // Draw boundary box: GRRect( aPanel->GetClipBox(), aDC, boundaryBox, 0, BROWN ); // Draw the text anchor point /* Calculate the text position, according to the component * orientation/mirror */ textpos = m_Pos - parentComponent->GetPosition(); textpos = parentComponent->GetScreenCoord( textpos ); textpos += parentComponent->GetPosition(); const int len = 10; GRLine( clipbox, aDC, textpos.x - len, textpos.y, textpos.x + len, textpos.y, 0, BLUE ); GRLine( clipbox, aDC, textpos.x, textpos.y - len, textpos.x, textpos.y + len, 0, BLUE ); #endif }
void TEXTE_MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aOffset ) { if( aPanel == NULL ) return; /* parent must *not* be NULL (a footprint text without a footprint parent has no sense) */ wxASSERT( m_Parent ); BOARD* brd = GetBoard( ); auto frame = static_cast<PCB_BASE_FRAME*> ( aPanel->GetParent() ); auto color = frame->Settings().Colors().GetLayerColor( GetLayer() ); PCB_LAYER_ID text_layer = GetLayer(); if( !brd->IsLayerVisible( m_Layer ) || ( IsFrontLayer( text_layer ) && !brd->IsElementVisible( LAYER_MOD_TEXT_FR ) ) || ( IsBackLayer( text_layer ) && !brd->IsElementVisible( LAYER_MOD_TEXT_BK ) ) ) return; if( !brd->IsElementVisible( LAYER_MOD_REFERENCES ) && GetText() == wxT( "%R" ) ) return; if( !brd->IsElementVisible( LAYER_MOD_VALUES ) && GetText() == wxT( "%V" ) ) return; // Invisible texts are still drawn (not plotted) in LAYER_MOD_TEXT_INVISIBLE // Just because we must have to edit them (at least to make them visible) if( !IsVisible() ) { if( !brd->IsElementVisible( LAYER_MOD_TEXT_INVISIBLE ) ) return; color = frame->Settings().Colors().GetItemColor( LAYER_MOD_TEXT_INVISIBLE ); } auto displ_opts = (PCB_DISPLAY_OPTIONS*)( aPanel->GetDisplayOptions() ); // shade text if high contrast mode is active if( ( aDrawMode & GR_ALLOW_HIGHCONTRAST ) && displ_opts && displ_opts->m_ContrastModeDisplay ) { PCB_LAYER_ID curr_layer = ( (PCB_SCREEN*) aPanel->GetScreen() )->m_Active_Layer; if( !IsOnLayer( curr_layer ) ) color = COLOR4D( DARKDARKGRAY ); } // Draw mode compensation for the width int width = GetThickness(); if( displ_opts && displ_opts->m_DisplayModTextFill == SKETCH ) width = -width; GRSetDrawMode( aDC, aDrawMode ); wxPoint pos = GetTextPos() - aOffset; // Draw the text anchor point if( brd->IsElementVisible( LAYER_ANCHOR ) ) { COLOR4D anchor_color = frame->Settings().Colors().GetItemColor( LAYER_ANCHOR ); GRDrawAnchor( aPanel->GetClipBox(), aDC, pos.x, pos.y, DIM_ANCRE_TEXTE, anchor_color ); } // Draw the text proper, with the right attributes wxSize size = GetTextSize(); double orient = GetDrawRotation(); // If the text is mirrored : negate size.x (mirror / Y axis) if( IsMirrored() ) size.x = -size.x; DrawGraphicText( aPanel->GetClipBox(), aDC, pos, color, GetShownText(), orient, size, GetHorizJustify(), GetVertJustify(), width, IsItalic(), IsBold() ); // Enable these line to draw the bounding box (debug test purpose only) #if 0 { EDA_RECT BoundaryBox = GetBoundingBox(); GRRect( aPanel->GetClipBox(), aDC, BoundaryBox, 0, BROWN ); } #endif }
void SCH_GLOBALLABEL::CreateGraphicShape( std::vector <wxPoint>& aPoints, const wxPoint& Pos ) { int halfSize = GetTextHeight() / 2; int linewidth = GetThickness() == 0 ? GetDefaultLineThickness() : GetThickness(); linewidth = Clamp_Text_PenSize( linewidth, GetTextSize(), IsBold() ); aPoints.clear(); int symb_len = LenSize( GetShownText(), linewidth ) + ( TXT_MARGIN * 2 ); // Create outline shape : 6 points int x = symb_len + linewidth + 3; // Use negation bar Y position to calculate full vertical size // Search for overbar symbol bool hasOverBar = false; for( unsigned ii = 1; ii < m_Text.size(); ii++ ) { if( m_Text[ii-1] == '~' && m_Text[ii] != '~' ) { hasOverBar = true; break; } } #define Y_CORRECTION 1.40 // Note: this factor is due to the fact the Y size of a few letters like [ // are bigger than the y size value, and we need a margin for the graphic symbol. int y = KiROUND( halfSize * Y_CORRECTION ); // Note: this factor is due to the fact we need a margin for the graphic symbol. #define Y_OVERBAR_CORRECTION 1.2 if( hasOverBar ) y = KiROUND( KIGFX::STROKE_FONT::GetInterline( halfSize, linewidth ) * Y_OVERBAR_CORRECTION ); // Gives room for line thickess and margin y += linewidth // for line thickess + linewidth/2; // for margin // Starting point(anchor) aPoints.push_back( wxPoint( 0, 0 ) ); aPoints.push_back( wxPoint( 0, -y ) ); // Up aPoints.push_back( wxPoint( -x, -y ) ); // left aPoints.push_back( wxPoint( -x, 0 ) ); // Up left aPoints.push_back( wxPoint( -x, y ) ); // left down aPoints.push_back( wxPoint( 0, y ) ); // down int x_offset = 0; switch( m_shape ) { case NET_INPUT: x_offset = -halfSize; aPoints[0].x += halfSize; break; case NET_OUTPUT: aPoints[3].x -= halfSize; break; case NET_BIDI: case NET_TRISTATE: x_offset = -halfSize; aPoints[0].x += halfSize; aPoints[3].x -= halfSize; break; case NET_UNSPECIFIED: default: break; } int angle = 0; switch( GetLabelSpinStyle() ) { default: case 0: break; // Orientation horiz normal case 1: angle = -900; break; // Orientation vert UP case 2: angle = 1800; break; // Orientation horiz inverse case 3: angle = 900; break; // Orientation vert BOTTOM } // Rotate outlines and move corners in real position for( wxPoint& aPoint : aPoints ) { aPoint.x += x_offset; if( angle ) RotatePoint( &aPoint, angle ); aPoint += Pos; } aPoints.push_back( aPoints[0] ); // closing }