Esempio n. 1
0
 def translate(self, vec, newcr):
     """
     Calculates the translation matrix to a new cartesian system (newcr)
     """
     vec = Vec( vec )
     vec_t = vec + newcr.o + self.o
     return vec_t
Esempio n. 2
0
 def Rmatrix(self, newcr):
     """
     Calculates the rotation matrix to a new cartesian system (newcr)
     """
     cosb = cosplanevec(newcr.xy, self.x)
     sinb = sinplanevec(newcr.xy, self.x)
     cosg = cosplanevec(newcr.xz, self.x)
     sing = sinplanevec(newcr.xz, self.x)
     tmpT =  np.array([\
         [ -sing,  ZER, ZER ],
         [   ZER, cosg, ZER ],
         [   ZER,  ZER, ZER ]])
     Y2 = Vec(np.dot(tmpT, newcr.y.array))
     cosa = cos2vecs(Y2, self.y)
     sina = sin2vecs(Y2, self.y)
     Rself = np.array([\
        [ cosb*cosg               ,  cosb*sing ,                  -sinb ], \
        [-cosa*sing+cosg*sina*sinb,  cosa*cosg+sina*sinb*sing, cosb*sina], \
        [ sina*sing+cosa*cosg*sinb, -cosg*sina+cosa*sinb*sing, cosa*cosb]],\
                                                               dtype=FLOAT)
     R2new = Rself.transpose()
     return R2new
