2017-02-01 9 views
0

Я хочу использовать vtkArrayCalculator, для использования в фильтре ParaView, как описано здесь: ArrayCalculatorExamplevtkArrayCalculator - ошибка сегментации при доступе к выходным

vtkSmartPointer<vtkArrayCalculator> calculator = vtkSmartPointer<vtkArrayCalculator>::New(); 
calculator->SetInputData(input); 
calculator->AddScalarArrayName("u"); 
calculator->SetFunction("u+1"); 
calculator->SetResultArrayName("wind_velocity"); 
calculator->Update(); 
vtkSmartPointer<vtkFloatArray> windVelocity = 
     vtkFloatArray::SafeDownCast(calculator->GetStructuredGridOutput()->GetPointData()->GetArray("wind_velocity")); 

Теперь, когда я хочу, чтобы получить доступ к данным с (или аналогичными командами)

windVelocity->GetValue(0); 

У меня возникает «ошибка сегментации (ядро сбрасывается)».

«input» - это vtkStructuredGrid, а «u» - это vtkDataArray (который может быть отключен в vtkFloatArray без проблем). Доступ к «u» доступен по адресу

input->GetPointData()->GetArray("u"); 

Каждый намек на то, что я делаю неправильно, очень ценится!

Edit: Я уже пробовал следующие

vtkSmartPointer<vtkFloatArray> windVelocity = vtkSmartPointer<vtkFloatArray>::New(); 
windVelocity->DeepCopy(vtkFloatArray::SafeDownCast(calculator->GetStructuredGridOutput()->GetPointData()->GetArray("wind_velocity"))); 

ответ

2

Я предлагаю разделить длинную цепочку vtkFloatArray::SafeDownCast(calculator->GetStructuredGridOutput()->GetPointData()->GetArray("wind_velocity")) и использовать отладчик, чтобы увидеть, что промежуточные результаты.

При чтении определения GetArray в нем указано, что в различных условиях функция может возвращать NULL. Проверьте возвращаемое значение GetArray; очень вероятно, что вы не получите то, что ожидаете.

vtkDataArray * vtkFieldData :: GetArray (Const символ * имяМассив)
рядного

Не рекомендуется для использования. Вместо этого используйте GetAbstractArray (const char * arrayName).

Верните массив с указанным именем. Возвращает NULL, если массив не найден. NULL также возвращается, если массив с заданным именем не является vtkDataArray. Чтобы получить доступ к vtkStringArray, vtkUnicodeStringArray или vtkVariantArray, используйте GetAbstractArray (const char * arrayName).

+1

Благодаря вашей подсказке я снова посмотрел на эту команду, и ошибка возникает, когда я использую команду vtkFloatArray :: SafeDownCast(), иначе она не возвращает NULL. Я узнал, что на самом деле он возвращает vtkDoubleArray. Я думал, VTK может сбрасывать с двойного на массив с плавающей точкой, но, по-видимому, это не работает в моем случае. Спасибо, что заглянули в мою проблему, это очень помогло! –

Смежные вопросы