Как вернуть идентификаторы в wx.Rect в Wx python PseudoDC - PullRequest
3 голосов
/ 27 января 2020

Я создаю инструмент «Выбор ящика» для программы, которую разрабатываю в Wx python. Я использую класс PseudoD C для рисования.

Пользователь должен иметь возможность нарисовать поле, чтобы выбрать нарисованные объекты узлов на графе узлов по их идентификатору, но я не могу найти хороший способ получить идентификаторы, которые находятся в поле выбора.

До сих пор я придумал следующее:

    def OnLeftUp(self, event):
            ...
            # This is in the mouse event method which calls the *BoxSelectHitTest* method below.
            self._selectednodes = self.BoxSelectHitTest(
                wx.Point(self._bboxRect[2]/2, 
                    self._bboxRect[3]/2)
                )
            ...

    def BoxSelectHitTest(self, pt):
        # self._bboxRect is the wx.Rect of the Box Select
        average = (self._bboxRect[3] + self._bboxRect[2])/2
        idxs = self._pdc.FindObjects(pt[0], pt[1], int(average))

        hits = [
            idx 
            for idx in idxs
            if idx in self._nodes
        ]
        # Return the node objects from the IDs
        if hits != []:
            nodes = []
            for Id in hits:
                nodes.append(self._nodes[Id])
            return nodes

        else:
            return []

Это, очевидно, неверное поле выбора. Это больше похоже на плохой вариант выбора круга. (Радиус в среднем - это только моя попытка заставить его «работать».)

Я не смог найти метод в PseudoD C, который бы возвращал идентификаторы объектов в данном wx .Rect . Есть метод, который делает это или как это должно быть реализовано правильно?

Спасибо.

1 Ответ

2 голосов
/ 05 февраля 2020

Я понял это, просмотрев документацию по wx.Rect, поэтому я решил опубликовать ее здесь.

Используя wx.Rect.Intersects, он проверяет, пересекается ли bboxrect с прямоугольником каждого узла, и возвращает их:

    def BoxSelectHitTest(self, bboxrect):
        nodehits = []
        for node in self._nodes.values():
            if bboxrect.Intersects(node.GetRect()) == True:
                nodehits.append(node)

        if nodehits != []:
            return nodehits

        else:
            # Make sure we deselect everything
            for node in self._selectednodes:
                node.SetSelected(False)
                node.Draw(self._pdc)
            self._selectednodes = []
            return []
...