@@ -2719,7 +2719,7 @@ def canvas(self, value):
27192719 @property
27202720 def pos (self ):
27212721 c = self ._canvas
2722- return c .center - (norm (c .forward )* (c .range / tan (c .fov / 2 )))
2722+ return c .center - (norm (c .axis )* (c .range / tan (c .fov / 2 )))
27232723 @pos .setter
27242724 def pos (self , value ):
27252725 c = self ._canvas
@@ -2728,12 +2728,12 @@ def pos(self, value):
27282728 @property
27292729 def axis (self ):
27302730 c = self ._canvas
2731- return norm (c .forward )* ( c .range / tan (c .fov / 2 ) )
2731+ return norm (c ._axis )* ( c .range / tan (c .fov / 2 ) )
27322732 @axis .setter
27332733 def axis (self , value ):
27342734 c = self ._canvas
2735- c .center = self .pos + value # use current self.pos before it is changed by change in c.forward
2736- c .forward = norm (value )
2735+ c .center = self .pos + value # use current self.pos before it is changed by change in c.axis
2736+ c .axis = norm (value )
27372737 c .range = mag (value )* tan (c .fov / 2 )
27382738
27392739 @property
@@ -2744,14 +2744,17 @@ def up(self, value):
27442744 self ._canvas .up = value
27452745
27462746 def rotate (self , angle = 0 , axis = None , origin = None ):
2747+ if angle == 0 : return
27472748 c = self ._canvas
27482749 if axis is None : axis = c .up
2749- newaxis = self .axis .rotate (angle = angle , axis = axis )
2750- newpos = self .pos
2751- if origin is not None :
2752- newpos = origin + (self .pos - origin ).rotate (angle = angle , axis = axis )
2753- c .center = newpos + newaxis
2754- c .forward = norm (newaxis )
2750+ if origin is not None and origin != self .pos :
2751+ origin = self .pos + (self .pos - origin ).rotate (angle = angle , axis = axis )
2752+ else :
2753+ origin = self .pos
2754+ if c ._axis .diff_angle (axis ) > 1e-6 :
2755+ c .axis = c ._axis .rotate (angle = angle , axis = axis )
2756+ c .up = c ._up .rotate (angle = angle , axis = axis )
2757+ c .center = origin + self .axis
27552758
27562759class meta_canvas (object ):
27572760 @property
@@ -2794,7 +2797,8 @@ def __init__(self, **args):
27942797
27952798 # The following determine the view:
27962799 self ._range = 1 # user can alter with zoom
2797- self ._forward = vector (0 ,0 ,- 1 ) # user can alter with spin
2800+ self ._axis = vector (0 ,0 ,- 1 ) # user can alter with spin
2801+ self ._forward = vector (0 ,0 ,- 1 ) # self.axis is primal internally; self._forward is now a synonym
27982802 self ._up = vector (0 ,1 ,0 ) # user with touch screen can rotate around z
27992803 self ._autoscale = True # set False if user zooms
28002804 self ._center = vector (0 ,0 ,0 ) # cannot be altered by user
@@ -2997,11 +3001,20 @@ def center(self,value):
29973001 raise TypeError ('center must be a vector' )
29983002
29993003 @property
3000- def forward (self ):
3001- return self ._forward
3004+ def axis (self ):
3005+ return self ._axis
3006+ @axis .setter
3007+ def axis (self ,value ):
3008+ self ._axis = self ._set_forward = vector (value )
3009+ if not self ._constructing :
3010+ self .appendcmd ({"forward" :value .value })
3011+
3012+ @property
3013+ def forward (self ): # scene.forward is an external synonym for scene.axis
3014+ return self ._axis
30023015 @forward .setter
30033016 def forward (self ,value ):
3004- self ._forward = self ._set_forward = vector (value )
3017+ self ._axis = self ._set_forward = vector (value )
30053018 if not self ._constructing :
30063019 self .appendcmd ({"forward" :value .value })
30073020
@@ -3121,7 +3134,6 @@ def handle_event(self, evt): ## events and scene info updates
31213134 self .mouse .setpick ( evt )
31223135 self ._waitfor = True # what pick is looking for
31233136 elif ev == '_compound' : # compound, text, extrusion
3124- print ('compound event return' )
31253137 obj = self ._compound
31263138 p = evt ['pos' ]
31273139 if obj ._objName == 'text' :
0 commit comments