class PythonCreoConnection(): def init_win32com(self): pythoncom.CoInitialize() def __enter__(self): self.init_win32com() print("Trying to form connection") self.models = [] self.asyncconn = Dispatch('pfcls.pfcAsyncConnection') self.conn = self.asyncconn.Connect(None, None, None, None) self.session = self.conn.Session print("Connection formed") return self def open_file(self, path): options = Dispatch('pfcls.pfcRetrieveModelOptions') o = options.Create() file = Dispatch('pfcls.pfcModelDescriptor') # VBAPI fails if it is given a creo file with the version number appended path = re.sub(r"\.prt(\.[0-9]+)", ".prt", path) f = file.CreateFromFilename(path) self.models.append(self.session.RetrieveModelWithOpts(f, o)) self.session.OpenFile(f) def activate_window(self, model_id): self.window = self.session.GetModelWindow(self.models[model_id]) self.window.Activate() def close_window(self): self.window.Close() def set_parameter(self, mdl, param_name, value): param = mdl.GetParam(param_name) try: paramvalue = param.value except AttributeError: raise CreoWrapperError("Parameter {} not found".format(param_name)) modelitem = Dispatch('pfcls.MpfcModelItem') #create boolean if param is not float if isinstance(value, bool): val = modelitem.CreateBoolParamValue(value) elif isinstance(value, (float, int)): val = modelitem.CreateDoubleParamValue(value) else: raise CreoWrapperError("Invalid value type") param.SetScaledValue(val, None) # this could be separated, is it really needed to regenerate after each param set? def assign_paramset(self, mdl, paramset): for key in paramset: self.set_parameter(mdl, key, paramset[key]) def regenerate(self, mdl): try: mdl.Regenerate(None) self.window.Repaint() mdl.Regenerate(None) self.window.Repaint() except: raise CreoWrapperError("Model failed to regenerate with {} = {}".format(param_name, value)) def __exit__(self, exc_type, exc_value, traceback): for i in range(len(self.models)): try: window = self.session.GetModelWindow(self.models[i]) window.Activate() window.Close() except: pass self.conn.Disconnect(2) print("Connection closed")