Paraview와 vtk의 학습 노트 (1)

12234 단어
Paraview에서 단순.py는 외부 사용자와 인터페이스를 연결하는 작업을 맡는다. 가장 기본적인 Paraview 사용 예는 다음과 같다.
 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)
이 중의,viewmodule
CreateProxy("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.
나머지 두 방향 다 끊겼어요.

좋은 웹페이지 즐겨찾기