Changeset 677

Show
Ignore:
Timestamp:
09/02/03 19:04:49 (5 years ago)
Author:
sholloway
Message:

"use" and "symbol" elements now workcorrectly

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBRapier/RBRapier/Formats/SVG/RapierRenderItems.py

    r675 r677  
    8585 
    8686class Transform(Transformations2d.Composite): 
     87    viewport = (0., 0., 0., 0.) 
     88    def GetViewport(self): 
     89        return self.viewport 
     90    def SetViewport(self, pos, size): 
     91        self.viewport = pos[0], pos[1], size[0], size[1] 
     92 
    8793    def __mul__(self, other): 
    8894        if isinstance(other, Transform): 
     
    100106        result = self.__class__() 
    101107        result.collection = self.collection[:] 
     108        result.viewport = self.viewport[:] 
    102109        return result 
    103110 
     
    489496        self.style = Style(style) 
    490497 
     498    def IsGroupRendered(self): 
     499        return True 
     500 
    491501    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    492502 
     
    526536        for child in children: 
    527537            if isinstance(child, RenderItem): 
    528                 self.renderChildren.append(child) 
    529             else: 
    530                 self.otherChildren.append(child) 
     538                if child.IsGroupRendered(): 
     539                    self.renderChildren.append(child) 
     540                    continue 
     541            self.otherChildren.append(child) 
    531542 
    532543#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    533544 
    534545class UseRenderItem(RenderItem): 
     546    dimensions = (0.,0.) 
     547    position = (0.,0.) 
     548 
    535549    def Compile(self, style=None, transform=None, target=None): 
    536550        style, transform = self._GetStyleAndTransform(style, transform) 
    537551        self.useitem.Compile(style, transform, target) 
    538552 
    539     #~ SVG Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     553    def _GetStyleAndTransform(self, style=None, transform=None): 
     554        style, transform = RenderItem._GetStyleAndTransform(self, style, transform) 
     555        transform.SetViewport(self.position, self.dimensions) 
     556        return style, transform 
     557 
     558    #~ SVG Settings ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     559 
     560    def SetPosition(self, position): 
     561        self.position = position 
     562    def SetDimensions(self, width, height): 
     563        self.dimensions = width, height 
    540564 
    541565    def SetUseItem(self, useitem): 
     
    548572    dimensions = (None, None) 
    549573    alignment = ('xmid', 'ymid', 'meet') 
    550     position = (0, 0
     574    position = (None, None
    551575 
    552576    def _GetStyleAndTransform(self, style=None, transform=None): 
    553         vx, vy, vw, vh = self.viewbox 
    554         uw, uh = self.dimensions 
    555         uw = uw or 2. # 1 - -1 
    556         uh = uh or 2. # 1 - -1 
    557  
    558577        if transform is None: 
    559578            # This implies that the default OpenGL portal is setup and the 
     
    564583 
    565584            transform = Transform() 
    566             transform.matrix(2./uw, 0., -1., 0., -2./uh, 1.) 
     585            transform.scale(1., -1.) 
     586            ux, uy, uw, uh = -1., -1., 2., 2. 
     587        else:  
     588            transform = transform.copy() 
     589            ux, uy, uw, uh = transform.GetViewport() 
     590 
     591            if self.position != (None, None): 
     592                ux, uy = self.position 
     593            if self.dimensions != (None, None): 
     594                uw, uh = self.dimensions 
     595 
     596        vx, vy, vw, vh = self.viewbox or (0, 0, 0, 0) 
     597        uw, uh = uw or vw, uh or vh 
    567598 
    568599        if vw > 0. and vh > 0.: 
     
    570601            vy = vy or 0. 
    571602 
    572             transform = transform.copy() 
    573603            xalign, yalign, aligntype = [s and s.lower() or s for s in self.alignment] 
    574604            nw = float(vw)/uw 
     
    594624                sx, sy = uw/vw, uh/vh 
    595625 
    596             if xalign == 'xmin': tx = vx 
    597             elif xalign == 'xmid': tx = vx - 0.5*(uw/sx-vw
    598             elif xalign == 'xmax': tx = vx - (uw/sx-vw
    599             else: tx = vx - 0.5*(uw/sx-vw
    600  
    601             if yalign == 'ymin': ty = vy 
    602             elif yalign == 'ymid': ty = vy - 0.5*(uh/sy-vh
    603             elif yalign == 'ymax': ty = vy - (uh/sy-vh
    604             else: ty = vy - 0.5*(uh/sy-vh
    605  
    606             transform.matrix(sx, 0., sx*-tx, 0., sy, sy*-ty) 
     626            if xalign == 'xmin': tx = ux - sx*vx + 0. 
     627            elif xalign == 'xmid': tx = ux - sx*vx + 0.5*(uw-vw*sx
     628            elif xalign == 'xmax': tx = ux - sx*vx + (uw-vw*sx
     629            else: tx = ux - sx*vx + 0.5*(uw-vw*sx
     630 
     631            if yalign == 'ymin': ty = uy - sy*vy + 0. 
     632            elif yalign == 'ymid': ty = uy - sy*vy + 0.5*(uh-vh*sy
     633            elif yalign == 'ymax': ty = uy - sy*vy + (uh-vh*sy
     634            else: ty = uy - sy*vy + 0.5*(uh-vh*sy
     635 
     636            transform.matrix(sx, 0., tx, 0., sy, ty) 
    607637 
    608638        return GroupRenderItem._GetStyleAndTransform(self, style, transform) 
     
    617647    def SetAlignment(self, xalign, yalign, alignstyle): 
    618648        self.alignment = xalign, yalign, alignstyle 
     649 
     650#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     651 
     652class SymbolGroup(ContainerGroupRenderItem): 
     653    def IsGroupRendered(self): 
     654        return False 
     655 
     656#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    619657 
    620658class SVGGroupRenderItem(ContainerGroupRenderItem): 
     
    891929        'circle': Circle, 
    892930         
    893         #'use': UseRenderItem, 
    894         #'symbol': ContainerGroupRenderItem
     931        'use': UseRenderItem, 
     932        'symbol': SymbolGroup
    895933        #'pattern': None, 
    896934        #'marker': None, 
  • trunk/RBRapier/RBRapier/Formats/SVG/SVGSkin/use.py

    r657 r677  
    3636        StyledSVGItem.InterpretSettings(self, settings) 
    3737 
     38        width = settings.get('width', None) 
     39        if width is not None: 
     40            width = self._asCoord(width) 
     41            if width < 0 and width is not None: 
     42                raise ValueError, '"width" attribute can not be negative"' 
     43        height = settings.get('height', None) 
     44        if height is not None: 
     45            height = self._asCoord(height) 
     46            if height < 0 and height is not None: 
     47                raise ValueError, '"height" attribute can not be negative"' 
     48        self.object.SetDimensions(width, height) 
     49 
    3850        xlink = settings[('http://www.w3.org/1999/xlink', 'href')] 
    3951        try: 
  • trunk/RBRapier/RBRapier/Formats/SVG/SVGSkinner.py

    r657 r677  
    3535    ## Long names 
    3636    ('http://www.w3.org/2000/svg',): EF.CachedTryList([ 
    37         EF.NodeImport('RBRapier.Formats.SVGNew.SVGSkin'),  
    38         EF.StaticImport('RBRapier.Formats.SVGNew.SVGSkin.UnknownElement', 'UnknownElement'), 
     37        EF.NodeImport('RBRapier.Formats.SVG.SVGSkin'),  
     38        EF.StaticImport('RBRapier.Formats.SVG.SVGSkin.UnknownElement', 'UnknownElement'), 
    3939        ]), 
    4040