Esempio n. 3
0
class Coord(object):
    """
    Each coordinate system is defined by three points:
        rcid: reference coordinate system in which all the others are
             defined. If not given the basic cartesian system will be used.
        o:  the origin
        z:  the Z axis
        vecxz: a point laying in the azimuthal origin
    Basically the point are defined using reference GRIDs or POINT coordinates.
        
    Attributes:
    ____________________________________________________________________________
    card       the card name (NASTRAN etc)
    entryclass path to the class name
    id         coordinate system id
    rcid       reference coordsys id
    rcobj      pointer to the reference coordsys object
    o          the origin of the coordsys alg3dpy.Point
    x          the x vector of the coordsys
    y          the y vector of the coordsys
    z          the z vector of the coordsys
    xy         the xy plane of the coordsys
    xz         the xz plane of the coordsys
    yz         the yz plane of the coordsys
    vecxz      a vector laying in the xz plane of the coordsys
    a1, a2, a3 components of the point defining the origin
    b1, b2, b3 components of the point defining the y axis
    c1, c2, c3 components of the point defining the xz plane
    ida, idb   id of coordsys "a" or "b" when creating two coordsys in the
               same card. In NASTRAN, the cards: CORD1R, CORD1C or CORD1S
    g1a, g1b   grid defining the origin of coordsys "a" or "b" 
    g2a, g2b   grid defining the z axis of coordsys "a" or "b" 
    g3a, g3b   grid defining the xz plane of coordsys "a" or "b" 
    model      pointer to the model object it belongs to
    rebuilt    a flag to tell if this coordsys is already rebuilt
    ____________________________________________________________________________

    Note: not all attributes are used simultaneously, but the Coord class is
          already prepared for many ways for defining a coordsys
    ____________________________________________________________________________
    """
    __slots__ = [ 'card','entryclass','id','rcid','rcobj','o','x','y','z',
                  'xy','xz','yz','vecxz',
                  'a1','a2','a3','b1','b2','b3','c1','c2','c3',
                  'ida','idb','g1a','g2a','g3a','g1b','g2b','g3b',
                  'model','rebuilt' ]

    def __init__(self, id=None, o=None, rcid=None, z=None, vecxz=None):
        self.card = None
        self.entryclass = None
        inputs = {}
        if id.__class__.__name__ == 'dict':
            inputs = id
            id = None
        self.id    = id 
        self.rcid  = rcid
        self.rcobj = None
        self.o     = o
        self.x     = None
        self.y     = None
        self.z     = z
        self.xy    = None
        self.xz    = None
        self.yz    = None
        self.vecxz = vecxz 
        self.a1    = None
        self.a2    = None
        self.a3    = None
        self.b1    = None
        self.b2    = None
        self.b3    = None
        self.c1    = None
        self.c2    = None
        self.c3    = None
        self.ida   = None
        self.idb   = None
        self.g1a   = None
        self.g2a   = None
        self.g3a   = None
        self.g1b   = None
        self.g2b   = None
        self.g3b   = None
        self.model = None
        self.rebuilt = False
        self.read_inputs( inputs )
        
    def read_inputs( self, inputs = {} ):
        if len(inputs) > 0:
            self = user_setattr(self, inputs)
        if self.id == None and self.ida <> None:
            self.id = int(self.ida)
            CSYSGLOBAL = mapy.constants.CSYSGLOBAL
            self.rcid = 0
            self.rcobj = CSYSGLOBAL
        
    def add2model(self, model):
        self.model = model
        model.coorddict[self.id] = self
        if  self.idb <> None\
        and self.g1b <> None and self.g2b <> None and self.g3b <> None:
            if self.__class__.__name__.find('CoordR') > -1:
                newcsys = CoordR( int(self.idb), None, None, None, None )
            if self.__class__.__name__.find('CoordC') > -1:
                newcsys = CoordC( int(self.idb), None, None, None, None )
            if self.__class__.__name__.find('CoordS') > -1:
                newcsys = CoordS( int(self.idb), None, None, None, None )
            newcsys.ida   = self.idb
            newcsys.id    = self.idb
            newcsys.rcid  = self.rcid
            newcsys.rcobj = self.rcobj
            newcsys.card  = self.card
            newcsys.entryclass = self.entryclass
            newcsys.g1a   = self.g1b
            newcsys.g2a   = self.g2b
            newcsys.g3a   = self.g3b
            newcsys.model = model
            model.coorddict[newcsys.id] = newcsys
            self.idb      = None
            self.g1b      = None
            self.g2b      = None
            self.g3b      = None

    def check_to_rebuild( self ):
        if   self.a1 <> None and self.a2 <> None and self.a3 <> None \
        and  self.b1 <> None and self.b2 <> None and self.b3 <> None \
        and  self.c1 <> None and self.c2 <> None and self.c3 <> None:
            rcobj = self.model.coorddict[ int(self.rcid) ]
            if rcobj.rebuilt:
                return True
            else:
                return False
        elif self.ida <> None \
        and  self.g1a <> None and self.g2a <> None and self.g3a <> None:
            g1a       = self.model.griddict[ int(self.g1a) ]
            g2a       = self.model.griddict[ int(self.g2a) ]
            g3a       = self.model.griddict[ int(self.g3a) ]
            if not g1a.rebuilt \
            or not g2a.rebuilt \
            or not g3a.rebuilt:
                return False
            else: 
                return True

        else:
            print 'FIXME'
            raise

    def rebuild(self, rcobj = None, force_new_axis = False ):
        new_axis = False
        if self.o == None or self.z == None or self.vecxz == None:
            new_axis = True
        if not new_axis:
            if self.o.__class__.__name__.find('Point') == -1:
                self.o = Point( np.array([ 0,0,0 ], dtype=FLOAT ) )
            if self.z == None:
                print 'Please, enter a valid z axis...'
                raise
            if self.vecxz == None:
                print 'Please, enter a valid vector in the xz plane...'
                raise
            if self.z.__class__.__name__.find('Vec') == -1:
                self.z = Vec( self.z )
            if self.vecxz.__class__.__name__.find('Vec') == -1:
                self.vecxz = Vec( self.vecxz )
        if new_axis or force_new_axis:
            if self.model == None:
                print 'The coordinate system must belong to a model...'
                print 'the user may create a coordsys giving directly:'
                print '- origin as a alg3dpy.Point'
                print '- z axis as a alg3dpy.Vec'
                print '- alg3dpy.Vec laying on xz plane'
                raise
            if   self.a1 <> None and self.a2 <> None and self.a3 <> None \
            and  self.b1 <> None and self.b2 <> None and self.b3 <> None \
            and  self.c1 <> None and self.c2 <> None and self.c3 <> None:
                self.rcobj = self.model.coorddict[ int(self.rcid) ]
                if self.rcobj.rebuilt:
                    #FIXME destroying the reference to rcobj original
                    p1 = np.array([self.a1, self.a2, self.a3], dtype=FLOAT)
                    p2 = np.array([self.b1, self.b2, self.b3], dtype=FLOAT)
                    p3 = np.array([self.c1, self.c2, self.c3], dtype=FLOAT)
                    CSYSGLOBAL = mapy.constants.CSYSGLOBAL
                    p1 = self.rcobj.transform( p1, CSYSGLOBAL )
                    p2 = self.rcobj.transform( p2, CSYSGLOBAL )
                    p3 = self.rcobj.transform( p3, CSYSGLOBAL )
                    self.rcid  = CSYSGLOBAL.id 
                    self.rcobj  = CSYSGLOBAL
                    self.o     = p1
                    self.z     = p2 - p1
                    self.vecxz = p3 - p1

                else:
                    print 'The coordsys cannot be rebuilt. The reference'
                    print 'coordsys given by rcid is not rebuilt...'
                    raise
            elif self.ida <> None\
            and  self.g1a <> None and self.g2a <> None and self.g3a <> None:
                g1a       = self.model.griddict[ int(self.g1a) ]
                g2a       = self.model.griddict[ int(self.g2a) ]
                g3a       = self.model.griddict[ int(self.g3a) ]
                if not g1a.rebuilt \
                or not g2a.rebuilt \
                or not g3a.rebuilt:
                    print 'The coordsys cannot be rebuilt. The reference'
                    print 'grids g1a, g2a and g3a are not rebuilt...'
                    raise
                self.o     = Point( g1a.array )
                self.z     = g2a - g1a
                self.vecxz = g3a - g1a 
            else:
                print 'Something wrong with your inputs'
                print 'Please, see all the attributes below:'
                for slot in self.__slots__:
                    print '\t' + slot + '', getattr(self, slot)
                raise 

        self.y  = self.z.cross( self.vecxz )
        self.x  = self.y.cross(     self.z )
        self.xy = Plane(  self.z[0],  self.z[1],  self.z[2], self.o.mod() ) 
        self.xz = Plane( -self.y[0], -self.y[1], -self.y[2], self.o.mod() )
        self.yz = Plane(  self.x[0],  self.x[1],  self.x[2], self.o.mod() )
        self.rebuilt = True
            
    def transform(self, vec, new_csys):
        """
        The transformation will go as follows:
            - transform to cartesian in the local coordsys;
            - rotate to the new_csys (which is cartesian);
            - translate to the new_csys.
        All systems: cartesian, cylindrical or spherical; have
        the method vec2cr which will automatically transform vec into
        cartesian coordinates in the local coordsys.
        The two other steps will rotate and translate vec to new_csys.
        The last step will transform again from the new_csys cartesian
        coordinates to its cylindrical or spherical coordinates.
        All coordinate systems have the method cr2me to transform from
        local cartesian to local something.
            
        """
        #FIXME modify this to keep the original reference to rcobj
        if new_csys == None:
            new_csys = CSYSGLOBAL 
        vec_cr = self.vec2cr( vec )
        R      = self.Rmatrix( new_csys )
        vec_rot = np.dot( R, vec_cr ) 
        vec_t  = self.translate( vec_rot, new_csys ) 
        vec_final = new_csys.cr2me( vec_t )
        return vec_final
                 
    def translate(self, vec, newcr):
        """
        Calculates the translation matrix to a new cartesian system (newcr)
        """
        vec = Vec( vec )
        vec_t = vec + newcr.o + self.o
        return vec_t

    def Rmatrix(self, newcr):
        """
        Calculates the rotation matrix to a new cartesian system (newcr)
        """
        cosb = cosplanevec( newcr.xy, self.x )
        sinb = sinplanevec( newcr.xy, self.x )
        cosg = cosplanevec( newcr.xz, self.x )
        sing = sinplanevec( newcr.xz, self.x )
        tmpT =  np.array([\
            [ -sing,  ZER, ZER ],
            [   ZER, cosg, ZER ],
            [   ZER,  ZER, ZER ]])
        Y2 = Vec( np.dot( tmpT, newcr.y.array ) )
        cosa = cos2vecs( Y2, self.y )
        sina = sin2vecs( Y2, self.y )
        Rself = np.array([\
           [ cosb*cosg               ,  cosb*sing ,                  -sinb ], \
           [-cosa*sing+cosg*sina*sinb,  cosa*cosg+sina*sinb*sing, cosb*sina], \
           [ sina*sing+cosa*cosg*sinb, -cosg*sina+cosa*sinb*sing, cosa*cosb]],\
                                                                  dtype=FLOAT)
        R2new = Rself.transpose()
        return R2new

    def R2basic(self):
        return self.Rmatrix( CSYSGLOBAL )
