//==== 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(); } }
void StackGeom::EnforceOrder( StackXSec* xs, int indx, int policy ) { int nxsec = m_XSecSurf.NumXSec(); bool first = false; bool last = false; bool nextlast = false; if( indx == 0 ) first = true; else if( indx == (nxsec-1) ) last = true; else if( indx == (nxsec-2) ) nextlast = true; // STACK_FREE implicit. if ( first ) { xs->m_XDelta.SetLowerUpperLimits( 0.0, 0.0 ); xs->m_YDelta.SetLowerUpperLimits( 0.0, 0.0 ); xs->m_ZDelta.SetLowerUpperLimits( 0.0, 0.0 ); xs->m_XRotate.SetLowerUpperLimits( 0.0, 0.0 ); xs->m_YRotate.SetLowerUpperLimits( 0.0, 0.0 ); xs->m_ZRotate.SetLowerUpperLimits( 0.0, 0.0 ); } else { xs->m_XDelta.SetLowerUpperLimits( -1.0e12, 1.0e12 ); xs->m_YDelta.SetLowerUpperLimits( -1.0e12, 1.0e12 ); xs->m_ZDelta.SetLowerUpperLimits( -1.0e12, 1.0e12 ); xs->m_XRotate.SetLowerUpperLimits( -180.0, 180.0 ); xs->m_YRotate.SetLowerUpperLimits( -180.0, 180.0 ); xs->m_ZRotate.SetLowerUpperLimits( -180.0, 180.0 ); } if( policy == STACK_LOOP ) { if ( last ) { StackXSec* prevxs = (StackXSec*) m_XSecSurf.FindXSec( indx - 1); if( prevxs ) { Matrix4d prevxform; prevxform.loadIdentity(); prevxform.matMult( prevxs->GetTransform()->data() ); prevxform.affineInverse(); vec3d offset = prevxform.xform( vec3d( 0.0, 0.0, 0.0 ) ); xs->m_XDelta.SetLowerUpperLimits( offset.x(), offset.x() ); xs->m_YDelta.SetLowerUpperLimits( offset.y(), offset.y() ); xs->m_ZDelta.SetLowerUpperLimits( offset.z(), offset.z() ); xs->m_XDelta.Set( offset.x() ); xs->m_YDelta.Set( offset.y() ); xs->m_ZDelta.Set( offset.z() ); vec3d angle = prevxform.getAngles(); xs->m_XRotate.SetLowerUpperLimits( angle.x(), angle.x() ); xs->m_YRotate.SetLowerUpperLimits( angle.y(), angle.y() ); xs->m_ZRotate.SetLowerUpperLimits( angle.z(), angle.z() ); xs->m_XRotate.Set( angle.x() ); xs->m_YRotate.Set( angle.y() ); xs->m_ZRotate.Set( angle.z() ); } } } }
//==== 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; }
void StackGeom::AddDefaultSources( double base_len ) { switch ( m_OrderPolicy() ) { case STACK_FREE: { StackXSec* lastxs = (StackXSec*) m_XSecSurf.FindXSec( m_XSecSurf.NumXSec() - 1); if( lastxs ) { Matrix4d prevxform; prevxform.loadIdentity(); prevxform.matMult( lastxs->GetTransform()->data() ); prevxform.affineInverse(); vec3d offset = prevxform.xform( vec3d( 0.0, 0.0, 0.0 ) ); double len = offset.mag(); AddDefaultSourcesXSec( base_len, len, 0 ); AddDefaultSourcesXSec( base_len, len, m_XSecSurf.NumXSec() - 1 ); } break; } case STACK_LOOP: { int iback = -1; double dfront = -1.0; for ( int i = 0 ; i < m_XSecSurf.NumXSec() ; i++ ) { StackXSec* xs = ( StackXSec* ) m_XSecSurf.FindXSec( i ); if ( xs ) { Matrix4d prevxform; prevxform.loadIdentity(); prevxform.matMult( xs->GetTransform()->data() ); prevxform.affineInverse(); vec3d offset = prevxform.xform( vec3d( 0.0, 0.0, 0.0 ) ); double len = offset.mag(); if ( len > dfront ) { dfront = len; iback = i; } } } AddDefaultSourcesXSec( base_len, dfront, 0 ); if ( iback >= 0 ) { AddDefaultSourcesXSec( base_len, dfront, iback ); } break; } } }
//==== Update Pod Screen ====// bool StackScreen::Update() { assert( m_ScreenMgr ); Geom* geom_ptr = m_ScreenMgr->GetCurrGeom(); if ( !geom_ptr || geom_ptr->GetType().m_Type != STACK_GEOM_TYPE ) { Hide(); return false; } SkinScreen::Update(); m_NumUSlider.Deactivate(); StackGeom* stackgeom_ptr = dynamic_cast< StackGeom* >( geom_ptr ); assert( stackgeom_ptr ); m_DesignPolicyChoice.Update( stackgeom_ptr->m_OrderPolicy.GetID() ); //==== XSec Index Display ===// int xsid = stackgeom_ptr->GetActiveXSecIndex(); m_XSecIndexSelector.SetIndex( xsid ); StackXSec* xs = ( StackXSec* ) stackgeom_ptr->GetXSec( xsid ); if ( xs ) { bool firstxs = xsid == 0; bool lastxs = xsid == ( stackgeom_ptr->GetXSecSurf( 0 )->NumXSec() - 1 ); bool nextlastxs = xsid == ( stackgeom_ptr->GetXSecSurf( 0 )->NumXSec() - 2 ); m_SectUTessSlider.Update( xs->m_SectTessU.GetID() ); m_XSecXDeltaSlider.Update( xs->m_XDelta.GetID() ); m_XSecYDeltaSlider.Update( xs->m_YDelta.GetID() ); m_XSecZDeltaSlider.Update( xs->m_ZDelta.GetID() ); m_XSecXRotSlider.Update( xs->m_XRotate.GetID() ); m_XSecYRotSlider.Update( xs->m_YRotate.GetID() ); m_XSecZRotSlider.Update( xs->m_ZRotate.GetID() ); if ( firstxs ) { m_SectUTessSlider.Deactivate(); m_XSecXDeltaSlider.Deactivate(); m_XSecYDeltaSlider.Deactivate(); m_XSecZDeltaSlider.Deactivate(); m_XSecXRotSlider.Deactivate(); m_XSecYRotSlider.Deactivate(); m_XSecZRotSlider.Deactivate(); } else { m_SectUTessSlider.Activate(); m_XSecXDeltaSlider.Activate(); m_XSecYDeltaSlider.Activate(); m_XSecZDeltaSlider.Activate(); m_XSecXRotSlider.Activate(); m_XSecYRotSlider.Activate(); m_XSecZRotSlider.Activate(); } if ( lastxs && stackgeom_ptr->m_OrderPolicy() == StackGeom::STACK_LOOP) { m_XSecXDeltaSlider.Deactivate(); m_XSecYDeltaSlider.Deactivate(); m_XSecZDeltaSlider.Deactivate(); m_XSecXRotSlider.Deactivate(); m_XSecYRotSlider.Deactivate(); m_XSecZRotSlider.Deactivate(); } XSecCurve* xsc = xs->GetXSecCurve(); if ( xsc ) { m_XSecTypeChoice.SetVal( xsc->GetType() ); if ( xsc->GetType() == XS_POINT ) { DisplayGroup( NULL ); } else if ( xsc->GetType() == XS_SUPER_ELLIPSE ) { DisplayGroup( &m_SuperGroup ); SuperXSec* super_xs = dynamic_cast< SuperXSec* >( xsc ); assert( super_xs ); m_SuperHeightSlider.Update( super_xs->m_Height.GetID() ); m_SuperWidthSlider.Update( super_xs->m_Width.GetID() ); m_SuperMSlider.Update( super_xs->m_M.GetID() ); m_SuperNSlider.Update( super_xs->m_N.GetID() ); } else if ( xsc->GetType() == XS_CIRCLE ) { DisplayGroup( &m_CircleGroup ); CircleXSec* circle_xs = dynamic_cast< CircleXSec* >( xsc ); assert( circle_xs ); m_DiameterSlider.Update( circle_xs->m_Diameter.GetID() ); } else if ( xsc->GetType() == XS_ELLIPSE ) { DisplayGroup( & m_EllipseGroup ); EllipseXSec* ellipse_xs = dynamic_cast< EllipseXSec* >( xsc ); m_EllipseHeightSlider.Update( ellipse_xs->m_Height.GetID() ); m_EllipseWidthSlider.Update( ellipse_xs->m_Width.GetID() ); } else if ( xsc->GetType() == XS_ROUNDED_RECTANGLE ) { DisplayGroup( & m_RoundedRectGroup ); RoundedRectXSec* rect_xs = dynamic_cast< RoundedRectXSec* >( xsc ); assert( rect_xs ); m_RRHeightSlider.Update( rect_xs->m_Height.GetID() ); m_RRWidthSlider.Update( rect_xs->m_Width.GetID() ); m_RRRadiusSlider.Update( rect_xs->m_Radius.GetID() ); } else if ( xsc->GetType() == XS_GENERAL_FUSE ) { DisplayGroup( &m_GenGroup ); GeneralFuseXSec* gen_xs = dynamic_cast< GeneralFuseXSec* >( xsc ); assert( gen_xs ); m_GenHeightSlider.Update( gen_xs->m_Height.GetID() ); m_GenWidthSlider.Update( gen_xs->m_Width.GetID() ); m_GenMaxWidthLocSlider.Update( gen_xs->m_MaxWidthLoc.GetID() ); m_GenCornerRadSlider.Update( gen_xs->m_CornerRad.GetID() ); m_GenTopTanAngleSlider.Update( gen_xs->m_TopTanAngle.GetID() ); m_GenBotTanAngleSlider.Update( gen_xs->m_BotTanAngle.GetID() ); m_GenTopStrSlider.Update( gen_xs->m_TopStr.GetID() ); m_GenBotStrSlider.Update( gen_xs->m_BotStr.GetID() ); m_GenUpStrSlider.Update( gen_xs->m_UpStr.GetID() ); m_GenLowStrSlider.Update( gen_xs->m_LowStr.GetID() ); } else if ( xsc->GetType() == XS_FOUR_SERIES ) { DisplayGroup( &m_FourSeriesGroup ); FourSeries* fs_xs = dynamic_cast< FourSeries* >( xsc ); assert( fs_xs ); m_FourChordSlider.Update( fs_xs->m_Chord.GetID() ); m_FourThickChordSlider.Update( fs_xs->m_ThickChord.GetID() ); m_FourCamberSlider.Update( fs_xs->m_Camber.GetID() ); m_FourCamberLocSlider.Update( fs_xs->m_CamberLoc.GetID() ); m_FourInvertButton.Update( fs_xs->m_Invert.GetID() ); m_FourNameOutput.Update( fs_xs->GetAirfoilName() ); } else if ( xsc->GetType() == XS_SIX_SERIES ) { DisplayGroup( &m_SixSeriesGroup ); SixSeries* ss_xs = dynamic_cast< SixSeries* >( xsc ); assert( ss_xs ); m_SixChordSlider.Update( ss_xs->m_Chord.GetID() ); m_SixThickChordSlider.Update( ss_xs->m_ThickChord.GetID() ); m_SixIdealClSlider.Update( ss_xs->m_IdealCl.GetID() ); m_SixASlider.Update( ss_xs->m_A.GetID() ); m_SixInvertButton.Update( ss_xs->m_Invert.GetID() ); m_SixNameOutput.Update( ss_xs->GetAirfoilName() ); m_SixSeriesChoice.Update( ss_xs->m_Series.GetID() ); } else if ( xsc->GetType() == XS_BICONVEX ) { DisplayGroup( &m_BiconvexGroup ); Biconvex* bi_xs = dynamic_cast< Biconvex* >( xsc ); assert( bi_xs ); m_BiconvexChordSlider.Update( bi_xs->m_Chord.GetID() ); m_BiconvexThickChordSlider.Update( bi_xs->m_ThickChord.GetID() ); } else if ( xsc->GetType() == XS_WEDGE ) { DisplayGroup( &m_WedgeGroup ); Wedge* we_xs = dynamic_cast< Wedge* >( xsc ); assert( we_xs ); m_WedgeChordSlider.Update( we_xs->m_Chord.GetID() ); m_WedgeThickChordSlider.Update( we_xs->m_ThickChord.GetID() ); m_WedgeThickLocSlider.Update( we_xs->m_ThickLoc.GetID() ); } else if ( xsc->GetType() == XS_FILE_FUSE ) { DisplayGroup( &m_FuseFileGroup ); FileXSec* file_xs = dynamic_cast< FileXSec* >( xsc ); assert( file_xs ); m_FileHeightSlider.Update( file_xs->m_Height.GetID() ); m_FileWidthSlider.Update( file_xs->m_Width.GetID() ); } else if ( xsc->GetType() == XS_FILE_AIRFOIL ) { DisplayGroup( &m_AfFileGroup ); FileAirfoil* affile_xs = dynamic_cast< FileAirfoil* >( xsc ); assert( affile_xs ); m_AfFileChordSlider.Update( affile_xs->m_Chord.GetID() ); m_AfFileInvertButton.Update( affile_xs->m_Invert.GetID() ); m_AfFileNameOutput.Update( affile_xs->GetAirfoilName() ); } } } return true; }