Paraview와 vtk의 학습 노트 (1)
from paraview.simple import *
# Create a new sphere proxy on the active connection and register it
# in the sources group.
sphere = Sphere(ThetaResolution=16, PhiResolution=32)
# Apply a shrink filter
shrink = Shrink(sphere)
# Turn the visiblity of the shrink object on.
Show(shrink)
# Render the scene
Render()
보시다시피 첫 번째 함수는 소스를 만드는 것이고 두 번째 함수는 Filter입니다.다음 Show 함수는 다음과 같습니다.
def Show(proxy=None, view=None, **params):
"""Turns the visibility of a given pipeline object on in the given view.
If pipeline object and/or view are not specified, active objects are used."""
if proxy == None:
proxy = GetActiveSource()
if proxy == None:
raise RuntimeError, "Show() needs a proxy argument or that an active source is set."
if not view:
# it here's now active view, controller.Show() will create a new preferred view.
# if possible.
view = active_objects.view
controller = servermanager.ParaViewPipelineController()
rep = controller.Show(proxy, proxy.Port, view)
if rep == None:
raise RuntimeError, "Could not create a representation object for proxy %s" % proxy.GetXMLLabel()
for param in params.keys():
setattr(rep, param, params[param])
return rep
이 방법 중에 한 줄이 있어요.
raise RuntimeError, "Could not create a representation object for proxy %s" % proxy.GetXMLLabel()
사실rep는 하나의representation이라고 말해 주세요.그래서 이 필터를 처리한 소스를 현재view와 에이전트에 연결합니다.representation을 생성합니다.마지막으로 Render 함수:
def Render(view=None):
"""Renders the given view (default value is active view)"""
if not view:
view = active_objects.view
view.StillRender()
if _funcs_internals.first_render:
# Not all views have a ResetCamera method
try:
view.ResetCamera()
view.StillRender()
except AttributeError: pass
_funcs_internals.first_render = False
return view
사실 렌더링을 시작했어요. view.StillRender()
렌더링합니다.이것은 사실 서버 관리자와 같다.py의 기본 예는 같다.simple.py는 서버 관리자의 함수를 호출하여 렌더링을 완성합니다. 서버 관리자의 함수로 저희도 할 수 있습니다. 구체적으로는 다음과 같습니다.
from paraview.servermanager import *
# Creates a new built-in session and makes it the active session.
Connect()
# Creates a new render view on the active session.
renModule = CreateRenderView()
# Create a new sphere proxy on the active session and register it
# in the sources group.
sphere = sources.SphereSource(registrationGroup="sources", ThetaResolution=16, PhiResolution=32)
# Create a representation for the sphere proxy and adds it to the render
# module.
display = CreateRepresentation(sphere, renModule)
renModule.StillRender()
다음은 이 파이톤 코드에 따라 데이터가 처리된 후의 렌더링 과정을 분석합니다.Connect에서 서버 연결을 만듭니다. 이것은 군말 필요 없습니다.
renModule = CreateRenderView()
이 함수는:def CreateRenderView(session=None, **extraArgs):
"""Creates a render window on the particular session. If session
is not specified, then the active session is used, if available.
This method can also be used to initialize properties by passing
keyword arguments where the key is the name of the property. In addition
registrationGroup and registrationName (optional) can be specified (as
keyword arguments) to automatically register the proxy with the proxy
manager."""
return _create_view("RenderView", session, **extraArgs)
내부 함수를 직접 호출한 것을 볼 수 있습니다create_view("RenderView", session, **extraArgs) def _create_view(view_xml_name, session=None, **extraArgs):
"""Creates a view on the particular session. If session
is not specified, then the active session is used, if available.
This method can also be used to initialize properties by passing
keyword arguments where the key is the name of the property."""
if not session:
session = ActiveConnection.Session
if not session:
raise RuntimeError, "Cannot create view without session."
pxm = ProxyManager()
view_module = None
if view_xml_name:
view_module = CreateProxy("views", view_xml_name, session)
if not view_module:
return None
return _getPyProxy(view_module)
이 함수에서session이 없으면 현재 연결된 활동session을 자동으로 찾습니다. 앞에 없기 때문에 현재ActiveConnection입니다.Session. pxm = ProxyManager()
이 구절에 주의해야 할 것은 다음과 같다.Proxy Manager는 백엔드 c++의 vtkSM Proxy Manager 클래스에 대한python 봉인된 클래스입니다.그것의 대다수 방법은 모두 이 c++ 종류를 사용하는 것이다.그리고 이것은 일례류다.그것의 실례화 방법은 바로 현재self를 얻는 것이다.SMProxyManager = session.GetSessionProxy Manager()의 프록시 관리 객체그래서 이곳의 pxm는 전체적인 대리 관리 대상이다.이것은 클라이언트의 것입니다. 모든 에이전트를 관리하고, 전방에서 삭제, 수정을 하며, 백엔드에서 해당하는 업데이트 ()를 해야 합니다.여기에 이 함수를 쓰면 초기화되었는지 확인해야 합니다.
우리가 볼 수 있듯이 이 함수는 되돌아오는 것이
return _getPyProxy(view_module)
이 중의,viewmoduleCreateProxy("views", view_xml_name, session)
이 함수:def CreateProxy(xml_group, xml_name, session=None):
"""Creates a proxy. If session is set, the proxy's session is
set accordingly. If session is None, the current Session is used, if
present. You should not have to use method normally. Instantiate the
appropriate class from the appropriate module, for example:
sph = servermanager.sources.SphereSource()"""
global ActiveConnection
if not session:
session = ActiveConnection.Session
if not session:
raise RuntimeError, "Cannot create objects without a session."
pxm = ProxyManager(session)
return pxm.NewProxy(xml_group, xml_name)
에서 볼 수 있듯이 "views"는xmlgroup의 하나,xml그룹은 모두'source','filters','representation','views'네 가지가 있다.여기 앞에 있는 전송값에 따라xmlname은 "RenderView"입니다.이 함수의 반환은 프록시 대상입니다. pxm를 통해 xmlgroup 및 xmlname에서 만든 에이전트
def NewProxy(self, group, name):
"""Creates a new proxy of given group and name and returns an SMProxy.
Note that this is a server manager object. You should normally create
proxies using the class objects. For example:
obj = servermanager.sources.SphereSource()"""
if not self.SMProxyManager:
return None
aProxy = self.SMProxyManager.NewProxy(group, name)
if not aProxy:
return None
aProxy.UnRegister(None)
return aProxy
백엔드 c++ vtkSMProxy Manager 클래스의 New Proxy 방법을 호출한 것을 분명히 볼 수 있습니다.
vtkSMProxy* vtkSMProxyManager::NewProxy(const char* groupName,
const char* proxyName, const char* subProxyName)
{
if (vtkSMSessionProxyManager* pxm = this->GetActiveSessionProxyManager())
{
return pxm->NewProxy(groupName, proxyName, subProxyName);
}
vtkErrorMacro("No active session found.");
return NULL;
}
에서 이 함수는 vtkSMSessionProxyManager* pxm=this->GetActiveSessionProxyManager(), GetActiveSessionProxyManager()가 현재session의 프록시 관리 대상임을 알 수 있다.vtkSMSessionProxy Manager 클래스의 pxm에 값을 지정합니다.다음 기준에 따라
pxm->NewProxy(groupName, proxyName, subProxyName);
방법은 상응하는 대리 대상을 구축한다.vtkSMProxy* vtkSMSessionProxyManager::NewProxy(vtkPVXMLElement* pelement,
const char* groupname,
const char* proxyname,
const char* subProxyName)
{
vtkObject* object = 0;
vtksys_ios::ostringstream cname;
cname << "vtkSM" << pelement->GetName() << ends;
object = vtkPVInstantiator::CreateInstance(cname.str().c_str());
vtkSMProxy* proxy = vtkSMProxy::SafeDownCast(object);
if (proxy)
{
// XMLName/XMLGroup should be set before ReadXMLAttributes so sub proxy
// can be found based on their names when sent to the PM Side
proxy->SetXMLGroup(groupname);
proxy->SetXMLName(proxyname);
proxy->SetXMLSubProxyName(subProxyName);
proxy->SetSession(this->GetSession());
proxy->ReadXMLAttributes(this, pelement);
else
{
vtkWarningMacro("Creation of new proxy " << cname.str() << " failed ("
<< groupname << ", " << proxyname << ").");
}
return proxy;
}
이 함수에 앞서 이 에이전트가 만들어질 수 있는지 확인하는 함수가 하나 더 있습니다. 에이전트에 정의된 xml 파일에서 찾은 함수는 군말하지 않습니다. 이 함수는 vtkSMProxy 클래스의 대상을 되돌려줍니다.그리고 이proxy의 일부 속성을 설정했습니다.그래서viewmodule는 사실'RenderView'라고 불리며 type은'views'인 클래스는 vtkSMProxy 클래스의 프록시 대상이다.
다음은 저희가 볼게요.
return _getPyProxy(view_module)
def _getPyProxy(smproxy, outputPort=0):
"""Returns a python wrapper for a server manager proxy. This method
first checks if there is already such an object by looking in the
_pyproxies group and returns it if found. Otherwise, it creates a
new one. Proxies register themselves in _pyproxies upon creation."""
if not smproxy:
return None
try:
# is argument is already a Proxy instance, this takes care of it.
return _getPyProxy(smproxy.SMProxy, outputPort)
except AttributeError:
pass
if (smproxy, outputPort) in _pyproxies:
return _pyproxies[(smproxy, outputPort)]()
xmlName = smproxy.GetXMLName()
if paraview.compatibility.GetVersion() >= 3.5:
if smproxy.GetXMLLabel():
xmlName = smproxy.GetXMLLabel()
classForProxy = _findClassForProxy(_make_name_valid(xmlName), smproxy.GetXMLGroup())
if classForProxy:
retVal = classForProxy(proxy=smproxy, port=outputPort)
else:
retVal = Proxy(proxy=smproxy, port=outputPort)
return retVal
, , , , 。_pyproxies , , _pyproxies 。 proxy 。 。
renMoudle “views” “RenderView"
,
renModule.StillRender()
그런데 서버 관리자 전체를 다 찾았어요.py 파일에서도 이 함수를 찾지 못했기 때문에 vtkSMProxy 클래스를 찾았지만 이 함수에서도 찾지 못했습니다.classForProxy = _findClassForProxy(_make_name_valid(xmlName), smproxy.GetXMLGroup())
:
def _findClassForProxy(xmlName, xmlGroup):
"""Given the xmlName for a proxy, returns a Proxy class. Note
that if there are duplicates, the first one is returned."""
global sources, filters, writers, rendering, animation, implicit_functions,\
piecewise_functions, extended_sources, misc
if not xmlName:
return None
if xmlGroup == "sources":
return sources.__dict__[xmlName]
elif xmlGroup == "filters":
return filters.__dict__[xmlName]
elif xmlGroup == "implicit_functions":
return implicit_functions.__dict__[xmlName]
elif xmlGroup == "piecewise_functions":
return piecewise_functions.__dict__[xmlName]
elif xmlGroup == "writers":
return writers.__dict__[xmlName]
elif xmlGroup == "extended_sources":
return extended_sources.__dict__[xmlName]
elif xmlName in rendering.__dict__:
return rendering.__dict__[xmlName]
elif xmlName in animation.__dict__:
return animation.__dict__[xmlName]
elif xmlName in misc.__dict__:
return misc.__dict__[xmlName]
else:
return None
그것이 속하는지 모르겠습니다. 여기xmlname은 RenderView입니다.rendering.__dict__:
그래서 여기도 뭐가 돌아왔는지 모르겠어요.
찾을 수 없으면 호출 retVal = Proxy(proxy=smproxy, port=outputPort)
Proxy는python 클래스입니다.이 경우 프록시 대상인 self를 만듭니다.SMProxy는viewmodule.
나머지 두 방향 다 끊겼어요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.