//==== Update Fuselage And Cross Section Placement ====// void StackGeom::UpdateSurf() { m_TessUVec.clear(); int nxsec = m_XSecSurf.NumXSec(); if ( m_OrderPolicy() == STACK_LOOP ) { StackXSec* first_xs = (StackXSec*) m_XSecSurf.FindXSec( 0 ); StackXSec* last_xs = (StackXSec*) m_XSecSurf.FindXSec( nxsec - 1 ); if ( first_xs && last_xs ) { if ( last_xs->GetXSecCurve()->GetType() != first_xs->GetXSecCurve()->GetType() ) { m_XSecSurf.ChangeXSecShape( nxsec - 1, first_xs->GetXSecCurve()->GetType() ); last_xs = (StackXSec*) m_XSecSurf.FindXSec( nxsec - 1 ); } if( last_xs ) { last_xs->GetXSecCurve()->CopyFrom( first_xs->GetXSecCurve() ); } } } //==== Cross Section Curves & joint info ====// vector< rib_data_type > rib_vec; rib_vec.resize( nxsec ); //==== Update XSec Location/Rotation ====// for ( int i = 0 ; i < nxsec ; i++ ) { StackXSec* xs = ( StackXSec* ) m_XSecSurf.FindXSec( i ); if ( xs ) { EnforceOrder( xs, i, m_OrderPolicy() ); bool first = false; bool last = false; if( i == 0 ) first = true; else if( i == (nxsec-1) ) last = true; //==== Reset Group Names ====// xs->SetGroupDisplaySuffix( i ); rib_vec[i] = xs->GetRib( first, last ); if ( i > 0 ) { m_TessUVec.push_back( xs->m_SectTessU() ); } } } m_MainSurfVec[0].SkinRibs( rib_vec, false ); m_MainSurfVec[0].SetMagicVParm( false ); for ( int i = 0 ; i < nxsec ; i++ ) { StackXSec* xs = ( StackXSec* ) m_XSecSurf.FindXSec( i ); if ( xs ) { xs->SetUnsetParms( i, m_MainSurfVec[0] ); } } if ( m_XSecSurf.GetFlipUD() ) { m_MainSurfVec[0].FlipNormal(); } }
//==== Constructor ====// StackGeom::StackGeom( Vehicle* vehicle_ptr ) : GeomXSec( vehicle_ptr ) { m_Name = "StackGeom"; m_Type.m_Name = "Stack"; m_Type.m_Type = STACK_GEOM_TYPE; m_Closed = false; m_XSecSurf.SetParentContainer( GetID() ); m_XSecSurf.SetBasicOrientation( X_DIR, Y_DIR, XS_SHIFT_MID, false ); m_OrderPolicy.Init( "OrderPolicy", "Design", this, STACK_FREE, STACK_FREE, NUM_STACK_POLICY - 1 ); m_OrderPolicy.SetDescript( "XSec ordering policy for stack" ); //==== Init Parms ====// m_TessU = 16; m_TessW = 17; m_TessW.SetMultShift( 8, 1 ); m_ActiveXSec = 0; m_XSecSurf.SetXSecType( XSEC_STACK ); m_XSecSurf.AddXSec( XS_POINT ); m_XSecSurf.AddXSec( XS_ELLIPSE ); m_XSecSurf.AddXSec( XS_ELLIPSE ); m_XSecSurf.AddXSec( XS_ELLIPSE ); m_XSecSurf.AddXSec( XS_POINT ); int j; StackXSec* xs; j = 0; xs = ( StackXSec* ) m_XSecSurf.FindXSec( j ); xs->SetGroupDisplaySuffix( j ); xs->m_XDelta = 0.0; xs->m_TopLAngle = 45.0; xs->m_TopLStrength = 0.75; xs->m_RightLAngle = 45.0; xs->m_RightLStrength = 0.75; ++j; xs = ( StackXSec* ) m_XSecSurf.FindXSec( j ); xs->SetGroupDisplaySuffix( j ); xs->m_XDelta = 1.0; dynamic_cast<EllipseXSec *>( xs->GetXSecCurve() )->SetWidthHeight( 3.0, 2.5 ); ++j; xs = ( StackXSec* ) m_XSecSurf.FindXSec( j ); xs->SetGroupDisplaySuffix( j ); xs->m_XDelta = 2.0; dynamic_cast<EllipseXSec *>( xs->GetXSecCurve() )->SetWidthHeight( 3.0, 2.5 ); ++j; xs = ( StackXSec* ) m_XSecSurf.FindXSec( j ); xs->SetGroupDisplaySuffix( j ); xs->m_XDelta = 1.0; dynamic_cast<EllipseXSec *>( xs->GetXSecCurve() )->SetWidthHeight( 3.0, 2.5 ); ++j; xs = ( StackXSec* ) m_XSecSurf.FindXSec( j ); xs->SetGroupDisplaySuffix( j ); xs->m_XDelta = 0.5; xs->m_TopLAngle = -45.0; xs->m_TopLStrength = 0.75; xs->m_RightLAngle = -45.0; xs->m_RightLStrength = 0.75; }