async def __setProperties(self, obj, props, values, logentry): try: self.logger.debug(f"{logentry}: Set properties {props}") values = await self.__getBinaryValues(values) Object.setProperties(obj, props, values) except Exception as e: self.logger.error(f"{logentry} Set properties {props} error: {e}")
async def __setProperty(self, obj, prop, value, logentry): try: self.logger.debug(f"{logentry}: Set property {prop}") value = await self.__getBinaryValues(value) Object.setProperty(obj, prop, value) except Exception as e: self.logger.error(f"{logentry} Set property {prop} error: {e}")
async def __cbChangePropStatus(self, name, prop, status): try: obj = self.onlineDoc.document.getObject(name) if obj is None: return self.logger.debug( f"Object ({name}): Change property {prop} status to {status}") Object.setPropertyStatus(obj, prop, status) except Exception as e: self.logger.error(f"Setting property status failed: {e}")
async def __cbChangeViewProvierPropStatus(self, name, prop, status): try: obj = self.onlineDoc.document.getObject(name) if not obj or not obj.ViewObject: return self.logger.debug( f"ViewProvider ({name}): Change property {prop} status to ({status})" ) Object.setPropertyStatus(obj.ViewObject, prop, status) except Exception as e: self.logger.error(f"Setting property status failed: {e}")
async def __cbRemoveViewProviderExtension(self, name, ext): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"ViewProvider ({name}): Should remove extension {ext} for not existing object" ) return self.logger.debug(f"ViewProvider ({name}): Remove extension {ext}") Object.removeExtension(obj.ViewObject, ext) except Exception as e: self.logger.error(f"Remove extension failed: {e}")
async def __cbCreateObjextExtension(self, name, ext): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"Object ({name}): Should add extension for not existing object" ) return self.logger.debug(f"Object ({name}): Add extension {ext}") Object.createExtension(obj, ext) except Exception as e: self.logger.error(f"Add extension failed: {e}")
async def __cbRemoveObjectDynProperty(self, name, prop): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"Object ({name}): Should remove dyn property {prop} for not existing object" ) return self.logger.debug( f"Object ({name}): Remove dynamic property {prop}") Object.removeDynamicProperty(obj, prop) except Exception as e: self.logger.error(f"Dyn property removing failed: {e.message}")
async def __cbRemoveViewProviderDynProperty(self, name, prop): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"ViewProvider ({name}): Should remove dynamic property {prop} for not existing viewprovider" ) return self.logger.debug( f"ViewProvider ({name}): Remove dynamic property {prop}") Object.removeDynamicProperty(obj.ViewObject, prop) except Exception as e: self.logger.error( f"Dynamic property removing callback failed: {e.message}")
async def __cbCreateObjectDynProperty(self, name, prop, typeID, group, documentation, status): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"Object ({name}): Should add dynamic property {prop} for not existing object" ) return self.logger.debug( f"Object ({name}): Create dynamic property {prop}") Object.createDynamicProperty(obj, prop, typeID, group, documentation, status) except Exception as e: self.logger.error(f"Dynamic property adding failed: {e}")
async def __cbCreateViewProviderDynProperty(self, name, prop, typeID, group, documentation, status): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"ViewProvider ({name}): Should add dynamic property {prop} for not existing viewprovider" ) return self.logger.debug( f"ViewProvider ({name}): Add dynamic property {prop}") Object.createDynamicProperty(obj.ViewObject, prop, typeID, group, documentation, status) except Exception as e: self.logger.error("Dynamic property adding failed: {0}".format(e))
async def __cbCreateObjectDynProperties(self, name, props, infos): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"Object ({name}): Should add dynamic properties for not existing object: {props}" ) return self.logger.debug( f"Object ({name}): Create dynamic properties {props}") for i in range(0, len(props)): info = infos[i] Object.createDynamicProperty(obj, props[i], info["typeid"], info["group"], info["docu"], info["status"]) except Exception as e: self.logger.error(f"Dynamic properties adding failed: {e}")
async def __cbCreateViewProviderDynProperties(self, name, props, infos): try: obj = self.onlineDoc.document.getObject(name) if obj is None: self.logger.error( f"ViewProvider ({name}): Should add dyn properties for not existing viewprovider {props}" ) return self.logger.debug( f"ViewProvider ({name}): Add dynamic properties {props}") for i in range(0, len(props)): info = infos[i] Object.createDynamicProperty(obj.ViewObject, props[i], info["typeid"], info["group"], info["docu"], info["status"]) except Exception as e: self.logger.error( "Dynamic properties adding failed: {0}".format(e))
async def upload(self, obj): # Creates and uploads the object data into the ocp node # Note: this function works async, but cannot handle any changes during execution, # neither on the node nor in the FC object try: #first check if we are available online. if await self.Writer.isAvailable(): raise Exception("Object already setup, cannot upload") #setup object and all properties infos = [] for prop in obj.PropertiesList: infos.append(Property.createInformation(obj, prop)) await self.Writer.setup(obj.TypeId, obj.PropertiesList, infos) #we process the other tasks in parallel tasks = [] #upload all extensions ext = Object.getExtensions(obj) for e in ext: tasks.append(self.Writer.addExtension(e)) #write all properties. props = obj.PropertiesList for prop in props: value = Property.convertPropertyToWamp(obj, prop) self.Writer.changeProperty(prop, value, obj.OutList) tasks.append(self.Writer.processPropertyChanges()) if tasks: await asyncio.gather(*tasks) except Exception as e: self.logger.error(f"Uploading object failed: {e}") traceback.print_exc()
async def download(self, obj): # Loads the OCP node data for this object into the FreeCAD one. If changes exist # the local version will be overridden, hene can be used to reset a object # Note: this function works async, but cannot handle any changes during execution, # neither on the node nor in the FC object try: self.logger.debug(f"Download") #first check if we are available online to setup. Could happen that e.g. we load before the viewprovider was uploaded if not await self.Reader.isAvailable(): return #add the extensions (do that before properties, as extensions adds props too) extensions = await self.Reader.extensions() for extension in extensions: self.logger.debug(f"Add extension {extension}") Object.createExtension(obj, extension) oProps = await self.Reader.propertyList() if not oProps: #no properties mean we loaded directly after object creation, before default property setup. Nothing is written yet return defProps = self.obj.PropertiesList # check if we need to remove some local props remove = set(defProps) - set(oProps) if remove: self.logger.debug( f"Local object has too many properties, remove {remove}") Object.removeDynamicProperties(obj, remove) # create the dynamic properties add = set(oProps) - set(defProps) infos = await self.Reader.propertiesInfos(add) self.logger.debug(f"Create and set dynamic properties {add}") Object.createDynamicProperties(obj, add, infos) # set all property values. Note that data can be None in case the property was never written (default value) values = await self.Reader.properties(oProps) writeProps = [] writeValues = [] for prop, value in zip(oProps, values): if value: writeProps.append(prop) writeValues.append(value) self.logger.debug(f"Read properties {writeProps}") Object.setProperties(obj, writeProps, writeValues) # set the correct status for the non-dnamic properties infos = await self.Reader.propertiesInfos(defProps) status = [info["status"] for info in infos] self.logger.debug( f"Set status of default properties {defProps} to {status}") for prop, stat in zip(defProps, status): Object.setPropertyStatus(obj, prop, stat) self.logger.debug(f"Object download finished") except Exception as e: self.logger.error(f"Downloading object failed: {e}") traceback.print_exc()