docs: def add_property_grid_widget(self, part_instance, max_height=None, custom_title=False, show_headers=True,
                                   show_columns=None):
          """
          Add a KE-chain Property Grid widget to the customization.
  
          The widget will be saved to KE-chain.
  
          :param part_instance: The part instance on which the property grid will be based
          :type part_instance: :class:`Part` or UUID
          :param max_height: The max height of the property grid in pixels
          :type max_height: int or None
          :param custom_title: A custom title for the property grid::
              * False (default): Part instance name
              * String value: Custom title
              * None: No title
          :type custom_title: bool or basestring or None
          :param show_headers: Show or hide the headers in the grid (default True)
          :type show_headers: bool
          :param show_columns: Columns to be hidden or shown (default to 'unit' and 'description')
          :type show_columns: list
          :raises IllegalArgumentError: When unknown or illegal arguments are passed.
          """
          height = max_height
          # Check whether the parent_part_instance is uuid type or class `Part`
          if isinstance(part_instance, Part):
              part_instance_id = part_instance.id
          elif isinstance(part_instance, text_type) and is_uuid(part_instance):
              part_instance_id = part_instance
              part_instance = self._client.part(id=part_instance_id)
          else:
              raise IllegalArgumentError("When using the add_property_grid_widget, part_instance must be a "
                                         "Part or Part id. Type is: {}".format(type(part_instance)))
          if not show_columns:
              show_columns = list()
  
          # Set the display_columns for the config
          possible_columns = [ShowColumnTypes.DESCRIPTION, ShowColumnTypes.UNIT]
          display_columns = dict()
  
          for possible_column in possible_columns:
              if possible_column in show_columns:
                  display_columns[possible_column] = True
              else:
                  display_columns[possible_column] = False
  
          # Declare property grid config
          config = {
              "xtype": ComponentXType.PROPERTYGRID,
              "category": Category.INSTANCE,
              "filter": {
                  "activity_id": str(self.activity.id),
                  "part": part_instance_id
              },
              "hideHeaders": not show_headers,
              "viewModel": {
                  "data": {
                      "displayColumns": display_columns
                  }
              },
          }
  
          # Add max height and custom title
          if height:
              config['height'] = height
  
          if custom_title is False:
              show_title_value = "Default"
              title = part_instance.name
          elif custom_title is None:
              show_title_value = "No title"
              title = str()
          else:
              show_title_value = "Custom title"
              title = str(custom_title)
  
          config["title"] = title
          config["showTitleValue"] = show_title_value
  
          # Declare the meta info for the property grid
          meta = {
              "activityId": str(self.activity.id),
              "customHeight": height if height else None,
              "customTitle": title,
              "partInstanceId": part_instance_id,
              "showColumns": show_columns,
              "showHeaders": show_headers,
              "showHeightValue": "Set height" if height else "Automatic height",
              "showTitleValue": show_title_value
          }
  
          self._add_widget(dict(config=config, meta=meta, name=WidgetNames.PROPERTYGRIDWIDGET))