Esempio n. 4
0
    def rebuild(self, rcobj = None, force_new_axis = False ):
        new_axis = False
        if self.o == None or self.z == None or self.vecxz == None:
            new_axis = True
        if not new_axis:
            if self.o.__class__.__name__.find('Point') == -1:
                self.o = Point( np.array([ 0,0,0 ], dtype=FLOAT ) )
            if self.z == None:
                print 'Please, enter a valid z axis...'
                raise
            if self.vecxz == None:
                print 'Please, enter a valid vector in the xz plane...'
                raise
            if self.z.__class__.__name__.find('Vec') == -1:
                self.z = Vec( self.z )
            if self.vecxz.__class__.__name__.find('Vec') == -1:
                self.vecxz = Vec( self.vecxz )
        if new_axis or force_new_axis:
            if self.model == None:
                print 'The coordinate system must belong to a model...'
                print 'the user may create a coordsys giving directly:'
                print '- origin as a alg3dpy.Point'
                print '- z axis as a alg3dpy.Vec'
                print '- alg3dpy.Vec laying on xz plane'
                raise
            if   self.a1 <> None and self.a2 <> None and self.a3 <> None \
            and  self.b1 <> None and self.b2 <> None and self.b3 <> None \
            and  self.c1 <> None and self.c2 <> None and self.c3 <> None:
                self.rcobj = self.model.coorddict[ int(self.rcid) ]
                if self.rcobj.rebuilt:
                    #FIXME destroying the reference to rcobj original
                    p1 = np.array([self.a1, self.a2, self.a3], dtype=FLOAT)
                    p2 = np.array([self.b1, self.b2, self.b3], dtype=FLOAT)
                    p3 = np.array([self.c1, self.c2, self.c3], dtype=FLOAT)
                    CSYSGLOBAL = mapy.constants.CSYSGLOBAL
                    p1 = self.rcobj.transform( p1, CSYSGLOBAL )
                    p2 = self.rcobj.transform( p2, CSYSGLOBAL )
                    p3 = self.rcobj.transform( p3, CSYSGLOBAL )
                    self.rcid  = CSYSGLOBAL.id 
                    self.rcobj  = CSYSGLOBAL
                    self.o     = p1
                    self.z     = p2 - p1
                    self.vecxz = p3 - p1

                else:
                    print 'The coordsys cannot be rebuilt. The reference'
                    print 'coordsys given by rcid is not rebuilt...'
                    raise
            elif self.ida <> None\
            and  self.g1a <> None and self.g2a <> None and self.g3a <> None:
                g1a       = self.model.griddict[ int(self.g1a) ]
                g2a       = self.model.griddict[ int(self.g2a) ]
                g3a       = self.model.griddict[ int(self.g3a) ]
                if not g1a.rebuilt \
                or not g2a.rebuilt \
                or not g3a.rebuilt:
                    print 'The coordsys cannot be rebuilt. The reference'
                    print 'grids g1a, g2a and g3a are not rebuilt...'
                    raise
                self.o     = Point( g1a.array )
                self.z     = g2a - g1a
                self.vecxz = g3a - g1a 
            else:
                print 'Something wrong with your inputs'
                print 'Please, see all the attributes below:'
                for slot in self.__slots__:
                    print '\t' + slot + '', getattr(self, slot)
                raise 

        self.y  = self.z.cross( self.vecxz )
        self.x  = self.y.cross(     self.z )
        self.xy = Plane(  self.z[0],  self.z[1],  self.z[2], self.o.mod() ) 
        self.xz = Plane( -self.y[0], -self.y[1], -self.y[2], self.o.mod() )
        self.yz = Plane(  self.x[0],  self.x[1],  self.x[2], self.o.mod() )
        self.rebuilt = True
