2011-09-15 2 views
0

변환 행렬을 사용하는 .transform() 메서드 (Objects, Textures, Cameras 등)를 구현하는 레이 트레이서의 Python 바인딩에 몇 가지 클래스가 있습니다. 이 모든 클래스에 .scale(), .rotate() 등을 구현하고 self.transform (...)을 호출하는 일반적인 구현을 공유하고 싶습니다. 이를 수행하는 한 가지 방법은 해당 메서드와 해당 구현을 제공하는 _Transformable 클래스에서 상속하는 것입니다. 그러나 Cython "확장 유형"은 다중 상속을 지원하지 않으므로 이미 상속 된 유형에서는 작동하지 않습니다.상속없는 Cython에서 메서드 구현 공유

Cython은 cdef 클래스의 데코레이터를 지원하지 않으므로 "@_transformable"데코레이터도 작동하지 않습니다. 그리고 나는 그들이 메타 클래스도지지한다고 생각하지 않는다. 어떤 아이디어?

메소드가 글로벌 scale()/rotate()/etc에서 docstring을 상속 할 수있는 경우 보너스 포인트입니다. 함수 (matricies를 반환).

편집 :

def translate(*args, **kwargs): 
    """ 
    Return a translation. 

    Accepts the same arguments that Vector(...) does. 
    """ 
    return _Matrix(dmnsn_translation_matrix(Vector(*args, **kwargs)._v)) 

cdef class Pigment: 
    """Object surface coloring.""" 
    cdef dmnsn_pigment *_pigment 

    # ... 

    def transform(self, Matrix trans not None): 
    """Transform a pigment.""" 
    self._pigment.trans = dmnsn_matrix_mul(trans._m, self._pigment.trans) 
    return self 

상속 솔루션은 다음과 같을 것이다 :

cdef class _Transformable: 
    def scale(self, *args, **kwargs): 
    return self.transform(scale(*args, **kwargs)) 
    def translate(self, *args, **kwargs): 
    return self.transform(translate(*args, **kwargs)) 
    def rotate(self, *args, **kwargs): 
    return self.transform(rotate(*args, **kwargs)) 

답변

0

귀하의 변 형식이 do_everything 될 가능성이 여기에 무슨 일이 일어나고 있는지의 표시를 제공 the file의 코드 조각입니다. 구성은 IMHO이며 cython 코드 및 아키텍처 측면에서의 답입니다. 참조 : 좋은 설명은 this article입니다. 012RX, IIRC, Blender는이 아키텍처를 사용하므로 사용자가 원하는 것과 호환됩니다. (BTW, 약간의 코드를 게시하여 내가 가지고있는 것을 구체적으로 보여줄 수 있습니까?)

분명히 이것은 코드 기반의 크기와 그 위에있는 컨트롤에 달려 있습니다.

+1

퍼머 링크의 맞춤법이 잘못되었습니다. 편집을 제출했습니다. http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ – forivall

관련 문제