kicad-developers team mailing list archive
-
kicad-developers team
-
Mailing list archive
-
Message #28338
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
Wayne, what do you think? If it is acceptable, then I would like to
merge the patches. I should not judge my code, as I might be tempted to
consider it a good solution.
In case my proposal to cache the bounding box in autorouter code is not
approved, then I would say #2 would do the job.
Cheers,
Orson
On 03/01/2017 01:23 AM, Jon Evans wrote:
> Update: after some more testing, I think Orson's patch on top of mine is
> the way to go. It pulls the computation out of the loops for autorouter,
> and that's the only place where the board's bounding box is used
> repetitively. Since the other call sites are only going to get the
> bounding box intermittently, I don't think it's worth any effort doing
> complicated things to track and recompute the bounding box when things are
> changed.
>
> So, I think my patch and Orson's should be merged.
>
> -Jon
>
> On Tue, Feb 28, 2017 at 6:51 PM, Jon Evans <jon@xxxxxxxxxxxxx> wrote:
>
>> I'm finally back to this problem now that I have some other WIP committed.
>>
>> As far as I can tell, there two paths to go down for this problem:
>>
>> 1) Implement auto-caching of the bounding box. This requires some
>> mechanism to tell BOARD that it needs to update the cache, be it OBSERVABLE
>> or some other update function added to BOARD_ITEM. No matter how it's
>> done, this method seems not great to me because it requires touching a ton
>> of code to provide coverage for every possible entry point that could end
>> up having an effect on the bounding box.
>>
>> 2) Have two different calls to get the bounding box for an EDA_ITEM, one
>> that always re-generates the cache and one that just returns a cached
>> value. Update the call sites that hit the bounding box frequently
>> (autorouter, etc) to make use of the cached value; keep the call sites that
>> always re-generate the bounding box in today's code working that way.
>> Performance shouldn't be any better or worse than it is now.
>>
>> 3) Track whether a board is clean/dirty in some other way besides looking
>> at BOARD_ITEMs. This might not be practical while we still support legacy,
>> but once there is only GAL, I could see this maybe being possible through
>> the tool framework. For example, actions could be marked as possibly
>> impacting the board or not (i.e. move item does, zoom does not)
>>
>> So, unless someone suggests otherwise, I'm going to try implementing #2,
>> and suggest #3 as a future improvement that would improve performance for
>> some edge case operations (i.e. "zoom to fit screen" would be instantaneous
>> if nothing has modified the board since the last time the bbox was cached,
>> even on large boards)
>>
>> -Jon
>>
>> On Fri, Feb 24, 2017 at 11:01 AM, Wayne Stambaugh <stambaughw@xxxxxxxxx>
>> wrote:
>>
>>> On 2/24/2017 10:30 AM, Maciej Sumiński wrote:
>>>> Most of the operations one can do on a BOARD_ITEM potentially affects
>>>> the board bounding box. It means there might be many places where the
>>>> notifications should be added.
>>>>
>>>> Some time ago, Michael Steinberg has put in place OBSERVABLE class
>>>> (include/observable.h) that could facilitate the task.
>>>
>>> It could be useful but I'm not sure it would be a better design than the
>>> child object informing it's parent that it's bounding box has changed.
>>> I'm not sure the additional code would make the code any more readable.
>>> The only benefit would be if other observers were required.
>>>
>>>>
>>>> With the current approach, developers have to guess whether to update
>>>> the bounding box with ComputeBoundingBox() or take the cached value.
>>>> Update is called in very few places, so I really wonder what kind of
>>>> magic makes it work, but I might have missed something here.
>>>
>>> This solution would require limiting the entry points in the BOARD
>>> object that allow changes to the BOARD's child items. Conceptually this
>>> is probably easier to understand but requires developers to be diligent
>>> when making changes to the BOARD object or not trying to bypass these
>>> entry points.
>>>
>>>>
>>>> Regards,
>>>> Orson
>>>>
>>>> On 02/24/2017 04:06 PM, Wayne Stambaugh wrote:
>>>>> Every BOARD_ITEM has a parent/child relationship or at least it did if
>>>>> someone did not break it. You can always find the parent BOARD object
>>>>> by walking up the BOARD_ITEM parent list. There is already a
>>>>> BOARD_ITEM::GetBoard() call that should return the parent board. You
>>>>> could use that to notify the BOARD object when a child BOARD_ITEM
>>> change
>>>>> effects the bounding box.
>>>>>
>>>>> On 2/24/2017 9:27 AM, Jon Evans wrote:
>>>>>> We need a solution that allows GetBoundingBox to be called blindly,
>>>>>> without knowing if (or how) an EDA_ITEM subclass needs to have the
>>>>>> bounding box updated.
>>>>>>
>>>>>> Does anyone have ideas about how complicated it would be to give the
>>>>>> BOARD class knowledge of whether or not anything inside it has
>>> changed?
>>>>>> This is what I tried to implement at first, but Orson pointed out that
>>>>>> the way I did it would miss some kinds of changes.
>>>>>>
>>>>>> Figuring out the above also seems useful for other reasons -- for
>>>>>> example, autosave / backup features are easier to implement if there
>>> is
>>>>>> a global "dirty/clean" flag for things like BOARD.
>>>>>>
>>>>>> If there is no good way to implement caching, I guess another way
>>> would
>>>>>> be to implement caching at the sites that use the BOARD bounding box
>>>>>> heavily (autorouter etc)
>>>>>>
>>>>>> -Jon
>>>>>>
>>>>>> On Fri, Feb 24, 2017 at 9:22 AM, Wayne Stambaugh <
>>> stambaughw@xxxxxxxxx
>>>>>> <mailto:stambaughw@xxxxxxxxx>> wrote:
>>>>>>
>>>>>> On 2/24/2017 4:16 AM, Maciej Sumiński wrote:
>>>>>> > Hi Jon,
>>>>>> >
>>>>>> > The current version looks much better to me. From what I see
>>> there is no
>>>>>> > actual bounding box caching, as GetBoundingBox() always calls
>>>>>> > ComputeBoundingBox(). I am fine with that, but before I push
>>> the patch I
>>>>>> > need to ask: does anyone know why the board bounding box is
>>> cached? I
>>>>>> > believe it must have been done to boost performance of certain
>>> parts of
>>>>>> > the code, but I wonder if it is really necessary. Especially
>>> that one
>>>>>> > needs to know that it has to be updated using
>>> ComputeBoundingBox().
>>>>>>
>>>>>> It was cached so it didn't need to be recalculated every time the
>>>>>> bounding box was required. It should or at least it did
>>> recalculate
>>>>>> only when the changes were made since the last call to fetch the
>>>>>> bounding box. On very complex boards, this can take a while.
>>> Getting
>>>>>> the bounding box is called fairly often so this can add up. I
>>> don't see
>>>>>> any reason to recalculate the bounding box on every get bounding
>>> box
>>>>>> call. If the current bounding box behavior is broken, then it
>>> should be
>>>>>> fixed. I don't see any reason to get rid of the caching method.
>>> If you
>>>>>> are operating outside of the normal methods for adding and/or
>>> editing
>>>>>> board objects that prevents the correct bounding box from being
>>>>>> calculated, that is your fault and you need to fix your code
>>>>>> accordingly.
>>>>>>
>>>>>> >
>>>>>> > Just by looking at the code, I noticed that the autorouter calls
>>>>>> > BOARD::GetBoundingBox() frequently, but I could not see much
>>>>>> difference
>>>>>> > with caching disabled. Likely, the routing algorithm takes
>>>>>> significantly
>>>>>> > more time than the bounding box calculations.
>>>>>> >
>>>>>> > Personally I would completely remove m_BoundingBox field
>>> instead of
>>>>>> > making it mutable. Also, I have noticed there are a few places
>>>>>> where the
>>>>>> > bounding box is overridden with SetBoundingBox(). It seems to
>>> me a bit
>>>>>> > dubious, as bounding box should depend solely on the items
>>>>>> belonging to
>>>>>> > the board. I attach a patch to show what I would change. Any
>>> comments,
>>>>>> > especially from Wayne & Jean-Pierre?
>>>>>> >
>>>>>> > Regards,
>>>>>> > Orson
>>>>>> >
>>>>>> > On 02/23/2017 01:49 PM, Jon Evans wrote:
>>>>>> >> Hi Orson,
>>>>>> >>
>>>>>> >> Here's an updated patch with the changes you requested. The
>>> only
>>>>>> issue is,
>>>>>> >> without some kind of caching, I had to change the call sites
>>> that
>>>>>> were
>>>>>> >> interested in the board bounding box with edges only, so the
>>>>>> patch has
>>>>>> >> grown in scope. Let me know if this looks better.
>>>>>> >>
>>>>>> >> Best,
>>>>>> >> Jon
>>>>>> >>
>>>>>> >> On Thu, Feb 23, 2017 at 4:17 AM, Maciej Sumiński
>>>>>> <maciej.suminski@xxxxxxx <mailto:maciej.suminski@xxxxxxx>>
>>>>>> >> wrote:
>>>>>> >>
>>>>>> >>> Hi Jon,
>>>>>> >>>
>>>>>> >>> I really like the generic approach in the zoom methods. This
>>> part I
>>>>>> >>> would merge instantly, but there is an issue with caching the
>>> board
>>>>>> >>> bounding box. It does not take into account that items already
>>>>>> added to
>>>>>> >>> board may change their position and affect the bounding box.
>>> I would
>>>>>> >>> remove caching completely, what do you think?
>>>>>> >>>
>>>>>> >>> If you are going to modify the patch, would you rename
>>> boardBBox in
>>>>>> >>> COMMON_TOOLS::ZoomFitScreen() to bbox or anything that is not
>>>>>> related to
>>>>>> >>> board? Thank you in advance.
>>>>>> >>>
>>>>>> >>> Regards,
>>>>>> >>> Orson
>>>>>> >>>
>>>>>> >>> On 02/23/2017 05:34 AM, Jon Evans wrote:
>>>>>> >>>> Hi all,
>>>>>> >>>>
>>>>>> >>>> This patch finishes off the refactor I did a few days ago, by
>>>>>> enabling
>>>>>> >>>> ZoomFitScreen to work without knowledge of the BOARD class.
>>>>>> >>>>
>>>>>> >>>> In order to make this work, I changed the way GetBoundingBox
>>> and
>>>>>> >>>> ComputeBoundingBox work so that the call sites of
>>>>>> GetBoundingBox don't
>>>>>> >>> have
>>>>>> >>>> to also call ComputeBoundingBox if they don't need to use the
>>>>>> >>>> aBoardEdgesOnly flag.
>>>>>> >>>>
>>>>>> >>>> Those with good knowledge of BOARD should review this to make
>>>>>> sure I
>>>>>> >>> caught
>>>>>> >>>> all the instances where we should mark the bounding box as
>>>>>> needing to be
>>>>>> >>>> re-computed.
>>>>>> >>>>
>>>>>> >>>> Best,
>>>>>> >>>> Jon
>>>>>> >>>>
>>>>>> >>>>
>>>>>> >>>>
>>>>>> >>>> _______________________________________________
>>>>>> >>>> Mailing list: https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> >>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>>>> <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>>>>>> >>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> >>>> More help : https://help.launchpad.net/ListHelp
>>>>>> <https://help.launchpad.net/ListHelp>
>>>>>> >>>>
>>>>>> >>>
>>>>>> >>>
>>>>>> >>>
>>>>>> >>> _______________________________________________
>>>>>> >>> Mailing list: https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> >>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>>>> <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>>>>>> >>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> >>> More help : https://help.launchpad.net/ListHelp
>>>>>> <https://help.launchpad.net/ListHelp>
>>>>>> >>>
>>>>>> >>>
>>>>>> >>
>>>>>> >
>>>>>> >
>>>>>> >
>>>>>> > _______________________________________________
>>>>>> > Mailing list: https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> > Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>>>> <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>>>>>> > Unsubscribe : https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> > More help : https://help.launchpad.net/ListHelp
>>>>>> <https://help.launchpad.net/ListHelp>
>>>>>> >
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Mailing list: https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>>>> <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>>>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>>>> <https://launchpad.net/~kicad-developers>
>>>>>> More help : https://help.launchpad.net/ListHelp
>>>>>> <https://help.launchpad.net/ListHelp>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Mailing list: https://launchpad.net/~kicad-developers
>>>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>>> More help : https://help.launchpad.net/ListHelp
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Mailing list: https://launchpad.net/~kicad-developers
>>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>>> More help : https://help.launchpad.net/ListHelp
>>>>
>>>
>>>
>>> _______________________________________________
>>> Mailing list: https://launchpad.net/~kicad-developers
>>> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
>>> Unsubscribe : https://launchpad.net/~kicad-developers
>>> More help : https://help.launchpad.net/ListHelp
>>>
>>
>>
>
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help : https://help.launchpad.net/ListHelp
>
Attachment:
signature.asc
Description: OpenPGP digital signature
Follow ups
References
-
[PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Jon Evans, 2017-02-23
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Maciej Sumiński, 2017-02-23
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Jon Evans, 2017-02-23
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Maciej Sumiński, 2017-02-24
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Wayne Stambaugh, 2017-02-24
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Jon Evans, 2017-02-24
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Wayne Stambaugh, 2017-02-24
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Maciej Sumiński, 2017-02-24
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Wayne Stambaugh, 2017-02-24
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Jon Evans, 2017-02-28
-
Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common
From: Jon Evans, 2017-03-01