← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Move ZoomFitScreen and ZoomPreset to common

 

On 3/1/2017 8:54 AM, Jon Evans wrote:
> Wayne, Orson's latest patch is basically Option 2 but implemented
> another way.  Can you check it out and let us know if you are OK merging
> it as-is, or if we should change the implementation to be more like what
> I described?

I don't remember seeing this patch.  Was it posted to the dev list?

> 
> Thanks,
> Jon
> 
> On Wed, Mar 1, 2017 at 8:43 AM, Wayne Stambaugh <stambaughw@xxxxxxxxx
> <mailto:stambaughw@xxxxxxxxx>> wrote:
> 
>     Option 2 seems fine.  It may be easier to just add an option argument to
>     the existing GetBoundingBox() function to either return the cached
>     bounding box or recalculate the bounding box on demand rather than
>     create a different function for the cached vs. uncached version.
> 
>     On 3/1/2017 2:51 AM, Maciej Sumiński wrote:
>     > 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
>     <mailto: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 <mailto: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>
>     >>>>>>> <mailto: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> <mailto: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>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     >>>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >>>>>>>     >>>> Unsubscribe :
>     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     >>>> More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >>>>>>>     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >>>>>>>     >>>>
>     >>>>>>>     >>>
>     >>>>>>>     >>>
>     >>>>>>>     >>>
>     >>>>>>>     >>> _______________________________________________
>     >>>>>>>     >>> Mailing list:
>     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     >>> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >>>>>>>     >>> Unsubscribe :
>     https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     >>> More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >>>>>>>     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >>>>>>>     >>>
>     >>>>>>>     >>>
>     >>>>>>>     >>
>     >>>>>>>     >
>     >>>>>>>     >
>     >>>>>>>     >
>     >>>>>>>     > _______________________________________________
>     >>>>>>>     > Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     > Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >>>>>>>     > Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     > More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >>>>>>>     <https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>>
>     >>>>>>>     >
>     >>>>>>>
>     >>>>>>>
>     >>>>>>>     _______________________________________________
>     >>>>>>>     Mailing list: https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>
>     >>>>>>>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx
>     <mailto:kicad-developers@xxxxxxxxxxxxxxxxxxx>>
>     >>>>>>>     Unsubscribe : https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>
>     >>>>>>>     <https://launchpad.net/~kicad-developers
>     <https://launchpad.net/~kicad-developers>>
>     >>>>>>>     More help   : https://help.launchpad.net/ListHelp
>     <https://help.launchpad.net/ListHelp>
>     >>>>>>>     <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
>     <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>
> 
> 


Follow ups

References