@@ -434,42 +434,36 @@ def plot(self,data1,data2,template,gtype,gname,bg,*args,**kargs):
434434 returned .update (self .plot3D (data1 ,data2 ,tpl ,gm ,ren ,** kargs ))
435435 elif gtype in ["text" ]:
436436 if tt .priority != 0 :
437- if not (None ,None ,None ) in self ._renderers .keys ():
438- ren = self .createRenderer ()
439- self .renWin .AddRenderer (ren )
440- self .setLayer (ren ,1 )
441- self ._renderers [(None ,None ,None )]= ren
442- else :
443- ren = self ._renderers [(None ,None ,None )]
437+ # if not (None,None,None) in self._renderers.keys():
438+ ren = self .createRenderer ()
439+ self .renWin .AddRenderer (ren )
440+ self .setLayer (ren ,1 )
441+ # self._renderers[(None,None,None)]=ren
442+ # else:
443+ # ren = self._renderers[(None,None,None)]
444444 returned ["vtk_backend_text_actors" ] = vcs2vtk .genTextActor (ren ,to = to ,tt = tt )
445445 self .setLayer (ren ,tt .priority )
446446 elif gtype == "line" :
447447 if gm .priority != 0 :
448448 actors = vcs2vtk .prepLine (self .renWin ,gm )
449449 returned ["vtk_backend_line_actors" ]= actors
450450 for act ,geo in actors :
451- ren = self .fitToViewport (act ,gm .viewport ,wc = gm .worldcoordinate ,geo = geo )
452- ren .AddActor (act )
453- self .setLayer (ren ,gm .priority )
451+ ren = self .fitToViewport (act ,gm .viewport ,wc = gm .worldcoordinate ,geo = geo ,priority = gm .priority )
454452 elif gtype == "marker" :
455453 if gm .priority != 0 :
456454 actors = vcs2vtk .prepMarker (self .renWin ,gm )
457455 returned ["vtk_backend_marker_actors" ]= actors
458456 for g ,gs ,pd ,act ,geo in actors :
459- ren = self .fitToViewport (act ,gm .viewport ,wc = gm .worldcoordinate ,geo = geo )
460- ren .AddActor (act )
457+ ren = self .fitToViewport (act ,gm .viewport ,wc = gm .worldcoordinate ,geo = geo ,priority = gm .priority )
461458 if pd is None and act .GetUserTransform ():
462459 vcs2vtk .scaleMarkerGlyph (g , gs , pd , act )
463- self .setLayer (ren ,gm .priority )
464460
465461 elif gtype == "fillarea" :
466462 if gm .priority != 0 :
467463 actors = vcs2vtk .prepFillarea (self .renWin ,gm )
468464 returned ["vtk_backend_fillarea_actors" ]= actors
469465 for act ,geo in actors :
470- ren = self .fitToViewport (act ,gm .viewport ,wc = gm .worldcoordinate ,geo = geo )
471- ren .AddActor (act )
472- self .setLayer (ren ,gm .priority )
466+ ren = self .fitToViewport (act ,gm .viewport ,wc = gm .worldcoordinate ,geo = geo ,priority = gm .priority )
473467 elif gtype == "1d" :
474468 #self.renWin.AddRenderer(ren)
475469 returned .update (self .plot1D (data1 ,data2 ,tpl ,gm ))
@@ -587,11 +581,10 @@ def plot1D(self,data1,data2,tmpl,gm):
587581 return {}
588582
589583 def setLayer (self ,renderer ,priority ):
590- n = self .numberOfPlotCalls + (priority - 1 )* 10000 + 1
584+ n = self .numberOfPlotCalls + (priority - 1 )* 200 + 1
591585 nMax = max (self .renWin .GetNumberOfLayers (),n + 1 )
592586 self .renWin .SetNumberOfLayers (nMax )
593587 renderer .SetLayer (n )
594- pass
595588
596589 def plot3D (self ,data1 ,data2 ,tmpl ,gm ,ren ,** kargs ):
597590 from DV3D .Application import DV3DApp
@@ -701,11 +694,7 @@ def plotVector(self,data1,data2,tmpl,gm,vtk_backend_grid=None,vtk_backend_geo=No
701694 act .GetProperty ().SetColor (r / 100. ,g / 100. ,b / 100. )
702695 x1 ,x2 ,y1 ,y2 = vcs .utils .getworldcoordinates (gm ,data1 .getAxis (- 1 ),data1 .getAxis (- 2 ))
703696 act = vcs2vtk .doWrap (act ,[x1 ,x2 ,y1 ,y2 ],wrap )
704- ren = self .fitToViewport (act ,[tmpl .data .x1 ,tmpl .data .x2 ,tmpl .data .y1 ,tmpl .data .y2 ],[x1 ,x2 ,y1 ,y2 ])
705- if tmpl .data .priority != 0 :
706- ren .AddActor (act )
707- self .setLayer (ren ,tmpl .data .priority )
708- ren .AddActor (act )
697+ ren = self .fitToViewport (act ,[tmpl .data .x1 ,tmpl .data .x2 ,tmpl .data .y1 ,tmpl .data .y2 ],[x1 ,x2 ,y1 ,y2 ],priority = tmpl .data .priority )
709698 returned .update (self .renderTemplate (tmpl ,data1 ,gm ,taxis ,zaxis ))
710699 if self .canvas ._continents is None :
711700 continents = False
@@ -1168,10 +1157,8 @@ def plot2D(self,data1,data2,tmpl,gm,vtk_backend_grid=None,vtk_backend_geo=None):
11681157 pass
11691158 # create a new renderer for this mapper
11701159 # (we need one for each mapper because of cmaera flips)
1171- ren = self .fitToViewport (act ,[tmpl .data .x1 ,tmpl .data .x2 ,tmpl .data .y1 ,tmpl .data .y2 ],wc = [x1 ,x2 ,y1 ,y2 ],geo = geo )
1172- if tmpl .data .priority > 0 :
1173- ren .AddActor (act )
1174- self .setLayer (ren ,tmpl .data .priority )
1160+ ren = self .fitToViewport (act ,[tmpl .data .x1 ,tmpl .data .x2 ,tmpl .data .y1 ,tmpl .data .y2 ],
1161+ wc = [x1 ,x2 ,y1 ,y2 ],geo = geo ,priority = tmpl .data .priority )
11751162 returned ["vtk_backend_actors" ] = actors
11761163
11771164 if isinstance (gm ,meshfill .Gfm ):
@@ -1224,13 +1211,8 @@ def plotContinents(self,x1,x2,y1,y2,projection,wrap,tmpl):
12241211 else :
12251212 geo = None
12261213
1227- ren = self .fitToViewport (contActor ,[tmpl .data .x1 ,tmpl .data .x2 ,tmpl .data .y1 ,tmpl .data .y2 ],wc = [x1 ,x2 ,y1 ,y2 ],geo = geo )
1228- if tmpl .data .priority != 0 :
1229- self .setLayer (ren ,tmpl .data .priority )
1230- ren .AddActor (contActor )
1231- col = ren .GetActors ()
1232- col .InitTraversal ()
1233- n = col .GetNextActor ()
1214+ ren = self .fitToViewport (contActor ,[tmpl .data .x1 ,tmpl .data .x2 ,tmpl .data .y1 ,tmpl .data .y2 ],
1215+ wc = [x1 ,x2 ,y1 ,y2 ],geo = geo ,priority = tmpl .data .priority )
12341216 return {}
12351217
12361218 def renderTemplate (self ,tmpl ,data ,gm ,taxis ,zaxis ):
@@ -1622,75 +1604,109 @@ def scaleLogo(self):
16221604 self .setLayer (self .logoRenderer ,1 )
16231605 self .renWin .AddRenderer (self .logoRenderer )
16241606
1625- def fitToViewport (self ,Actor ,vp ,wc = None ,geo = None ):
1607+ def fitToViewport (self ,Actor ,vp ,wc = None ,geo = None , priority = None ):
16261608 ## Data range in World Coordinates
1609+ if priority == 0 :
1610+ return None
16271611 vp = tuple (vp )
16281612 if wc is None :
16291613 Xrg = list (Actor .GetXRange ())
16301614 Yrg = list (Actor .GetYRange ())
16311615 else :
16321616 Xrg = [float (wc [0 ]),float (wc [1 ])]
16331617 Yrg = [float (wc [2 ]),float (wc [3 ])]
1634- if Yrg [0 ]> Yrg [1 ]:
1635- #Yrg=[Yrg[1],Yrg[0]]
1636- #T.RotateY(180)
1637- Yrg = [Yrg [1 ],Yrg [0 ]]
1638- flipY = True
1639- else :
1640- flipY = False
1641- if Xrg [0 ]> Xrg [1 ]:
1642- Xrg = [Xrg [1 ],Xrg [0 ]]
1643- flipX = True
1644- else :
1645- flipX = False
1646-
1647- if geo is not None :
1648- pt = vtk .vtkPoints ()
1649- pt .SetNumberOfPoints (1 )
1650- Xrg2 = [1.e20 ,- 1.e20 ]
1651- Yrg2 = [1.e20 ,- 1.e20 ]
1652- Npts = 50.
1653- for x in numpy .arange (Xrg [0 ],Xrg [1 ],(Xrg [1 ]- Xrg [0 ])/ Npts ):
1654- for y in numpy .arange (Yrg [0 ],Yrg [1 ],(Yrg [1 ]- Yrg [0 ])/ Npts ):
1655- pt .SetPoint (0 ,x ,y ,0 )
1656- pts = vtk .vtkPoints ()
1657- geo .TransformPoints (pt ,pts )
1658- b = pts .GetBounds ()
1659- xm ,xM ,ym ,yM = b [:4 ]
1660- if xm != - numpy .inf :
1661- Xrg2 [0 ]= min (Xrg2 [0 ],xm )
1662- if xM != numpy .inf :
1663- Xrg2 [1 ]= max (Xrg2 [1 ],xM )
1664- if ym != - numpy .inf :
1665- Yrg2 [0 ]= min (Yrg2 [0 ],ym )
1666- if yM != numpy .inf :
1667- Yrg2 [1 ]= max (Yrg2 [1 ],yM )
1668- Xrg = Xrg2
1669- Yrg = Yrg2
1670- sc = self .renWin .GetSize ()
1671- wRatio = float (sc [0 ])/ float (sc [1 ])
1672- dRatio = (Xrg [1 ]- Xrg [0 ])/ (Yrg [1 ]- Yrg [0 ])
1673- vRatio = float (vp [1 ]- vp [0 ])/ float (vp [3 ]- vp [2 ])
16741618
1619+ wc_used = (float (Xrg [0 ]),float (Xrg [1 ]),float (Yrg [0 ]),float (Yrg [1 ]))
1620+ sc = self .renWin .GetSize ()
16751621
1676- if wRatio > 1. : #landscape orientated window
1677- yScale = 1.
1678- xScale = vRatio * wRatio / dRatio
1679- else :
1680- xScale = 1.
1681- yScale = dRatio / (vRatio * wRatio )
1682- ## Ok now we know scaling and vp, let's see if we did this already.
1683- if (vp ,xScale ,yScale ) in self ._renderers .keys ():
1622+ # Ok at this point this is all the info we need
1623+ # we can determine if it's a unique renderer or not
1624+ # let's see if we did this already.
1625+ if (vp ,wc_used ,sc ,priority ) in self ._renderers .keys ():
16841626 #yep already have one, we will use this Renderer
1685- Renderer = self ._renderers [(vp ,xScale , yScale )]
1627+ Renderer , xScale , yScale = self ._renderers [(vp ,wc_used , sc , priority )]
16861628 didRenderer = True
16871629 else :
16881630 Renderer = self .createRenderer ()
16891631 self .renWin .AddRenderer (Renderer )
1690- self ._renderers [(vp ,xScale ,yScale )]= Renderer
16911632 Renderer .SetViewport (vp [0 ],vp [2 ],vp [1 ],vp [3 ])
16921633 didRenderer = False
16931634
1635+ if Yrg [0 ]> Yrg [1 ]:
1636+ #Yrg=[Yrg[1],Yrg[0]]
1637+ #T.RotateY(180)
1638+ Yrg = [Yrg [1 ],Yrg [0 ]]
1639+ flipY = True
1640+ else :
1641+ flipY = False
1642+ if Xrg [0 ]> Xrg [1 ]:
1643+ Xrg = [Xrg [1 ],Xrg [0 ]]
1644+ flipX = True
1645+ else :
1646+ flipX = False
1647+
1648+ if geo is not None :
1649+ pt = vtk .vtkPoints ()
1650+ Xrg2 = [1.e20 ,- 1.e20 ]
1651+ Yrg2 = [1.e20 ,- 1.e20 ]
1652+ if geo .GetDestinationProjection ().GetName () in ["aeqd" ,]:
1653+ ## These need more precision to compute actual range
1654+ Npts = 250
1655+ else :
1656+ Npts = 50
1657+ NGridCover = 0
1658+ pt .SetNumberOfPoints (Npts * Npts )
1659+ for x in numpy .arange (Xrg [0 ],Xrg [1 ],(Xrg [1 ]- Xrg [0 ])/ Npts ):
1660+ for y in numpy .arange (Yrg [0 ],Yrg [1 ],(Yrg [1 ]- Yrg [0 ])/ Npts ):
1661+ pt .InsertPoint (NGridCover ,x ,y ,0 )
1662+ NGridCover += 1
1663+ pts = vtk .vtkPoints ()
1664+ #pts.SetNumberOfPoints(Npts*Npts)
1665+ geo .TransformPoints (pt ,pts )
1666+ b = pts .GetBounds ()
1667+ xm ,xM ,ym ,yM = b [:4 ]
1668+ if xm != - numpy .inf :
1669+ Xrg2 [0 ]= min (Xrg2 [0 ],xm )
1670+ if xM != numpy .inf :
1671+ Xrg2 [1 ]= max (Xrg2 [1 ],xM )
1672+ if ym != - numpy .inf :
1673+ Yrg2 [0 ]= min (Yrg2 [0 ],ym )
1674+ if yM != numpy .inf :
1675+ Yrg2 [1 ]= max (Yrg2 [1 ],yM )
1676+ Xrg = Xrg2
1677+ Yrg = Yrg2
1678+ wRatio = float (sc [0 ])/ float (sc [1 ])
1679+ dRatio = (Xrg [1 ]- Xrg [0 ])/ (Yrg [1 ]- Yrg [0 ])
1680+ vRatio = float (vp [1 ]- vp [0 ])/ float (vp [3 ]- vp [2 ])
1681+
1682+
1683+ if wRatio > 1. : #landscape orientated window
1684+ yScale = 1.
1685+ xScale = vRatio * wRatio / dRatio
1686+ else :
1687+ xScale = 1.
1688+ yScale = dRatio / (vRatio * wRatio )
1689+ self .setLayer (Renderer ,priority )
1690+ self ._renderers [(vp ,wc_used ,sc ,priority )] = Renderer ,xScale ,yScale
1691+
1692+ xc = xScale * float (Xrg [1 ]+ Xrg [0 ])/ 2.
1693+ yc = yScale * float (Yrg [1 ]+ Yrg [0 ])/ 2.
1694+ xd = xScale * float (Xrg [1 ]- Xrg [0 ])/ 2.
1695+ yd = yScale * float (Yrg [1 ]- Yrg [0 ])/ 2.
1696+ cam = Renderer .GetActiveCamera ()
1697+ cam .ParallelProjectionOn ()
1698+ cam .SetParallelScale (yd )
1699+ cd = cam .GetDistance ()
1700+ cam .SetPosition (xc ,yc ,cd )
1701+ cam .SetFocalPoint (xc ,yc ,0. )
1702+ if geo is None :
1703+ if flipY :
1704+ cam .Elevation (180. )
1705+ cam .Roll (180. )
1706+ pass
1707+ if flipX :
1708+ cam .Azimuth (180. )
1709+
16941710 T = vtk .vtkTransform ()
16951711 T .Scale (xScale ,yScale ,1. )
16961712
@@ -1734,24 +1750,7 @@ def fitToViewport(self,Actor,vp,wc=None,geo=None):
17341750 plane .SetNormal (outNormal [0 ], outNormal [1 ], outNormal [2 ])
17351751 plane = planeCollection .GetNextItem ()
17361752
1737- if not didRenderer :
1738- xc = xScale * float (Xrg [1 ]+ Xrg [0 ])/ 2.
1739- yc = yScale * float (Yrg [1 ]+ Yrg [0 ])/ 2.
1740- xd = xScale * float (Xrg [1 ]- Xrg [0 ])/ 2.
1741- yd = yScale * float (Yrg [1 ]- Yrg [0 ])/ 2.
1742- cam = Renderer .GetActiveCamera ()
1743- cam .ParallelProjectionOn ()
1744- cam .SetParallelScale (yd )
1745- cd = cam .GetDistance ()
1746- cam .SetPosition (xc ,yc ,cd )
1747- cam .SetFocalPoint (xc ,yc ,0. )
1748- if geo is None :
1749- if flipY :
1750- cam .Elevation (180. )
1751- cam .Roll (180. )
1752- pass
1753- if flipX :
1754- cam .Azimuth (180. )
1753+ Renderer .AddActor (Actor )
17551754 return Renderer
17561755
17571756 def update_input (self ,vtkobjects ,array1 ,array2 = None ,update = True ):
0 commit comments