Commit e7d2b9b4 authored by jean-pierre charras's avatar jean-pierre charras
Browse files

Add the environment variable KYSYS3DMOD to define a default path for 3D models.

If it is not defined by user, it is set to a legacy 3D files path.
The default value needs to be fixed on MACOSX.
This change could be better, but it is compatible with environment variables and the old way ( defined search paths) to find 3D shape files.
3D shapes files names can  also include an environment variable definition, like libraries names.
However using KYSYS3DMOD in these names is not required.
If the 3D filename is a legacy name, KYSYS3DMOD is automatically used as default path.
parents 6a9771f2 fff54d75
Loading
Loading
Loading
Loading
+34 −2
Original line number Diff line number Diff line
@@ -59,6 +59,39 @@ S3D_MODEL_PARSER* S3D_MODEL_PARSER::Create( S3D_MASTER* aMaster,
    }
}

const wxString S3D_MASTER::GetShape3DFullFilename()
{

    wxString shapeName;

    // Expand any environment variables embedded in footprint's m_Shape3DName field.
    // To ensure compatibility with most of footprint's m_Shape3DName field,
    // if the m_Shape3DName is not an absolute path the default path
    // given by the environment variable KISYS3DMOD will be used

    if( m_Shape3DName.StartsWith( wxT("${") ) )
        shapeName = wxExpandEnvVars( m_Shape3DName );
    else
        shapeName = m_Shape3DName;

    wxFileName fn( shapeName );

    if( fn.IsAbsolute() || shapeName.StartsWith( wxT(".") ) )
        return shapeName;

    wxString default_path;
    wxGetEnv( wxT( KISYS3DMOD ), &default_path );

    if( default_path.IsEmpty() )
        return shapeName;

    if( !default_path.EndsWith( wxT("/") ) && !default_path.EndsWith( wxT("\\") ) )
        default_path += wxT("/");

    default_path += shapeName;

    return default_path;
}

int S3D_MASTER::ReadData()
{
@@ -67,8 +100,7 @@ int S3D_MASTER::ReadData()
        return 1;
    }

    // Expand any environment variables embedded in footprint's m_Shape3DName field.
    wxString filename = wxExpandEnvVars( m_Shape3DName );
    wxString filename = GetShape3DFullFilename();

#ifdef __WINDOWS__
    filename.Replace( wxT( "/" ), wxT( "\\" ) );
+8 −0
Original line number Diff line number Diff line
@@ -144,6 +144,14 @@ public:
        return m_Shape3DName;
    }

    /**
     * Function GetShape3DFullFilename
     * @return the full filename of the 3D shape,
     * expanding environment variable (if any ) and/or adding default 3D path
     * given by environment variable KISYS3DMOD
     */
    const wxString GetShape3DFullFilename();

    void SetShape3DName( const wxString& aShapeName );
};

+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,9 @@
#  include <GL/glu.h>
#endif


#define KISYS3DMOD "KISYS3DMOD"

#include <3d_struct.h>

class EDA_3D_CANVAS;
+66 −0
Original line number Diff line number Diff line
@@ -1196,3 +1196,69 @@ bool EDA_APP::SetFootprintLibTablePath()
    return false;
}

/**
 * Function Set3DShapesPath
 * attempts set the environment variable given by aKiSys3Dmod to a valid path.
 * (typically "KISYS3DMOD" )
 * If the environment variable is already set,
 * then it left as is to respect the wishes of the user.
 *
 * The path is determined by attempting to find the path modules/packages3d
 * files in kicad tree.
 * This may or may not be the best path but it provides the best solution for
 * backwards compatibility with the previous 3D shapes search path implementation.
 *
 * @note This must be called after #SetBinDir() is called at least on Windows.
 * Otherwise, the kicad path is not known (Windows specific)
 *
 * @param aKiSys3Dmod = the value of environment variable, typically "KISYS3DMOD"
 * @return false if the aKiSys3Dmod path is not valid.
 */
bool EDA_APP::Set3DShapesPath( const wxString& aKiSys3Dmod )
{
    wxString    path;

    // Set the KISYS3DMOD environment variable for the current process,
    // if it is not already defined in the user's environment and valid.
    if( wxGetEnv( aKiSys3Dmod, &path ) && wxFileName::DirExists( path ) )
        return true;

    // Attempt to determine where the 3D shape libraries were installed using the
    // legacy path:
    // on Unix: /usr/local/kicad/share/modules/packages3d
    // or  /usr/share/kicad/modules/packages3d
    // On Windows: bin../share/modules/packages3d
    wxString relpath( wxT( "modules/packages3d" ) );

// Apple MacOSx
#ifdef __APPLE__
    // TO DO

#elif defined(__UNIX__)     // Linux and non-Apple Unix
    path = wxT("/usr/local/kicad/share/") + relpath;
    if( wxFileName::DirExists( path ) )
    {
        wxSetEnv( aKiSys3Dmod, path );
        return true;
    }

    path = wxT("/usr/share/kicad/") + relpath;
    if( wxFileName::DirExists( path ) )
    {
        wxSetEnv( aKiSys3Dmod, path );
        return true;
    }

#else   // Windows
    path = m_BinDir + wxT("../share/") + relpath;

    if( wxFileName::DirExists( path ) )
    {
        wxSetEnv( aKiSys3Dmod, path );
        return true;
    }
#endif

    return false;
}
+4 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include <confirm.h>
#include <gestfich.h>

#include <3d_viewer.h>
#include <cvpcb.h>
#include <zones.h>
#include <cvpcb_mainframe.h>
@@ -102,6 +103,9 @@ bool EDA_APP::OnInit()

    SetFootprintLibTablePath();

    // Set 3D shape path from environment variable KISYS3DMOD
    Set3DShapesPath( wxT(KISYS3DMOD) );

    if( m_Checker && m_Checker->IsAnotherRunning() )
    {
        if( !IsOK( NULL, _( "CvPcb is already running, Continue?" ) ) )
Loading