//==== Insert Wing Sect ====// void WingGeom::SplitWingSect( int index ) { WingSect* ws = GetWingSect( index ); if ( ws ) { double span = ws->m_Span(); double rc = ws->m_RootChord(); double ac = ws->m_AvgChord(); double tc = ws->m_TipChord(); double twist = 0.5*ws->m_Twist(); int curve_type = ws->GetXSecCurve()->GetType(); string ins_id = m_XSecSurf.InsertXSec( curve_type, index ); ws->ForceSpanRcTc( span*0.5, rc, ac ); ws->m_Twist = twist; ws->Update(); XSec* xs = m_XSecSurf.FindXSec( ins_id ); if ( xs ) { WingSect* ins_ws = dynamic_cast< WingSect* >(xs); ins_ws->CopyFrom( ws ); ins_ws->ForceSpanRcTc( span*0.5, ac, tc ); ins_ws->m_Twist = twist; ins_ws->Update(); } } }
//==== Update Wing And Cross Section Placement ====// void WingGeom::UpdateSurf() { //==== Check If Total Span/Chord/Area Has Changed ====// bool total_change_flag = false; if ( UpdatedParm( m_TotalSpan.GetID() ) ) { UpdateTotalSpan(); total_change_flag = true; } if ( UpdatedParm( m_TotalProjSpan.GetID() ) ) { UpdateTotalProjSpan(); total_change_flag = true; } if ( UpdatedParm( m_TotalChord.GetID() ) ) { UpdateTotalChord(); total_change_flag = true; } if ( UpdatedParm( m_TotalArea.GetID() ) ) { UpdateTotalArea(); total_change_flag = true; } int active_sect = GetActiveXSecIndex(); // Save Active Section //==== Set Temp Active XSec Based On Updated Parms ====// if ( total_change_flag ) SetActiveXSecIndex(1); else SetTempActiveXSec(); //==== Make Sure Chord Match For Adjacent Wing Sections ====// MatchWingSections(); SetActiveXSecIndex(active_sect); // Restore Active Section // clear the u tessellation vector m_TessUVec.clear(); vector< VspCurve > crv_vec( m_XSecSurf.NumXSec() ); //==== Compute Parameters For Each Section ====// double total_span = 0.0; double total_sweep_offset = 0.0; double total_dihed_offset = 0.0; double total_twist = 0.0; //==== Load End Points for Each Section ====// for ( int i = 0 ; i < m_XSecSurf.NumXSec() ; i++ ) { WingSect* ws = ( WingSect* ) m_XSecSurf.FindXSec( i ); if ( ws ) { //==== Reset Group Names ====// ws->SetGroupDisplaySuffix( i ); double rad = ws->m_Span(); double ty = rad*cos(GetSumDihedral(i)*DEG_2_RAD); double tz = rad*sin(GetSumDihedral(i)*DEG_2_RAD); double tan_le = ws->GetTanSweepAt( ws->m_Sweep(), 0.0 ); double toff = tan_le*rad; // Tip X Offset if ( i == 0 ) { ty = 0; tz = 0; toff = 0; } total_dihed_offset += tz; total_span += ty; total_sweep_offset += toff; if ( m_RelativeTwistFlag() ) total_twist += ws->m_Twist(); else total_twist = ws->m_Twist(); ws->SetProjectedSpan( ty ); //==== Find Width Parm ====// string width_id = ws->GetXSecCurve()->GetWidthParmID(); Parm* width_parm = ParmMgr.FindParm( width_id ); if ( width_parm ) { width_parm->Deactivate(); width_parm->Set( ws->m_TipChord() ); } double dihead_rot = 0.0; if ( m_RotateAirfoilMatchDiedralFlag() ) { if ( i == 0 ) { dihead_rot = GetSumDihedral( i+1 ); } else if ( i == m_XSecSurf.NumXSec()-1 ) { dihead_rot = GetSumDihedral( i ); } else { dihead_rot = 0.5*( GetSumDihedral( i ) + GetSumDihedral( i+1 ) ); } } //==== Load Transformations =====// ws->m_YDelta = total_span; ws->m_XDelta = total_sweep_offset; ws->m_ZDelta = total_dihed_offset; ws->m_YRotate = total_twist; ws->m_XRotate = dihead_rot; ws->m_XCenterRot = ws->m_XDelta + ws->m_TwistLoc()*ws->m_TipChord(); ws->m_YCenterRot = ws->m_YDelta; ws->m_ZCenterRot = ws->m_ZDelta; crv_vec[i] = ws->GetCurve(); if ( i > 0 ) { m_TessUVec.push_back( ws->m_SectTessU() ); } } } m_MainSurfVec[0].SkinC0( crv_vec, false ); if ( m_XSecSurf.GetFlipUD() ) { m_MainSurfVec[0].FlipNormal(); } m_MainSurfVec[0].SetSurfType( vsp::WING_SURF ); //==== Load Totals ====// m_TotalSpan = ComputeTotalSpan(); m_TotalProjSpan = ComputeTotalProjSpan(); m_TotalChord = ComputeTotalChord(); m_TotalArea = ComputeTotalArea(); }