Example #1
0
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")