Esempio n. 5
0
class Coord(object):
    """
    Each coordinate system is defined by three points:
        rcid: reference coordinate system in which all the others are
             defined. If not given the basic cartesian system will be used.
        o:  the origin
        z:  the Z axis
        vecxz: a point laying in the azimuthal origin
    Basically the point are defined using reference GRIDs or POINT coordinates.

    Attributes:
    ____________________________________________________________________________
    card       the card name (NASTRAN etc)
    entryclass path to the class name
    id         coordinate system id
    rcid       reference coordsys id
    rcobj      pointer to the reference coordsys object
    o          the origin of the coordsys alg3dpy.Point
    x          the x vector of the coordsys
    y          the y vector of the coordsys
    z          the z vector of the coordsys
    xy         the xy plane of the coordsys
    xz         the xz plane of the coordsys
    yz         the yz plane of the coordsys
    vecxz      a vector laying in the xz plane of the coordsys
    a1, a2, a3 components of the point defining the origin
    b1, b2, b3 components of the point defining the y axis
    c1, c2, c3 components of the point defining the xz plane
    ida, idb   id of coordsys "a" or "b" when creating two coordsys in the
               same card. In NASTRAN, the cards: CORD1R, CORD1C or CORD1S
    g1a, g1b   grid defining the origin of coordsys "a" or "b"
    g2a, g2b   grid defining the z axis of coordsys "a" or "b"
    g3a, g3b   grid defining the xz plane of coordsys "a" or "b"
    model      pointer to the model object it belongs to
    rebuilt    a flag to tell if this coordsys is already rebuilt
    ____________________________________________________________________________

    Note: not all attributes are used simultaneously, but the Coord class is
          already prepared for many ways for defining a coordsys
    ____________________________________________________________________________
    """
    __slots__ = [ 'card','entryclass','id','rcid','rcobj','o','x','y','z',
                  'xy','xz','yz','vecxz',
                  'a1','a2','a3','b1','b2','b3','c1','c2','c3',
                  'ida','idb','g1a','g2a','g3a','g1b','g2b','g3b',
                  'model','rebuilt' ]

    def __init__(self, id=None, o=None, rcid=None, z=None, vecxz=None):
        self.card = None
        self.entryclass = None
        inputs = {}
        if id.__class__.__name__ == 'dict':
            inputs = id
            id = None
        self.id    = id
        self.rcid  = rcid
        self.rcobj = None
        self.o     = o
        self.x     = None
        self.y     = None
        self.z     = z
        self.xy    = None
        self.xz    = None
        self.yz    = None
        self.vecxz = vecxz
        self.a1    = None
        self.a2    = None
        self.a3    = None
        self.b1    = None
        self.b2    = None
        self.b3    = None
        self.c1    = None
        self.c2    = None
        self.c3    = None
        self.ida   = None
        self.idb   = None
        self.g1a   = None
        self.g2a   = None
        self.g3a   = None
        self.g1b   = None
        self.g2b   = None
        self.g3b   = None
        self.model = None
        self.rebuilt = False
        self.read_inputs( inputs )

    def read_inputs(self, inputs={}):
        from mapy.reader import user_setattr
        if len(inputs) > 0:
            self = user_setattr(self, inputs)
        if self.id is None and self.ida is not None:
            from mapy.constants import CSYSGLOBAL
            self.id = int(self.ida)
            self.rcid = 0
            self.rcobj = CSYSGLOBAL

    def add2model(self, model):
        self.model = model
        model.coorddict[self.id] = self
        if  self.idb is not None\
        and self.g1b is not None and self.g2b is not None and self.g3b is not None:
            if self.__class__.__name__.find('CoordR') > -1:
                newcsys = CoordR( int(self.idb), None, None, None, None )
            if self.__class__.__name__.find('CoordC') > -1:
                newcsys = CoordC( int(self.idb), None, None, None, None )
            if self.__class__.__name__.find('CoordS') > -1:
                newcsys = CoordS( int(self.idb), None, None, None, None )
            newcsys.ida   = self.idb
            newcsys.id    = self.idb
            newcsys.rcid  = self.rcid
            newcsys.rcobj = self.rcobj
            newcsys.card  = self.card
            newcsys.entryclass = self.entryclass
            newcsys.g1a   = self.g1b
            newcsys.g2a   = self.g2b
            newcsys.g3a   = self.g3b
            newcsys.model = model
            model.coorddict[newcsys.id] = newcsys
            self.idb      = None
            self.g1b      = None
            self.g2b      = None
            self.g3b      = None

    def check_to_rebuild( self ):
        if   self.a1 is not None and self.a2 is not None and self.a3 is not None \
        and  self.b1 is not None and self.b2 is not None and self.b3 is not None \
        and  self.c1 is not None and self.c2 is not None and self.c3 is not None:
            rcobj = self.model.coorddict[ int(self.rcid) ]
            if rcobj.rebuilt:
                return True
            else:
                return False
        elif self.ida is not None \
        and  self.g1a is not None and self.g2a is not None and self.g3a is not None:
            g1a       = self.model.griddict[ int(self.g1a) ]
            g2a       = self.model.griddict[ int(self.g2a) ]
            g3a       = self.model.griddict[ int(self.g3a) ]
            if not g1a.rebuilt \
            or not g2a.rebuilt \
            or not g3a.rebuilt:
                return False
            else:
                return True

        else:
            print('FIXME')
            raise NotImplementedError()

    def rebuild(self, rcobj=None, force_new_axis=False):
        from mapy.constants import CSYSGLOBAL, FLOAT
        new_axis = False
        if self.o is None or self.z is None or self.vecxz is None:
            new_axis = True
        if not new_axis:
            if self.o.__class__.__name__.find('Point') == -1:
                self.o = Point( np.array([ 0,0,0 ], dtype=FLOAT ) )
            if self.z is None:
                print('Please, enter a valid z axis...')
                raise ValueError()
            if self.vecxz is None:
                print('Please, enter a valid vector in the xz plane...')
                raise ValueError()
            if self.z.__class__.__name__.find('Vec') == -1:
                self.z = Vec( self.z )
            if self.vecxz.__class__.__name__.find('Vec') == -1:
                self.vecxz = Vec( self.vecxz )
        if new_axis or force_new_axis:
            if self.model is None:
                print('The coordinate system must belong to a model...')
                print('the user may create a coordsys giving directly:')
                print('- origin as a alg3dpy.Point')
                print('- z axis as a alg3dpy.Vec')
                print('- alg3dpy.Vec laying on xz plane')
                raise ValueError()
            if (self.a1 is not None and self.a2 is not None and self.a3 is not None
            and self.b1 is not None and self.b2 is not None and self.b3 is not None
            and self.c1 is not None and self.c2 is not None and self.c3 is not None):
                self.rcobj = self.model.coorddict[ int(self.rcid) ]
                if self.rcobj.rebuilt:
                    #FIXME destroying the reference to rcobj original
                    p1 = np.array([self.a1, self.a2, self.a3], dtype=FLOAT)
                    p2 = np.array([self.b1, self.b2, self.b3], dtype=FLOAT)
                    p3 = np.array([self.c1, self.c2, self.c3], dtype=FLOAT)
                    p1 = self.rcobj.transform( p1, CSYSGLOBAL )
                    p2 = self.rcobj.transform( p2, CSYSGLOBAL )
                    p3 = self.rcobj.transform( p3, CSYSGLOBAL )
                    self.rcid = CSYSGLOBAL.id
                    self.rcobj = CSYSGLOBAL
                    self.o = p1
                    self.z = p2 - p1
                    self.vecxz = p3 - p1

                else:
                    print('The coordsys cannot be rebuilt. The reference')
                    print('coordsys given by rcid is not rebuilt...')
                    raise
            elif self.ida is not None\
            and  self.g1a is not None and self.g2a is not None and self.g3a is not None:
                g1a       = self.model.griddict[ int(self.g1a) ]
                g2a       = self.model.griddict[ int(self.g2a) ]
                g3a       = self.model.griddict[ int(self.g3a) ]
                if not g1a.rebuilt \
                or not g2a.rebuilt \
                or not g3a.rebuilt:
                    print('The coordsys cannot be rebuilt. The reference')
                    print('grids g1a, g2a and g3a are not rebuilt...')
                    raise
                self.o     = Point( g1a.array )
                self.z     = g2a - g1a
                self.vecxz = g3a - g1a
            else:
                print('Something wrong with your inputs')
                print('Please, see all the attributes below:')
                for slot in self.__slots__:
                    print('\t' + slot + '', getattr(self, slot))
                raise ValueError()

        self.y = self.z.cross(self.vecxz)
        self.x = self.y.cross(self.z)
        self.xy = Plane(  self.z[0],  self.z[1],  self.z[2], np.linalg.norm(self.o) )
        self.xz = Plane( -self.y[0], -self.y[1], -self.y[2], np.linalg.norm(self.o) )
        self.yz = Plane(  self.x[0],  self.x[1],  self.x[2], np.linalg.norm(self.o) )
        self.rebuilt = True

    def transform(self, vec, new_csys):
        """
        The transformation will go as follows:
            - transform to cartesian in the local coordsys;
            - rotate to the new_csys (which is cartesian);
            - translate to the new_csys.
        All systems: cartesian, cylindrical or spherical; have
        the method vec2cr which will automatically transform vec into
        cartesian coordinates in the local coordsys.
        The two other steps will rotate and translate vec to new_csys.
        The last step will transform again from the new_csys cartesian
        coordinates to its cylindrical or spherical coordinates.
        All coordinate systems have the method cr2me to transform from
        local cartesian to local something.

        """
        from mapy.constants import CSYSGLOBAL
        #FIXME modify this to keep the original reference to rcobj
        if new_csys is None:
            new_csys = CSYSGLOBAL
        vec_cr = self.vec2cr( vec )
        R      = self.Rmatrix( new_csys )
        vec_rot = np.dot( R, vec_cr )
        vec_t  = self.translate( vec_rot, new_csys )
        vec_final = new_csys.cr2me( vec_t )
        return vec_final

    def translate(self, vec, newcr):
        """
        Calculates the translation matrix to a new cartesian system (newcr)
        """
        vec = Vec( vec )
        vec_t = vec + newcr.o + self.o
        return vec_t

    def Rmatrix(self, newcr):
        """
        Calculates the rotation matrix to a new cartesian system (newcr)
        """
        from constants import ZER, FLOAT
        cosb = cosplanevec( newcr.xy, self.x )
        sinb = sinplanevec( newcr.xy, self.x )
        cosg = cosplanevec( newcr.xz, self.x )
        sing = sinplanevec( newcr.xz, self.x )
        tmpT =  np.array([\
            [ -sing,  ZER, ZER ],
            [   ZER, cosg, ZER ],
            [   ZER,  ZER, ZER ]])
        Y2 = Vec( np.dot( tmpT, newcr.y.array ) )
        cosa = cos2vecs( Y2, self.y )
        sina = sin2vecs( Y2, self.y )
        Rself = np.array([\
           [ cosb*cosg               ,  cosb*sing ,                  -sinb ], \
           [-cosa*sing+cosg*sina*sinb,  cosa*cosg+sina*sinb*sing, cosb*sina], \
           [ sina*sing+cosa*cosg*sinb, -cosg*sina+cosa*sinb*sing, cosa*cosb]],\
                                                                  dtype=FLOAT)
        R2new = Rself.transpose()
        return R2new

    def R2basic(self):
        from mapy.constants import CSYSGLOBAL
        return self.Rmatrix( CSYSGLOBAL )
