Цветовая схема масштабирования Paraview для видимых данных в диапазоне в Python

У меня есть автоматический сценарий клипа, который я запускаю, и как его часть я хотел бы иметь возможность масштабировать цветовую схему до видимых данных в диапазоне - логическое значение.

Я нашел эту команду clipDisplay.SetScalarBarVisibility(renderView1, True) в Руководстве пользователя Paraview (глава 10.1.2) и поместил в конце функции Color Transfer в отслеживаемом сценарии paraview для клипа.

Запуск сценария не дает никаких ошибок, но просто не выполняет работу по изменению масштаба цветовой схемы по сравнению с той же операцией, выполняемой в графическом интерфейсе.

Я хочу использовать код универсально, поэтому о ручном выборе данных в диапазоне с определением числа не может быть и речи...

изменить

Используя трассировку, вы получите:

# trace generated using paraview version 5.7.0
#
# To ensure correct image size when batch processing, please search 
# for and uncomment the line `# renderView*.ViewSize = [*,*]`

#### import the simple module from the paraview
from paraview.simple import *
#### disable automatic camera reset on 'Show'
paraview.simple._DisableFirstRenderCameraReset()

# get color transfer function/color map for 'p'
pLUT = GetColorTransferFunction('p')
pLUT.AutomaticRescaleRangeMode = "Grow and update on 'Apply'"
pLUT.InterpretValuesAsCategories = 0
pLUT.AnnotationsInitialized = 0
pLUT.ShowCategoricalColorsinDataRangeOnly = 0
pLUT.RescaleOnVisibilityChange = 0
pLUT.EnableOpacityMapping = 0
pLUT.RGBPoints = [-714.7062377929688, 0.231373, 0.298039, 0.752941, -259.51192474365234, 0.865003, 0.865003, 0.865003, 195.68238830566406, 0.705882, 0.0156863, 0.14902]
pLUT.UseLogScale = 0
pLUT.ColorSpace = 'Diverging'
pLUT.UseBelowRangeColor = 0
pLUT.BelowRangeColor = [0.0, 0.0, 0.0]
pLUT.UseAboveRangeColor = 0
pLUT.AboveRangeColor = [0.5, 0.5, 0.5]
pLUT.NanColor = [1.0, 1.0, 0.0]
pLUT.NanOpacity = 1.0
pLUT.Discretize = 1
pLUT.NumberOfTableValues = 256
pLUT.ScalarRangeInitialized = 1.0
pLUT.HSVWrap = 0
pLUT.VectorComponent = 0
pLUT.VectorMode = 'Magnitude'
pLUT.AllowDuplicateScalars = 1
pLUT.Annotations = []
pLUT.ActiveAnnotatedValues = []
pLUT.IndexedColors = []
pLUT.IndexedOpacities = []

# Rescale transfer function
pLUT.RescaleTransferFunction(-413.7960510253906, 192.35369873046875)

# get opacity transfer function/opacity map for 'p'
pPWF = GetOpacityTransferFunction('p')
pPWF.Points = [-714.7062377929688, 0.0, 0.5, 0.0, 195.68238830566406, 1.0, 0.5, 0.0]
pPWF.AllowDuplicateScalars = 1
pPWF.UseLogScale = 0
pPWF.ScalarRangeInitialized = 1

# Rescale transfer function
pPWF.RescaleTransferFunction(-413.7960510253906, 192.35369873046875)

Любые идеи, пожалуйста? Ваше здоровье


person Ota Michálek    schedule 22.07.2020    source источник


Ответы (1)


clip1Display.RescaleTransferFunctionToDataRange(False, True) - это строка, которую вы хотите. Для информации, при поиске версии действия интерфейса на Python вы можете использовать Trace (Tools/Start Trace). Он записывает каждое действие из интерфейса, и когда вы останавливаетесь (Tools/Stop Trace), он печатает версию этих действий на Python.

изменить

Вы не можете легко изменить масштаб до видимого диапазона в python.

Один обходной путь состоит в извлечении видимых данных, чтобы получить видимый диапазон и, наконец, применить его к исходной функции передачи данных. Этот макрос делает свое дело


from paraview.simple import *
v=GetActiveView()
source=GetActiveSource()
SelectSurfacePoints(Rectangle=[0, 0, v.ViewSize[0], v.ViewSize[1]])# Or SelectPointsThrough 
extractSelection1=ExtractSelection()
# s=Show()
arrayInfo = e.PointData['X'] # replace 'X' by the array you want
r=arrayInfo.GetRange(0)
Delete(extractSelection1)
del extractSelection1
SetActiveSource(source)
ClearSelection()

pLUT = GetColorTransferFunction('X')
pLUT.RescaleTransferFunction(r[0], r[1])


person Nico Vuaille    schedule 22.07.2020
comment
Спасибо за совет по трассировке, однако функция трассировки определяет текущие данные в диапазоне, а это не то, чего я хочу. - person Ota Michálek; 22.07.2020
comment
«clip1Display.RescaleTransferFunctionToDataRange(False, True)» — это строка, которую я использовал, но она не изменяет цветовую схему. - person Ota Michálek; 22.07.2020
comment
Извините, теперь я вижу проблему. Я хочу не диапазон данных, а видимый диапазон данных. Есть ли строка clip1Display.RescaleTransferFunctionToVisibleDataRange(False, True)?? - person Ota Michálek; 22.07.2020
comment
Спасибо, я понимаю. Я заменил «X» своим массивом, и теперь я получаю эту ошибку. Есть ли что-то еще? >>> exec(open('/home/otamichalek/Documents/Scripts/V5/test.py').read()) Traceback (most recent call last): File "/usr/lib/python3.8/code.py", line 90, in runcode exec(code, self.locals) File "<console>", line 1, in <module> File "<string>", line 5, in <module> NameError: name 'SelectSurfacePoints' is not defined - person Ota Michálek; 22.07.2020
comment
Этот метод есть в PV начиная с версии 5.8. В предыдущих версиях вам нужно использовать view.SelectSurfacePoints API (может отличаться) - person Nico Vuaille; 22.07.2020
comment
Спасибо, где я могу найти документацию для этого, пожалуйста? - person Ota Michálek; 22.07.2020
comment
См. реализацию текущего метода SelectSurfacePoints: gitlab.kitware.com/paraview/paraview/-/blob/master/Wrapping/ Вы хотите переписать строку 182 - person Nico Vuaille; 22.07.2020
comment
Итак, я получил v.SelectSurfacePoints([0, 0, v.ViewSize[0], v.ViewSize[1]], <vtkCollection>, source,0), что мне разместить вместо vtkCollection, пожалуйста? я. е. Что такое SelectedReps? Кроме того, что означает 'e.' обратитесь к строке 7 в вашем решении, пожалуйста? - person Ota Michálek; 24.07.2020