I have a problem with a python object not recognizing its attributes at load time.
The object is created from this code (this is part of the NiCr workbench for FreeCAD: https://github.com/JMG1/NiCr/tree/master/Workbench ):
Code: Select all
class SimMachine:
def __init__( self, obj ):
# geometric properties
obj.addProperty( 'App::PropertyFloat',
'XLength',
'Machine Geometry' ).XLength = 800.0
obj.addProperty( 'App::PropertyFloat',
'YLength',
'Machine Geometry' ).YLength = 600.0
obj.addProperty( 'App::PropertyFloat',
'ZLength',
'Machine Geometry' ).ZLength = 800.0
obj.addProperty( 'App::PropertyFloat',
'FrameDiameter',
'Machine Geometry' ).FrameDiameter = 30.0
obj.Proxy = self
self.addMachineToDocument( obj.FrameDiameter, obj.XLength, obj.YLength, obj.ZLength, created=False )
def onChanged( self, fp, prop):
if prop == 'XLength' or prop == 'YLength' or prop == 'ZLength' or prop == 'FrameDiameter':
self.addMachineToDocument( fp.FrameDiameter, fp.XLength, fp.YLength, fp.ZLength )
#pass
def execute( self, fp ):
#dbm( 'e' )
#self.addMachineToDocument( fp.FrameDiameter, fp.XLength, fp.YLength, fp.ZLength )
pass
def buildMachine( self, tube_diameter, w_x, w_y, w_z ):
# machine frame
#dbm( '2.1' )
main_cube = Part.makeBox( w_x + 2*tube_diameter,
w_y + 2*tube_diameter,
w_z + 2*tube_diameter )
xy_cutcube = Part.makeBox( w_x,
w_y,
w_z*1.5,
FreeCAD.Vector( tube_diameter,
tube_diameter,
-tube_diameter ) )
xz_cutcube = Part.makeBox( w_x,
w_y*1.5,
w_z,
FreeCAD.Vector( tube_diameter,
-tube_diameter,
tube_diameter ) )
yz_cutcube = Part.makeBox( w_x*1.5,
w_y,
w_z,
FreeCAD.Vector( -tube_diameter,
tube_diameter,
tube_diameter ) )
frame = main_cube.cut( xy_cutcube )
frame = frame.cut( xz_cutcube )
frame = frame.cut( yz_cutcube )
#dbm( '2.2' )
# machine x axis frame
xa_frame = Part.makeBox( tube_diameter,
w_y,
tube_diameter,
FreeCAD.Vector( tube_diameter*1.1,
tube_diameter,
0 ) )
xb_frame = Part.makeBox( tube_diameter,
w_y,
tube_diameter,
FreeCAD.Vector( tube_diameter*1.1,
tube_diameter,
w_z + tube_diameter ) )
# machine y axis frame
ya_frame = Part.makeBox( tube_diameter*1.2,
tube_diameter*1.6,
tube_diameter*1.2,
FreeCAD.Vector( tube_diameter,
tube_diameter,
-tube_diameter*0.1 ) )
yb_frame = Part.makeBox( tube_diameter*1.2,
tube_diameter*1.6,
tube_diameter*1.2,
FreeCAD.Vector( tube_diameter,
tube_diameter,
w_z + tube_diameter*0.9 ) )
#dbm('2.3')
return frame, xa_frame, xb_frame, ya_frame, yb_frame
def addMachineToDocument(self, FrameDiameter, XLength, YLength, ZLength, created=True):
# temporal workarround until:http://forum.freecadweb.org/viewtopic.php?f=22&t=13337
#dbm( '0' )
mfolder = FreeCAD.ActiveDocument.getObject('SimMachine')
#dbm( '1' )
# Remove previous machine parts
if created:
FreeCAD.ActiveDocument.removeObject('Frame')
FreeCAD.ActiveDocument.removeObject('XA')
FreeCAD.ActiveDocument.removeObject('XB')
FreeCAD.ActiveDocument.removeObject('YA')
FreeCAD.ActiveDocument.removeObject('YB')
# machine shapes
machine_shapes = self.buildMachine(FrameDiameter,
XLength,
YLength,
ZLength)
# temporal workaround
#mfolder = FreeCAD.ActiveDocument.addObject( 'App::DocumentObjectGroup','SimMachine' )
obj_frame = FreeCAD.ActiveDocument.addObject('Part::Feature', 'Frame')
obj_XA = FreeCAD.ActiveDocument.addObject('Part::Feature', 'XA')
obj_XB = FreeCAD.ActiveDocument.addObject('Part::Feature', 'XB')
obj_YA = FreeCAD.ActiveDocument.addObject('Part::Feature', 'YA')
obj_YB = FreeCAD.ActiveDocument.addObject('Part::Feature', 'YB')
obj_frame.Shape = machine_shapes[0]
obj_XA.Shape = machine_shapes[1]
obj_XB.Shape = machine_shapes[2]
obj_YA.Shape = machine_shapes[3]
obj_YB.Shape = machine_shapes[4]
obj_frame.ViewObject.ShapeColor = (0.67, 0.78, 0.85)
obj_XA.ViewObject.ShapeColor = (0.00, 0.67, 1.00)
obj_XB.ViewObject.ShapeColor = (0.00, 0.67, 1.00)
obj_YA.ViewObject.ShapeColor = (0.00, 1.00, 0.00)
obj_YB.ViewObject.ShapeColor = (0.00, 1.00, 0.00)
obj_frame.ViewObject.Selectable = False
obj_XA.ViewObject.Selectable = False
obj_XB.ViewObject.Selectable = False
obj_YA.ViewObject.Selectable = False
obj_YB.ViewObject.Selectable = False
mfolder.addObject(obj_frame)
mfolder.addObject(obj_XA)
mfolder.addObject(obj_XB)
mfolder.addObject(obj_YA)
mfolder.addObject(obj_YB)
class SimMachineViewProvider:
def __init__(self, obj):
obj.Proxy = self
def getDefaultDisplayMode(self):
return "Flat Lines"
def getIcon(self):
import os
__dir__ = os.path.dirname(__file__)
return __dir__ + '/icons/CreateMachine.svg'
Code: Select all
Traceback (most recent call last):
File "/home/javier/.FreeCAD/Mod/Workbench/NiCrSimMachine.py", line 53, in onChanged
self.addMachineToDocument( fp.FrameDiameter, fp.XLength, fp.YLength, fp.ZLength )
<type 'exceptions.AttributeError'>: 'FeaturePython' object has no attribute 'YLength'
Traceback (most recent call last):
File "/home/javier/.FreeCAD/Mod/Workbench/NiCrSimMachine.py", line 53, in onChanged
self.addMachineToDocument( fp.FrameDiameter, fp.XLength, fp.YLength, fp.ZLength )
<type 'exceptions.AttributeError'>: 'FeaturePython' object has no attribute 'ZLength'
I have no idea of what can be wrong there, the attributes should be stored in the python object and the only ones who fail are ZLength and YLength, while XLength and FrameDiameter are working OK.
The best thing is that, even with this error, the python object is behaving as expected....
Any idea is greatly appreciated.
Javier.