Esempio n. 6
0
    def rebuild(self, rcobj=None, force_new_axis=False):
        from mapy.constants import CSYSGLOBAL, FLOAT
        new_axis = False
        if self.o is None or self.z is None or self.vecxz is None:
            new_axis = True
        if not new_axis:
            if self.o.__class__.__name__.find('Point') == -1:
                self.o = Point( np.array([ 0,0,0 ], dtype=FLOAT ) )
            if self.z is None:
                print('Please, enter a valid z axis...')
                raise ValueError()
            if self.vecxz is None:
                print('Please, enter a valid vector in the xz plane...')
                raise ValueError()
            if self.z.__class__.__name__.find('Vec') == -1:
                self.z = Vec( self.z )
            if self.vecxz.__class__.__name__.find('Vec') == -1:
                self.vecxz = Vec( self.vecxz )
        if new_axis or force_new_axis:
            if self.model is None:
                print('The coordinate system must belong to a model...')
                print('the user may create a coordsys giving directly:')
                print('- origin as a alg3dpy.Point')
                print('- z axis as a alg3dpy.Vec')
                print('- alg3dpy.Vec laying on xz plane')
                raise ValueError()
            if (self.a1 is not None and self.a2 is not None and self.a3 is not None
            and self.b1 is not None and self.b2 is not None and self.b3 is not None
            and self.c1 is not None and self.c2 is not None and self.c3 is not None):
                self.rcobj = self.model.coorddict[ int(self.rcid) ]
                if self.rcobj.rebuilt:
                    #FIXME destroying the reference to rcobj original
                    p1 = np.array([self.a1, self.a2, self.a3], dtype=FLOAT)
                    p2 = np.array([self.b1, self.b2, self.b3], dtype=FLOAT)
                    p3 = np.array([self.c1, self.c2, self.c3], dtype=FLOAT)
                    p1 = self.rcobj.transform( p1, CSYSGLOBAL )
                    p2 = self.rcobj.transform( p2, CSYSGLOBAL )
                    p3 = self.rcobj.transform( p3, CSYSGLOBAL )
                    self.rcid = CSYSGLOBAL.id
                    self.rcobj = CSYSGLOBAL
                    self.o = p1
                    self.z = p2 - p1
                    self.vecxz = p3 - p1

                else:
                    print('The coordsys cannot be rebuilt. The reference')
                    print('coordsys given by rcid is not rebuilt...')
                    raise
            elif self.ida is not None\
            and  self.g1a is not None and self.g2a is not None and self.g3a is not None:
                g1a       = self.model.griddict[ int(self.g1a) ]
                g2a       = self.model.griddict[ int(self.g2a) ]
                g3a       = self.model.griddict[ int(self.g3a) ]
                if not g1a.rebuilt \
                or not g2a.rebuilt \
                or not g3a.rebuilt:
                    print('The coordsys cannot be rebuilt. The reference')
                    print('grids g1a, g2a and g3a are not rebuilt...')
                    raise
                self.o     = Point( g1a.array )
                self.z     = g2a - g1a
                self.vecxz = g3a - g1a
            else:
                print('Something wrong with your inputs')
                print('Please, see all the attributes below:')
                for slot in self.__slots__:
                    print('\t' + slot + '', getattr(self, slot))
                raise ValueError()

        self.y = self.z.cross(self.vecxz)
        self.x = self.y.cross(self.z)
        self.xy = Plane(  self.z[0],  self.z[1],  self.z[2], np.linalg.norm(self.o) )
        self.xz = Plane( -self.y[0], -self.y[1], -self.y[2], np.linalg.norm(self.o) )
        self.yz = Plane(  self.x[0],  self.x[1],  self.x[2], np.linalg.norm(self.o) )
        self.rebuilt = True