vtkSTLReader читает только файлы в папке исполнения - PullRequest
1 голос
/ 06 ноября 2019

ПРИМЕЧАНИЕ: вопрос недействителен, я совершил совершенно другую ошибку, см. Правку в конце.

Я хочу просто прочитать файл STL с помощью класса vtkSTLReader. Мой код для этого выглядит следующим образом:

        vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
        reader->SetFileName(path.c_str());
        reader->Update();
        vtkSmartPointer<vtkPolyData> poly_data = reader->GetOutput();

, а затем код переходит к отображению поли данных.

Это работает до некоторого градуса. Код в том виде, в каком он есть, будет игнорировать что-либо в path, кроме имени файла, а затем искать этот файл везде, где я выполняю свою программу.

Например, если я иду как path = /home/local/users/myusername/file.stl,если программа находится в /some_path/somefolder/myprogram при вызове ее в консоли, находящейся в /some_path/, она будет работать только в том случае, если (и только если) будет копия файла в /some_path/file.stl.
Если я вместо этого выполнюпрограмма изнутри /some_path/somefolder, она будет работать, только если есть /some_path/somefolder/file.stl.

Я даже пошел и попробовал, что произойдет, если я добавлю строку кода

        path = "/dsgsdmklgmoeg/" + path;

и результатостается точно таким же.

Как показывают мои пути, я работаю под Linux.
Я попытался указать абсолютный путь, как указано выше, относительный путь от места выполнения, а также относительный путь от исполняемого файла (на всякий случай).
Для относительного пути я перепробовал всевозможные варианты того, что, как мне кажется, может хотеть, с ведущим ./, с и без ведущего /.
по абсолютному пути попробовал заменить всекосая черта с обратной косой чертой, мысль о том, что она может использовать пути в стиле Windows.

Я понимаю, что быстрым решением было бы просто скопировать файл в требуемое место, но это, безусловно, не является постоянным решением.

Кто-нибудь имел опыт с этим? Это какая-то особенность vtk?
Если это важно, я использую vtk 5.6.1 (и не могу перейти на более высокую версию из-за некоторых требований совместимости).

Редактировать: я понял, чтоЯ сделал очень простую ошибку, вместо path.c_str() в моем исходном коде было file.c_str(), а file - переменная, из которой собран path. Я не допустил ошибку при наборе кода выше, что сделало вопрос недействительным.

1 Ответ

1 голос
/ 06 ноября 2019

Из любопытства я немного покопался в github.

Вот что я нашел:

VTK/vtkSTLReader.cxx при v5.6.1 (int vtkSTLReader::RequestData(),строки 96 ... 110):

  if (!this->FileName || (this->FileName && (0==strlen(this->FileName))))
    {
    vtkErrorMacro(<<"A FileName must be specified.");
    this->SetErrorCode( vtkErrorCode::NoFileNameError );
    return 0;
    }

  // Initialize
  //
  if ((fp = fopen(this->FileName, "r")) == NULL)
    {
    vtkErrorMacro(<< "File " << this->FileName << " not found");
    this->SetErrorCode( vtkErrorCode::CannotOpenFileError );
    return 0;
    }

VTK/vtkSTLReader.h при v5.6.1 (строки 57 ... 60):

  // Description:
  // Specify file name of stereo lithography file.
  vtkSetStringMacro(FileName);
  vtkGetStringMacro(FileName);

VTK/vtkSetGet.h на v5.6.1 (строки 88 ... 122):

//
// Set character string.  Creates member Set"name"() 
// (e.g., SetFilename(char *));
//
#define vtkSetStringMacro(name) \
virtual void Set##name (const char* _arg) \
  { \
  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " << #name " to " << (_arg?_arg:"(null)") ); \
  if ( this->name == NULL && _arg == NULL) { return;} \
  if ( this->name && _arg && (!strcmp(this->name,_arg))) { return;} \
  if (this->name) { delete [] this->name; } \
  if (_arg) \
    { \
    size_t n = strlen(_arg) + 1; \
    char *cp1 =  new char[n]; \
    const char *cp2 = (_arg); \
    this->name = cp1; \
    do { *cp1++ = *cp2++; } while ( --n ); \
    } \
   else \
    { \
    this->name = NULL; \
    } \
  this->Modified(); \
  } 

//
// Get character string.  Creates member Get"name"() 
// (e.g., char *GetFilename());
//
#define vtkGetStringMacro(name) \
virtual char* Get##name () { \
  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): returning " << #name " of " << (this->name?this->name:"(null)")); \
  return this->name; \
  } 

Глядя на этот код (который, IMHO, является релевантным кодом для выдачи OP), я не могу найти подсказкичто каталоги удаляются из пути к файлу, заданного SetFileName().

Я понятия не имею, что на самом деле может вызвать проблему OP, что рассматриваются только файлы в текущем каталоге. Однако я с трудом верю, что в этом можно обвинить ВТК.

Поэтому я бы порекомендовал поискать выше и ниже:

  • выше: указан ли путь в SetFileName() верный? (легкая часть)
  • ниже: это странное поведение вызвано fopen() (или чем-то, что называется в fopen())?
...