Skip to content

Commit ced9016

Browse files
committed
Fix zero-length axis and size
1 parent b351446 commit ced9016

File tree

1 file changed

+38
-13
lines changed

1 file changed

+38
-13
lines changed

vpython/vpython.py

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ def setup(self, args):
585585
del args['_objName']
586586

587587
# default values
588+
self._sizing = True # axis/size connection is the default; False for sphere, ring, text, compound
588589
self._pos = vector(0,0,0)
589590
self._axis = vector(1,0,0)
590591
self._up = vector(0,1,0)
@@ -761,32 +762,52 @@ def up(self,value):
761762
def axis(self):
762763
return self._axis
763764
@axis.setter
764-
def axis(self,value):
765-
self._save_oldaxis = adjust_up(self._axis, value, self._up, self._save_oldaxis) # this sets self._axis and self._up
765+
def axis(self,value): # sphere or ring or text or compound have no axis/size link
766+
currentaxis = self._axis
767+
self._axis = value
768+
if value.mag2 == 0:
769+
if self._save_oldaxis is None: self._save_oldaxis = currentaxis
770+
else:
771+
if self._save_oldaxis is not None:
772+
self._save_oldaxis = adjust_up(self._axis, value, self._up, self._save_oldaxis) # this sets self._axis and self._up
766773
if not self._constructing:
767774
self.addattr('axis')
768-
self._size._x = value.mag # changing axis length changes size.x
775+
if self._sizing:
776+
self._size._x = value.mag # changing axis length changes size.x
769777

770778
@property
771779
def size(self):
772780
return self._size
773781
@size.setter
774-
def size(self,value):
775-
self._size.value = value
782+
def size(self,value): # sphere or ring or text or compound have no axis/size link
783+
currentaxis = self._axis
784+
self._size = value
785+
if value.x == 0:
786+
if self._save_oldaxis is not None:
787+
currentaxis = self._save_oldaxis
788+
self._save_oldaxis = None
789+
else:
790+
currentaxis = vector(1,0,0)
776791
if not self._constructing:
777792
self.addattr('size')
778-
a = self._axis.norm() * value.x
779-
if mag(self._axis) == 0:
780-
a = vector(value.x,0,0)
781-
self._axis.value = a # changing size changes length of axis
793+
if self._sizing:
794+
self._axis = currentaxis.norm()*value.x
782795

783796
@property
784797
def length(self):
785798
return self._size.x
786799
@length.setter
787800
def length(self,value):
788-
self._axis = self._axis.norm() * value
789-
self._size._x = value
801+
if value == 0:
802+
if self._save_oldaxis is None: self._save_oldaxis = vector(self._axis.x, self._axis.y, self._axis.z)
803+
self._axis = vector(0,0,0)
804+
self._size._x = 0
805+
else:
806+
if self._save_oldaxis is not None:
807+
self._axis = self._save_oldaxis
808+
self._save_oldaxis = None
809+
if self._size._x == 0: self.axis = vector(value, 0, 0)
810+
else: self.axis = value*self._axis.norm() # this will set length
790811
if not self._constructing:
791812
self.addattr('axis')
792813
self.addattr('size')
@@ -1122,6 +1143,7 @@ def __init__(self, **args):
11221143
args['_default_size'] = vector(2,2,2)
11231144
args['_objName'] = "sphere"
11241145
super(sphere, self).setup(args)
1146+
self._sizing = False # no axis/size connection
11251147

11261148
@property
11271149
def radius(self):
@@ -1212,6 +1234,7 @@ def __init__(self, **args):
12121234
args['_default_size'] = vector(0.2,2.2,2.2)
12131235
args['_objName'] = "ring"
12141236
super(ring, self).setup(args)
1237+
self._sizing = False # no axis/size connection
12151238

12161239
@property
12171240
def thickness(self):
@@ -1467,6 +1490,7 @@ def __init__(self, objList, **args):
14671490
self.compound_idx += 1
14681491
args['_objName'] = 'compound'+str(self.compound_idx)
14691492
super(compound, self).setup(args)
1493+
self._sizing = False # no axis/size connection
14701494

14711495
for obj in objList:
14721496
# GlowScript will make the objects invisible, so need not set obj.visible
@@ -3859,6 +3883,7 @@ def end_face_color(self,value):
38593883
class text(standardAttributes):
38603884

38613885
def __init__(self, **args):
3886+
self._sizing = False # no axis/size connection
38623887
args['_default_size'] = vector(1,1,1) # to keep standardAttributes happy
38633888
args['_objName'] = "text"
38643889
self._height = 1 ## not derived from size
@@ -3913,10 +3938,10 @@ def axis(self):
39133938
return self._axis
39143939
@axis.setter
39153940
def axis(self,value): # changing axis does not affect size
3916-
oldaxis = vector(self.axis)
3941+
old = vector(self.axis)
39173942
u = self.up
39183943
self._axis.value = value
3919-
self._save_oldaxis = adjust_up(norm(oldaxis), self._axis, self._up, self._save_oldaxis)
3944+
self._save_oldaxis = adjust_up(norm(old), self._axis, self._up, self._save_oldaxis)
39203945
self.addattr('axis')
39213946
self.addattr('up')
39223947

0 commit comments

Comments
 (0)