Skip to content

Commit 14f9225

Browse files
author
David Lonie
committed
Merge pull request #1144 from doutriaux1/issue_587_projected_ticks
Issue 587 projected ticks
2 parents f7b09ef + 3f14c64 commit 14f9225

File tree

7 files changed

+333
-257
lines changed

7 files changed

+333
-257
lines changed

Packages/vcs/Lib/Canvas.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
import vcsaddons
7474
import vcs.manageElements
7575
import configurator
76+
from projection import round_projections
7677

7778
class SIGNAL(object):
7879

@@ -1978,9 +1979,9 @@ def continents(self, *args, **parms):
19781979
# #
19791980
#############################################################################
19801981
def createline(self,name=None, source='default', ltype=None,
1981-
width=None, color=None, priority=1,
1982+
width=None, color=None, priority=None,
19821983
viewport=None, worldcoordinate=None,
1983-
x=None, y=None, projection='default'):
1984+
x=None, y=None, projection=None):
19841985
return vcs.createline(name,source,ltype,width,color,priority,viewport,worldcoordinate,x,y,projection)
19851986
createline.__doc__ = vcs.manageElements.createline.__doc__
19861987

@@ -2229,7 +2230,7 @@ def drawfillarea(self, name=None, style=1, index=1, color=241,
22292230
# #
22302231
#############################################################################
22312232
def createtexttable(self,name=None, source='default', font=None,
2232-
spacing=None, expansion=None, color=None, priority=1,
2233+
spacing=None, expansion=None, color=None, priority=None,
22332234
viewport=None, worldcoordinate=None,
22342235
x=None, y=None):
22352236
return vcs.createtexttable(name,source,font,spacing,expansion,color,priority,
@@ -2263,7 +2264,7 @@ def gettextorientation(self,To_name_src='default'):
22632264
# Text Combined functions for VCS. #
22642265
# #
22652266
#############################################################################
2266-
def createtextcombined(self,Tt_name=None, Tt_source='default', To_name=None, To_source='default', font=None, spacing=None, expansion=None, color=None, priority=1, viewport=None, worldcoordinate=None, x=None, y=None, height=None, angle=None, path=None, halign=None, valign=None, projection=None):
2267+
def createtextcombined(self,Tt_name=None, Tt_source='default', To_name=None, To_source='default', font=None, spacing=None, expansion=None, color=None, priority=None, viewport=None, worldcoordinate=None, x=None, y=None, height=None, angle=None, path=None, halign=None, valign=None, projection=None):
22672268
return vcs.createtextcombined(Tt_name, Tt_source, To_name, To_source,
22682269
font, spacing, expansion, color, priority, viewport, worldcoordinate,
22692270
x, y, height, angle, path, halign, valign, projection)
@@ -2678,7 +2679,6 @@ def __plot (self, arglist, keyargs):
26782679
# copy_tmpl=self.createtemplate(source=arglist[2])
26792680
check_mthd = vcs.getgraphicsmethod(arglist[3],arglist[4])
26802681
check_tmpl = vcs.gettemplate(arglist[2])
2681-
26822682
# By defalut do the ratio thing for lat/lon and linear projection
26832683
# but it can be overwritten by keyword
26842684
Doratio = keyargs.get("ratio",None)
@@ -3482,10 +3482,11 @@ def set_convert_labels(copy_mthd,test=0):
34823482
elif tp=="default":
34833483
tp="boxfill"
34843484
gm=vcs.elements[tp][arglist[4]]
3485+
if hasattr(gm,"priority") and gm.priority==0:
3486+
return
34853487
p=self.getprojection(gm.projection)
3486-
if p.type in ["polar (non gctp)","polar stereographic"] and (doratio=="0" or doratio[:4]=="auto"):
3488+
if p.type in round_projections and (doratio=="0" or doratio[:4]=="auto"):
34873489
doratio="1t"
3488-
34893490
for keyarg in keyargs.keys():
34903491
if not keyarg in self.__class__._plot_keywords_+self.backend._plot_keywords:
34913492
warnings.warn('Unrecognized vcs plot keyword: %s, assuming backend (%s) keyword'%(keyarg,self.backend.type))
@@ -3519,6 +3520,7 @@ def set_convert_labels(copy_mthd,test=0):
35193520
# Now creates a copy of the primitives, in case it's used on other canvases with diferent ratios
35203521
if arglist[3]=='text':
35213522
nms = arglist[4].split(":::")
3523+
P=self.gettext(nms[0],nms[1])
35223524
p = self.createtext(Tt_source=nms[0],To_source=nms[1])
35233525
elif arglist[3]=='marker':
35243526
p = self.createmarker(source=arglist[4])
@@ -3532,7 +3534,7 @@ def set_convert_labels(copy_mthd,test=0):
35323534
t.data.y2 = p.viewport[3]
35333535

35343536
proj = self.getprojection(p.projection)
3535-
if proj.type in ["polar (non gctp)","polar stereographic"]:
3537+
if proj.type in round_projections and (doratio=="0" or doratio[:4]=="auto"):
35363538
doratio="1t"
35373539

35383540
if proj.type=='linear' and doratio[:4]=='auto':
@@ -3551,7 +3553,7 @@ def set_convert_labels(copy_mthd,test=0):
35513553
else:
35523554
arglist[4]=p.name
35533555
else:
3554-
if arglist[3]=='text':
3556+
if arglist[3]=='text' and keyargs.get("donotstoredisplay",False) is True:
35553557
sp = p.name.split(":::")
35563558
del(vcs.elements["texttable"][sp[0]])
35573559
del(vcs.elements["textorientation"][sp[1]])
@@ -3577,7 +3579,7 @@ def set_convert_labels(copy_mthd,test=0):
35773579
tp="textcombined"
35783580
gm=vcs.elements[tp][arglist[4]]
35793581
p=self.getprojection(gm.projection)
3580-
if p.type in ["polar (non gctp)","polar stereographic"]:
3582+
if p.type in round_projections:
35813583
doratio="1t"
35823584
if p.type == 'linear':
35833585
if gm.g_name =='Gfm':

Packages/vcs/Lib/VTKPlots.py

Lines changed: 102 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)