Mikolaj Wielgus
b35e6fc66a
egui: fix painted bend direction
2024-06-25 00:40:06 +02:00
Mikolaj Wielgus
1706d5ae8c
drawing: add invariant contract for pairwise non-infringement of looses
2024-06-24 16:36:05 +02:00
Mikolaj Wielgus
c3fe91aabe
drawing: split finding infringers into multiple methods
2024-06-24 13:55:46 +02:00
Mikolaj Wielgus
0777b781f4
router: have two navvertices, CW and CCW, for each trianvertex
2024-06-22 17:33:11 +02:00
Mikolaj Wielgus
d34554f075
egui: fix selecting nodes whose bboxes overlap other bboxes
2024-06-21 07:11:41 +02:00
Mikolaj Wielgus
169ddf7d80
egui: add button to toggle showing navmesh
2024-06-20 19:33:18 +02:00
Mikolaj Wielgus
5161eecd49
egui: don't clear navmesh after routing is done
2024-06-20 18:55:57 +02:00
Mikolaj Wielgus
4540f5c96b
router: impl. forgotten addition of edges to navmesh
2024-06-20 18:50:50 +02:00
Mikolaj Wielgus
c24d748bea
autorouter: don't save in history until command is successfully finished
2024-06-20 12:14:51 +02:00
Mikolaj Wielgus
ae2a862e0e
router: store every vertex (fails tests but almost functional)
...
Previously, rail vertices were not stored but generated on demand from
data stored in a `Triangulation<...>`. This functionality is removed in
favor of storing every vertex in `Navmesh`'s own graph built from the
`Triangulation<...>`, which is now afterwards discarded.
Tests still fail and rails aren't added yet, but this is close enough to
completion for me to commit so that I can now go to sleep without
worrying.
2024-06-20 01:32:27 +02:00
Mikolaj Wielgus
d4a310a5c0
graph: disambiguate naming of different kinds of indices
...
Disambiguate between node indices and (teir inner) petgraph indices.
Rename "band index" to "band first seg index", as we identify bands by
teir first segs. Rename "trianvertex index" and "navvertex index"
respectively to "trianvertex node index" and "navvertex node index", as
these point to nodes on the geometry graph and only indirectly to
vertices on the vertex graph.
2024-06-18 15:30:33 +02:00
Mikolaj Wielgus
7f46d436af
egui: fix sign of Y displayed on the bottom bar
2024-06-18 02:07:38 +02:00
Mikolaj Wielgus
e15e1efe5e
router: remove observers
...
The observer "pattern", arguably, is an anti-pattern that managed to get
into textbooks. It causes a lot of problems, it was a bad idea to use
it.
2024-06-18 01:37:45 +02:00
Mikolaj Wielgus
d193ea6565
drawing: rename "segbends" to "canes"
...
In addition to a seg and a bend, a segbend actually also contains a dot,
so let's rename it to "cane", which is also easier to translate.
2024-06-18 01:16:12 +02:00
Mikolaj Wielgus
a7b4a84b98
layout: remove inserted dots if placing via fails
2024-06-17 23:59:36 +02:00
Mikolaj Wielgus
7dd0f3e629
egui: fix painting zones (forgot to replace literal with var earlier)
2024-06-17 23:59:36 +02:00
Mikolaj Wielgus
d56d6046a4
egui: add bottom bar displaying cursor position
...
Useful for writing tests.
2024-06-17 23:59:36 +02:00
Tomasz Cichoń
13c8237da6
specctra: remove casts, accept floating point precision used internally
2024-06-16 22:34:11 +02:00
Tomasz Cichoń
f37e7ce88d
specctra: pass errors to app instead of panicking
2024-06-16 20:02:51 +02:00
Tomasz Cichoń
aa0616840c
specctra: remove old file reader based on serde
2024-06-16 19:02:54 +02:00
Mikolaj Wielgus
9d00e95457
specctra: change "dsn" to "specctra" where it's about both DSN and SES
2024-06-16 18:04:20 +02:00
Mikolaj Wielgus
8c2ad87bf0
dsn: replace structure with new renamed structure2
2024-06-16 14:05:49 +02:00
Mikolaj Wielgus
c4788c0277
drawing: remove hardcoded layer count of 2
2024-06-15 01:06:50 +02:00
Mikolaj Wielgus
e723c28f26
egui: add default colors for middle layers in 4-layer boards
2024-06-14 05:14:37 +02:00
Mikolaj Wielgus
008dcfeca0
geometry: store layer in `usize`, not `u64`
2024-06-14 04:58:52 +02:00
Mikolaj Wielgus
1cca9fe6e1
egui: support displaying an arbitrary number of layers
2024-06-14 03:47:27 +02:00
Mikolaj Wielgus
300529ea75
egui: hide layers marked as hidden
2024-06-13 18:47:47 +02:00
Mikolaj Wielgus
339387c657
drawing: remove forgotten leftover dbg!() traces
2024-06-13 18:46:27 +02:00
Mikolaj Wielgus
cff6b5aaf6
cleanup: cargo fix, cargo fmt
2024-06-13 13:38:12 +02:00
Mikolaj Wielgus
6d66558a72
egui: move viewport to its own file
2024-06-13 13:37:54 +02:00
Mikolaj Wielgus
ce1a070a70
egui: move the top panel to its own file
2024-06-13 02:22:17 +02:00
Mikolaj Wielgus
5067fb55d9
egui: impl. layer display manager sidebar (not affecting display yet)
2024-06-13 02:21:32 +02:00
Mikolaj Wielgus
c5842b7821
drawing: fix contracts on placement failures
2024-06-12 14:44:26 +02:00
Tomasz Cichoń
7d9bf1346a
dsn: add new parser/writer and .ses export prototype
2024-06-12 13:39:42 +02:00
Mikolaj Wielgus
90bc90350d
tests: test via placement failure
2024-06-12 01:51:04 +02:00
Mikolaj Wielgus
f91dadf4d3
drawing,layout,board: categorize methods as possibly infringing and not
2024-06-11 23:57:47 +02:00
Mikolaj Wielgus
9e65a28c3d
drawing: cosmetic renamings and rearrangements
2024-06-11 13:53:43 +02:00
Mikolaj Wielgus
3b4614b16b
egui: consume the click when toggling Place Via mode
2024-06-11 00:00:55 +02:00
Mikolaj Wielgus
8c9a13e712
layout: use inclusive range to describe via layers
2024-06-10 23:51:15 +02:00
Mikolaj Wielgus
6884ca6531
egui: add button to modally invoke via placement
2024-06-10 16:49:05 +02:00
Mikolaj Wielgus
b09ffad9b3
autorouter: create new command for placing vias
...
Undoing it is not implemented yet.
2024-06-10 02:38:24 +02:00
Mikolaj Wielgus
6b6affb3fc
autorouter: move autoroute command to its own file
...
Since it accesses `Autorouter`'s fields, I made these `pub(super)`. This
feels unidiomatic, but let's give it a shot.
2024-06-10 02:38:03 +02:00
Mikolaj Wielgus
5d082d81c0
layout: implement `MakePrimitiveShape` for vias
2024-06-09 21:29:03 +02:00
Mikolaj Wielgus
fc1f7e2613
layout: implement storage for vias
2024-06-09 17:24:12 +02:00
Mikolaj Wielgus
e5829d929a
dsn: don't divide widths and clearances by 100
2024-06-08 23:07:28 +02:00
Mikolaj Wielgus
7a02877eb4
board,dsn: move layer and net name bidirectional lookup to `Mesadata`
2024-06-08 21:39:25 +02:00
Mikolaj Wielgus
98363fbfd1
drawing: remove unnecessary contracts on `&self` methods
2024-06-08 18:28:34 +02:00
Mikolaj Wielgus
19a4766cb5
board,dsn: introduce `MesadataTrait`, an extension of `RulesTrait`
...
The trait's contents aren't implemented yet.
"mesa" is supposed to mean the opposite of "meta". By "mesadata" I don't
mean mere content or payload: I mean data that is stored *inside* or
*under* such content or payload.
I found this meaning of "mesa" -- as opposite of "meta" -- by browsing
somewhere on the internet. Fair chance many classicists would think
poorly of this usage. But I don't care about etymology: I just need a
word to close a lexical gap.
2024-06-08 16:36:21 +02:00
Mikolaj Wielgus
1dc3718159
board: move board to its own directory
2024-06-08 13:37:27 +02:00
Mikolaj Wielgus
91480453b3
tests: add 3-pin XLR THT female to THT female test
...
Hardly functional so far.
2024-06-07 02:14:05 +02:00
Tomasz Cichoń
af1bb7069f
dsn: add support of keepouts
...
Includes some ugly hacks to get the deserializer to accept the relevant
structs for now.
2024-06-06 23:31:12 +02:00
Mikolaj Wielgus
e574043c2f
tests: move common code to new common module
2024-06-06 02:30:25 +02:00
Mikolaj Wielgus
a02bf1541e
autorouter: implement measurement of band length
2024-06-05 23:20:55 +02:00
Mikolaj Wielgus
86d2555b36
autorouter: accessibly store pin-pairs between which routed bands are
2024-06-05 20:26:23 +02:00
Mikolaj Wielgus
5eeeb5a004
autorouter: select nodes with pin-layer pairs, not only pins
...
We call these pairs "selectors".
The command file format has been thus changed. I've upgraded the command
files in tests with the following command:
jq ".done?.[].Autoroute |= {selectors: ([.pins.[] | {pin: ., layer: \"F.Cu\"}])}" $FILE | sponge $FILE
Where $FILE is the name of the upgraded command file.
2024-06-04 01:54:10 +02:00
Mikolaj Wielgus
bb6d975dac
autorouter: store layer to layer names map in `Board`
2024-06-03 13:44:09 +02:00
Mikolaj Wielgus
fa8c11fa36
autorouter: move lazy apex accessor to `Board`
2024-06-03 12:46:36 +02:00
Mikolaj Wielgus
a80dfc10be
autorouter,router: shorten and clarify terminology
...
Rename "triangulation vertex" to just "trianvertex".
Rename "navigation vertex" to just "navvertex".
The standalone word "vertex" was overused and in some cases confusing.
2024-06-03 12:46:27 +02:00
Mikolaj Wielgus
765d8495c6
tests: add four 3rd order SMD LC filters test
2024-06-01 00:34:09 +02:00
Mikolaj Wielgus
540d9707dc
autorouter: store a net to netname map in `Board`
2024-05-31 23:13:57 +02:00
Mikolaj Wielgus
7e022aa2cf
sdl2-demo: fix compilation errors
2024-05-31 02:09:11 +02:00
Mikolaj Wielgus
de17adb01c
layout: move pin information to a new parent object, `Board`
2024-05-31 01:47:51 +02:00
Mikolaj Wielgus
b22e3dce1a
router,autorouter: stop hiding layout behind an arc-mutex
...
This was preventing us from creating a new abstraction layer over
layout.
2024-05-30 22:57:20 +02:00
Mikolaj Wielgus
dcbc5be5f3
router,autorouter: improve error handling
...
Avoid unwrapping and use `Result<...>` instead as well-written code
should.
2024-05-30 19:54:14 +02:00
Mikolaj Wielgus
a4503a42c6
router: improve error handling -- more error types, remove some unwraps
2024-05-29 23:49:24 +02:00
Mikolaj Wielgus
af9cbeba61
router: don't assume start dot to have a net
2024-05-29 16:52:30 +02:00
Mikolaj Wielgus
499564e6cf
router: make A* a walker, i.e. make it runnable in a while loop
2024-05-27 23:50:12 +02:00
Mikolaj Wielgus
3dd311c5fc
contracts: use `disable_contracts` feature instead of checking channel
2024-05-25 22:46:06 +02:00
Mikolaj Wielgus
93b628ae02
sdl2-demo: fix compile error
2024-05-25 21:23:24 +02:00
Mikolaj Wielgus
a757576fe3
tests: fix 0603 breakout test by passing a command file
2024-05-25 02:33:10 +02:00
Mikolaj Wielgus
06150f5167
autorouter: don't cache nodes in `Selection`
...
This solves the problem of having to use stateful deserialization.
2024-05-23 20:00:43 +02:00
Mikolaj Wielgus
53fa89d02c
egui: implement loading the history (not functional yet)
...
Committing this non-functional and half-baked because loading the
history requires implementing stateful deserialization, which is quite
an effort to implement with Serde, as there are no applicable derive
macros.
2024-05-23 19:34:19 +02:00
Mikolaj Wielgus
02bfe1105b
egui: Implement saving command file
2024-05-22 14:38:59 +02:00
Mikolaj Wielgus
fb501ac072
autorouter: encapsulate command history in a `History` object
2024-05-22 01:12:55 +02:00
Mikolaj Wielgus
8999fcb160
egui: add button to toggle showing ratsnest
2024-05-20 21:15:57 +02:00
Mikolaj Wielgus
f03545124f
autorouter: keep track of clicked pins
...
Pin names provide us stable references that we can use to replay actions
later. We'll use this information to serialize the selection.
2024-05-19 04:37:26 +02:00
Mikolaj Wielgus
530f81557a
layout: keep track of node pins
...
For the time being we're storing pin names in a hashmap with nodes as
keys. We need to know which node belongs to which pin because pins
provide stable identifiers for continents (connected components) that
we need for replayable command files.
2024-05-17 02:22:48 +02:00
Mikolaj Wielgus
84a1842f3d
egui: add Ctrl+Z and Ctrl+Y key shortcuts for Undo and Redo
2024-05-15 04:05:11 +02:00
Mikolaj Wielgus
4a4f18f558
egui,autorouter: implement undo/redo in GUI
2024-05-15 03:40:48 +02:00
Mikolaj Wielgus
114fb747c8
router: return band index once the routing finishes
2024-05-15 01:45:36 +02:00
Mikolaj Wielgus
1c09483873
autorouter: implement simple undo (untested, not in GUI yet)
2024-05-14 14:22:47 +02:00
Mikolaj Wielgus
c006dcfd47
drawing: create `BandIndex` object to pass around bands
2024-05-14 00:28:32 +02:00
Mikolaj Wielgus
4c6fa0e5d3
layout: remove concepts of connectivity, bands, and continents for now
...
We'll use `UnionFind` where needed for now.
2024-05-13 18:43:42 +02:00
Mikolaj Wielgus
8a3bf45fd8
egui: store invoker in state instead of reconstructing it each time
2024-05-13 04:28:13 +02:00
Mikolaj Wielgus
7bcb3926d4
autorouter: put autorouter in new `Invoker` object for Command pattern
2024-05-13 03:20:57 +02:00
Mikolaj Wielgus
d9ff08477c
autorouter: encapsulate selection in `Selection` object
...
Just a thin wrapper over `HashSet` for now, but will contain more
complicated logic later.
2024-05-13 03:20:47 +02:00
Mikolaj Wielgus
f893f73cd8
autorouter: autoroute only selected
2024-05-12 20:29:07 +02:00
Mikolaj Wielgus
a6fb1157e3
egui,tests: fix compilation errors
2024-05-12 01:57:40 +02:00
Mikolaj Wielgus
42a0777e7f
sdl2-demo: disable painting of bends
...
These cause stack overflows due to a bug in Pathfinder.
2024-05-12 01:56:01 +02:00
Mikolaj Wielgus
9bd63d3f0d
tests: change project name of THT female to THT female test
2024-05-12 01:55:35 +02:00
Mikolaj Wielgus
e86ce9836a
drawing: don't intersect with objects on other layers
2024-05-11 22:29:44 +02:00
Mikolaj Wielgus
36bc606401
autorouter: fix off-by-one error when walking over ratlines
2024-05-11 05:00:53 +02:00
Mikolaj Wielgus
2cd33dac60
sdl2-demo: use `Autorouter` object
2024-05-11 03:54:43 +02:00
Mikolaj Wielgus
b3f36d22b4
layout: fix apex detection - these can be joined with loose segs
2024-05-11 02:39:50 +02:00
Mikolaj Wielgus
452bcaf09d
sdl2-demo: fix compilation errors
2024-05-10 23:01:42 +02:00
Mikolaj Wielgus
a5dcacdd69
egui: draw routing start and stop
2024-05-10 20:37:13 +02:00
Mikolaj Wielgus
9ac4c780b5
router: store origin and target in navmesh
2024-05-10 19:54:03 +02:00
Mikolaj Wielgus
c1db44c25f
autorouter: reorder code to avoid peeking in the edges iterator
2024-05-10 19:38:14 +02:00
Mikolaj Wielgus
83f3245e55
router: exclude same-net nodes from navmesh (except for start and stop)
2024-05-10 01:25:00 +02:00
Mikolaj Wielgus
91f9466d74
autorouter,router: route only single layer at a time
...
It makes no sense to route multiple layers at once until we implement
automatic via placement, which is going to take a lot of time.
2024-05-07 20:06:54 +02:00
Mikolaj Wielgus
765738f44b
autorouter: treat (layer, net) pairs like separate nets for ratsnest
...
Most likely we won't be having via placement anytime soon, so let's
narrow our routing capabilities to single layer at a time.
2024-05-07 02:09:48 +02:00
Mikolaj Wielgus
95674a9a53
dsn: skip dot coincident with preceding dot
2024-05-06 20:48:23 +02:00
Mikolaj Wielgus
4efc2d482b
egui: paint currently probed edges in bold yellow
2024-05-06 12:05:50 +02:00
Mikolaj Wielgus
eaecb99146
egui: draw the navmesh
...
This required some considerable rearrangements in `Router`.
2024-05-06 02:35:43 +02:00
Mikolaj Wielgus
63561e6a4a
layout: make apices have the same net as teir zones
2024-05-05 21:39:17 +02:00
Mikolaj Wielgus
946f2dbd6c
autorouter: make it possible to delegate the loop outside `.autoroute()`
2024-05-05 17:55:47 +02:00
Mikolaj Wielgus
b82f5417c3
egui: animate routing as it goes, show attempted traces
2024-05-05 12:55:08 +02:00
Mikolaj Wielgus
a2c8ae7e70
autorouter: put `Layout` in a mutex
2024-05-04 18:02:34 +02:00
Mikolaj Wielgus
ea854abfc7
Revert "egui: perform routing in separate thread or task"
...
This reverts commit 4144ee361f .
Instead of mutexing the autorouter, we'll mutex the layout.
2024-05-04 15:03:36 +02:00
Mikolaj Wielgus
4144ee361f
egui: perform routing in separate thread or task
2024-05-03 19:50:38 +02:00
Mikolaj Wielgus
682f179cad
egui: draw bounding boxes
2024-05-03 02:42:42 +02:00
Mikolaj Wielgus
2be8baab55
autorouter: route all ratline endpoint pairs
...
Routed bands are intersecting with each other for some reason, but at
least this doesn't crash.
2024-05-03 01:36:07 +02:00
Mikolaj Wielgus
531bc6d22c
autorouter: as a starter, route the endpoints of only the first ratline
2024-05-03 01:36:04 +02:00
Mikolaj Wielgus
9c332bdde3
egui: add "Autoroute" button
...
Not functional yet as I still haven't implemented
`Autorouter::autoroute()`
2024-05-02 18:53:43 +02:00
Mikolaj Wielgus
5664b73494
layout: implement creation and return of the apex
...
Apex is the dot positioned at the center of a zone that is used to
terminate and tie any band ending in the zone.
2024-05-02 01:21:00 +02:00
Mikolaj Wielgus
ea22ba705c
layout: create `Zone` struct for accessing zone properties
2024-05-01 20:57:49 +02:00
Mikolaj Wielgus
c74e69a5e9
autorouter: move ratsnest to `Autorouter`, move overlay to egui module
2024-04-27 01:12:01 +02:00
Mikolaj Wielgus
81f9f82f40
overlay: move overlay to new autorouter module
2024-04-26 02:34:25 +02:00
Mikolaj Wielgus
6f9015106d
overlay: separately triangulate each net
...
The way this is done is ineffective of course and we'll have to optimize
it later.
2024-04-24 03:01:50 +02:00
Mikolaj Wielgus
133d14b8bc
overlay: don't create ratlines for connected nodes
2024-04-23 21:39:16 +02:00
Mikolaj Wielgus
5ce35a5357
overlay: make ratlines between centers of pads instead of teir dots
2024-04-23 00:56:20 +02:00
Mikolaj Wielgus
68df579308
overlay: minimize ratsnest edge lengths
2024-04-22 18:06:42 +02:00
Mikolaj Wielgus
44bbb20e62
triangulation: for refs consistently use structs instead of tuples
2024-04-22 01:31:02 +02:00
Mikolaj Wielgus
8d59242f3f
overlay,egui: impl. incomplete ratsnest generation and drawing
...
For now only doing Delaunay triangulation, then applying minimum
spanning tree (without properly working edge ordering yet).
2024-04-21 19:51:47 +02:00
Mikolaj Wielgus
47b8616a40
triangulation: move out and make independent of layout and drawing
2024-04-20 14:50:17 +02:00
Mikolaj Wielgus
51c6eeea1f
router: rename "mesh" to "navmesh"
...
Clearer name. There will be more kinds of meshes (e.g. the ratsnest).
2024-04-20 14:12:31 +02:00
Mikolaj Wielgus
014aa018a9
router: constructor should return an already prepared mesh
2024-04-20 14:02:52 +02:00
Mikolaj Wielgus
fba86ceccd
router: operate on `Layout`, not `Drawing`
2024-04-20 00:31:20 +02:00
Mikolaj Wielgus
94c88a51f8
router: impl. more traits for triangulation to allow more algorithms
2024-04-19 14:39:50 +02:00
Mikolaj Wielgus
8a6b0724e9
egui: highlight selected zones
2024-04-18 16:35:10 +02:00
Mikolaj Wielgus
43f1248a76
geometry: have a common `Shape` object for both primitives and compounds
2024-04-18 15:41:01 +02:00
Mikolaj Wielgus
e5bae501ad
geometry: make compound weights accessible from `CompoundManagerTrait`
2024-04-18 13:58:04 +02:00
Mikolaj Wielgus
f2569c5167
layout: alias `Node` to not require generic parameters
2024-04-17 21:06:55 +02:00
Mikolaj Wielgus
4c8f7cb804
overlay: toggle only one node at a time, prioritize active layer
2024-04-17 03:36:15 +00:00
Mikolaj Wielgus
87f5f4e8c0
overlay: toggle selection only if clicked inside the shape
2024-04-16 13:38:19 +00:00
Mikolaj Wielgus
4a9322d694
overlay: new module, impl. basic mouse selection of primitives
...
Only check for intersection of the AABB as a starter.
2024-04-16 00:21:18 +00:00
Mikolaj Wielgus
df23ea8398
router: move top-level files to own `router` module
2024-04-14 20:25:01 +00:00
Mikolaj Wielgus
bad487f6af
geometry,drawing: rename grouping to compound, node to node weight
2024-04-13 18:51:34 +00:00
Mikolaj Wielgus
13dd000dba
geometry,layout,drawing: add accessor for node's groupings
2024-04-12 23:50:47 +00:00
Mikolaj Wielgus
9feb32955c
drawing,layout: move zones upwards, from drawing to layout
...
This generally largely drawings from groupings. We need this because it
will be easier to handle all groupings on the level of layout as
continents and bands, which are groupings too, are to be tracked there.
There's a lot of rough edges when it comes to typing and contracts.
2024-04-11 18:07:08 +00:00
Mikolaj Wielgus
5cef59227a
geometry: expose grouping management via new trait
2024-04-10 22:13:45 +00:00
Mikolaj Wielgus
f2d0de6607
geometry: implement checking if point is contained in shape
2024-04-10 03:01:16 +00:00
Mikolaj Wielgus
6932a698f6
geometry: rename `Shape*` to `PrimitiveShape*`
2024-04-10 01:34:18 +00:00
Mikolaj Wielgus
2d5998547a
egui: paint zones (only convex ones work for now)
2024-04-08 21:52:15 +00:00
Mikolaj Wielgus
c141dfc735
dsn: implement importing solid polygons
2024-04-06 01:58:51 +00:00
Mikolaj Wielgus
b04950cafc
drawing: implement adding dots and segs assigned to a zone
2024-04-06 01:57:39 +00:00
Mikolaj Wielgus
1362058db5
sdl2-demo: fix painting of zones
...
The Y coordinate was not inverted, and the zone polygon would not get
closed.
2024-04-06 01:55:58 +00:00
Mikolaj Wielgus
9bf18db4d1
geometry: fix getting grouping members
...
The assumed grouping edge direction was wrong.
2024-04-06 01:53:58 +00:00
Mikolaj Wielgus
36e029012f
sdl2-demo: implement painting of zones (untested)
2024-04-04 13:58:29 +00:00
Mikolaj Wielgus
1a624b83b1
drawing: implement getting zones and teir members
2024-04-04 13:54:47 +00:00
Mikolaj Wielgus
8f9abae921
drawing: rename remnants of the s/layout/drawing rename
2024-04-04 13:50:39 +00:00
Mikolaj Wielgus
0e553fd0ba
drawing: implement getting zone's polygon
2024-04-03 12:33:04 +00:00
Mikolaj Wielgus
1f9b04215a
drawing: rename drawing groupings to zones
...
A zone is a narrower concept than a grouping, as it cannot hold any
bends.
2024-04-03 12:31:51 +00:00
Mikolaj Wielgus
31189a9f5e
geometry: create bboxes for groupings
2024-03-28 01:31:12 +00:00
Mikolaj Wielgus
3a812d5621
geometry: implement incomplete interface for manipulation of groupings
2024-03-26 20:24:15 +00:00
Mikolaj Wielgus
888a4ecbad
geometry: provide basic internals for storing groupings
...
Will develop an interface in subsequent commits.
2024-03-25 12:49:19 +00:00
Mikolaj Wielgus
e23f7de07e
drawing: use `None` instead of negative values to denote no net
2024-03-24 16:34:50 +00:00
Mikolaj Wielgus
6a5be3c368
dsn,drawing: remove mistakenly committed incomplete files
2024-03-23 18:50:00 +00:00
Mikolaj Wielgus
ef823c1c27
board,layout: rename "layout" to "drawing", "board" to "layout"
2024-03-22 23:23:31 +00:00
Mikolaj Wielgus
4cb429ca6d
dsn: handle instance and pin rotations and offsets
2024-03-17 20:16:53 +00:00
Mikolaj Wielgus
d58bff85fe
dsn: don't flip y coord on import, do so when rendering
2024-03-17 13:58:29 +00:00
Mikolaj Wielgus
cc7b3ac875
dsn: flip pads of components placed on the back side
2024-03-17 13:58:29 +00:00
Mikolaj Wielgus
14f3234b7b
dsn: implement crude polygon importing
...
sdl2-demo now stack-overflows when zooming-in too much, probably for a
reason related to pathfinder.
2024-03-17 13:58:29 +00:00
Mikolaj Wielgus
fe89226072
dsn: implement basic import of paths in pads
2024-03-17 13:58:29 +00:00
Mikolaj Wielgus
451d4da7a6
dsn: crudely import rect outlines
2024-03-17 13:58:26 +00:00
Mikolaj Wielgus
5a3ed6adab
layout: don't fail on infringement when adding fixed primitives
2024-03-15 21:21:29 +00:00
Mikolaj Wielgus
74d10f4a9e
layout,sdl2-demo,egui: basic support for displaying two layers
2024-03-14 21:51:29 +00:00
Mikolaj Wielgus
5a0ea94a87
geometry: make shape bboxes occupy only one layer instead of all
2024-03-14 19:17:38 +00:00
Mikolaj Wielgus
cf01cdaea5
geometry: store the bbox in the rtree instead of caching the shape
2024-03-14 17:01:00 +00:00
Mikolaj Wielgus
6965177e78
layout: access shape via layout instead of getting it from a cache
2024-03-14 13:59:22 +00:00
Mikolaj Wielgus
93381f39fb
geometry: store some layer data in `GeometryWithRtree`
2024-03-14 13:27:31 +00:00
Mikolaj Wielgus
9730ff215e
layout: inherit `GetLayer` via enum_dispatch macro
2024-03-14 00:52:57 +00:00
Mikolaj Wielgus
45593c9e7a
dsn,layout: store layer in weights
2024-03-11 22:34:14 +00:00
Mikolaj Wielgus
d8e128e81a
egui: actually load and display the layout
2024-03-09 17:03:05 +00:00
Mikolaj Wielgus
f8892f64a7
dsn: make `DsnDesign` don't own the constructed `DsnRules` object
2024-03-09 13:12:58 +00:00
Tomasz Cichoń
b661047ca8
sdl2-demo: fix envelope/mesh sizes
2024-03-08 13:07:46 +01:00
Tomasz Cichoń
164a2230ee
dsn: encapsulate de::Deserializer, reorganize error types
2024-03-08 12:40:06 +01:00
Tomasz Cichoń
12574712a4
dsn: remove temporary scaling factor
...
The binary targets have zooming and no longer need it for display.
2024-03-08 10:12:31 +01:00
Tomasz Cichoń
23fe001647
tests: add export of prerouted_lm317_breakout
...
The file can now be parsed and partially loaded into Layout.
2024-03-08 09:09:38 +01:00
Tomasz Cichoń
fb6922a5e5
sdl2-demo: add zooming/panning
2024-03-08 08:55:30 +01:00
Tomasz Cichoń
ada12b32fd
dsn: fix import bug misplacing shapes
2024-03-08 06:56:17 +01:00
Tomasz Cichoń
137026301c
dsn: make import skip rather than panic on unsupported shapes
...
This should help debug the infringements happening when trying to load prerouted_lm317_breakout.
2024-03-08 06:00:17 +01:00
Tomasz Cichoń
6bbbc368c6
dsn: refactor the parser/serializer to allow enums
...
This cleans up and defines new types in structure.rs as well.
2024-03-08 05:06:00 +01:00
Mikolaj Wielgus
8a56a16528
egui: implement zooming in/out to a point
2024-03-05 20:02:16 +00:00
Mikolaj Wielgus
4959f3512b
egui: implement moving the canvas horizontally and vertically
2024-03-05 18:51:17 +00:00
Mikolaj Wielgus
b43111030e
egui: implement basic interactive zooming
2024-03-05 12:56:44 +00:00
Mikolaj Wielgus
4689bc8e37
dsn: layout may contain multiple planes
2024-03-04 11:07:34 +00:00
Mikolaj Wielgus
803d8edf94
dsn: count lines from 1, not 0
2024-03-04 10:49:22 +00:00
Mikolaj Wielgus
ec799fb107
dsn: display line, column when printing error
2024-03-03 10:53:42 +00:00
Mikolaj Wielgus
e50fb26bdd
egui: make the WASM port actually work
2024-03-02 16:09:01 +00:00
Mikolaj Wielgus
fd4eb0b4dd
egui: implement basic input file selection from dialog
...
Imported layout is not displayed yet.
2024-03-02 06:54:12 +00:00
Mikolaj Wielgus
d5d26cdaeb
tests: add prerouted LM317 breakout board project for testing
...
Will add some tests for it in later commits.
2024-03-01 11:13:04 +00:00
Tomasz Cichoń
88180f5f33
dsn: add the ability to load planes, polygons and rotated pins
2024-03-01 03:52:28 +01:00
Tomasz Cichoń
de21bbaa8e
dsn, rules: fix import bugs, update test file
2024-02-29 22:12:37 +01:00
Mikolaj Wielgus
2f6b40410c
board: make layout private
...
Also add board/ directory, as I forgot to add it in the previous commit.
2024-02-29 02:28:15 +00:00
Mikolaj Wielgus
8d55fbc837
layout: move connectivity to new superordinate `Board` struct
...
This is very rudimentary (merely compiles and doesn't panic). Routing is
unlikely to work at the moment. I'll be fixing all this in subsequent
commits.
2024-02-28 09:24:49 +00:00
Tomasz Cichoń
b53dc62df3
rules: implement `RulesTrait` for rules imported from DSN
2024-02-28 04:17:59 +01:00
Mikolaj Wielgus
bec701dbc9
Revert "layout: encapsulate weight geometrical datas in new "geodata" structs"
...
This reverts commit a3ba8c9ba9 .
This wasn't the right approach. Instead, we need a superordinate struct
that will manage the connectivity without layout knowing anything about
it.
2024-02-27 06:19:35 +00:00
Tomasz Cichoń
88c353896c
dsn: fix net assignment for imported pins
2024-02-27 04:39:39 +01:00
Mikolaj Wielgus
a3ba8c9ba9
layout: encapsulate weight geometrical datas in new "geodata" structs
2024-02-26 23:39:10 +00:00
Mikolaj Wielgus
7f69ffddf9
geometry: move geometry module to from layout to root
...
As we'll be creating a deeper hierarchy of modules subordinate to
layout, we need to keep the module full paths short to prevent tem from
growing uncontrollably.
2024-02-26 19:16:40 +00:00
Mikolaj Wielgus
bbc89a3c94
dsn: implement loading pins from components
2024-02-24 05:35:07 +00:00
Mikolaj Wielgus
5ba56963ee
dsn,tests: use pins instead of vias in test .dsn file
2024-02-23 23:07:39 +00:00
Tomasz Cichoń
786953787f
dsn: add loading of assignments of pins to nets
2024-02-23 06:30:10 +01:00
Tomasz Cichoń
2014be1004
dsn: add loading of simple images containing pins
2024-02-23 03:52:07 +01:00
Tomasz Cichoń
53fd88f408
design: make layout import resolve via names
2024-02-23 03:41:07 +01:00
Mikolaj Wielgus
c005337ea8
layout: rename "component" to "continent"
...
The term "component" has already a meaning in electronics, and moreover
the term "connected component" from graph theory may apply to more
things (e.g. landmasses made of continents connected with bands may
collectively be considered connected components too).
2024-02-22 21:23:01 +00:00
Mikolaj Wielgus
473a877845
dsn: encapsulate DSN structure in new `DsnDesign` struct
...
Using a placeholder instead of rules and disabled routing for now. Also
did some formatting corrections.
2024-02-22 04:49:55 +00:00
Tomasz Cichoń
3f6bad2ed6
dsn, sdl2-demo: replace hardcoded layout with basic .dsn file
2024-02-21 19:22:05 +01:00
Mikolaj Wielgus
08c03a0e77
egui: implement painting of shapes
2024-02-21 16:29:58 +00:00
Mikolaj Wielgus
f10f7b7ab4
cargo: rename topola-gui to topola-egui, minor refactoring
2024-02-20 04:18:19 +00:00
Mikolaj Wielgus
f2c2dca4be
cargo: introduce topola-gui binary crate
2024-02-19 03:17:38 +00:00
Mikolaj Wielgus
171faec010
cargo,sdl2-demo: move the SDL2 demo to its own module behind a feature
2024-02-19 03:17:03 +00:00
Mikolaj Wielgus
cf8a317f24
layout: remove inserted segbend if updating bows fails
2024-02-15 16:47:41 +00:00
Mikolaj Wielgus
4365284d47
layout: don't make abutters infringable as we don't need that anymore
...
Since we switched from having a long infringables list to using an
epsilon in intersection detection.
2024-02-15 04:01:55 +00:00
Mikolaj Wielgus
ff19c252c1
shape: don't inflate seg front and back to prevent false infringements
2024-02-15 03:28:12 +00:00
Mikolaj Wielgus
6fa6ec7527
layout: use epsilons instead of infringable lists to evade abutters
2024-02-15 02:35:25 +00:00
Mikolaj Wielgus
2197017f54
layout: terminology improvements
...
- "connected" is renamed to "joined" (more local term),
- primitives whose clearance area neighbors another's are now called
"abutters",
- primitives whose geometries depend on a bend are now called
"posteriors" of said bend.
2024-02-13 04:45:39 +00:00
Mikolaj Wielgus
e1f3d3ede4
layout: move neighborhood-collecting code to a new collect module
2024-02-13 00:46:12 +00:00
Mikolaj Wielgus
12af34d492
layout: make infringables include bends around the source
...
This fixes some of the routing failures due to rule infringements.
2024-02-11 20:38:58 +00:00
Mikolaj Wielgus
d5d2ffd9d8
layout: inflate infringement-testing shapes and bboxes
...
This results in unintentional infringements of linked traces. I'll fix
this in subsequent commits by increasing the number of
2024-02-10 00:41:46 +00:00
Mikolaj Wielgus
b66995b30c
shape,layout: restore and fix bend-seg collision detection
2024-02-08 18:11:34 +00:00
Mikolaj Wielgus
7fdf90b126
layout: fix misalignment of shifted bends
2024-02-08 00:00:24 +00:00
Mikolaj Wielgus
850941715e
router,layout,draw: remove hardcoded widths
2024-02-07 00:00:57 +00:00
Mikolaj Wielgus
fd73531687
layout: store rotation direction as joint order instead of in weights
2024-02-06 05:30:53 +00:00
Mikolaj Wielgus
a395da4740
rules: use net as one of the conditions instead of netclass
2024-02-05 23:57:24 +00:00
Mikolaj Wielgus
17209c2a65
draw,layout: create an interface for accessing conditions
2024-02-05 02:53:31 +00:00
Mikolaj Wielgus
e5ddf47eb3
draw,guide: construct guides from rules
2024-02-03 23:19:47 +00:00
Mikolaj Wielgus
d2ff1826a0
layout: attach `Rules` storing design rules to `Layout`
2024-02-02 23:58:23 +00:00
Mikolaj Wielgus
01d285efb0
layout: move guide, segbend files to layout module
2024-02-01 22:23:04 +00:00
Mikolaj Wielgus
847309adae
geometry: make the R-tree private with read-only ref getter
2024-02-01 00:40:06 +00:00
Mikolaj Wielgus
4be2a0ca73
layout,geometry: move R-tree code to a new file in geometry module
2024-01-31 22:15:20 +00:00
Mikolaj Wielgus
39bd393ff7
geometry: make graph private, encapsulate all mutating usage of it
2024-01-30 19:00:16 +00:00
Mikolaj Wielgus
410b029eb3
geometry: move shape to geometry module
2024-01-30 02:06:22 +00:00
Mikolaj Wielgus
8b1d95491d
layout: move `GeometryIndex` and `GeometryWeight` to own file
2024-01-30 01:51:19 +00:00
Mikolaj Wielgus
43df065120
layout: move connectivity, band, loose to layout module
2024-01-30 00:43:56 +00:00
Mikolaj Wielgus
ca23d45673
geometry: move `Geometry` to a new module that is one level deeper
2024-01-30 00:03:01 +00:00
Mikolaj Wielgus
7f044f018f
layout,geometry: move bend reattachment to `Geometry`
2024-01-29 20:46:13 +00:00
Mikolaj Wielgus
67f985c980
geometry,primitive: move code for finding segs and bends to `Geometry`
2024-01-29 02:25:32 +00:00
Mikolaj Wielgus
684d0be641
geometry,primitive: move more code and narrow typing further
...
We replace all instances of `NodeIndex<usize>` in public interfaces of
`Geometry` except for `.first_rail()`, for which we make a dirty
exception.
We also improve terminology a bit:
- "joint" is renamed to "connection",
- "end" is renamed to "joint",
- "leg" is renamed to "limb".
2024-01-29 01:34:06 +00:00
Mikolaj Wielgus
87705653bd
geometry: use narrower types for returned adjacents
2024-01-28 20:53:36 +00:00
Mikolaj Wielgus
4c3d0062b0
geometry,primitive: move first rail, core, inner, outer to `Geometry`
2024-01-28 18:25:02 +00:00
Mikolaj Wielgus
4bb513ee08
cleanup: remove unused imports and traits
2024-01-28 15:01:13 +00:00
Mikolaj Wielgus
59180cc600
primitive,geometry: move bend shape-making code to `Geometry` too
2024-01-28 14:53:26 +00:00
Mikolaj Wielgus
c855853a79
primitive,geometry: move dot, seg shape-making code to `Geometry`
...
We still need to move the code for bends -- but that's for tomorrow.
2024-01-28 00:35:16 +00:00
Mikolaj Wielgus
d35d8cd8dc
geometry: parameterize `Geometry` with general weights and dot weights
2024-01-27 20:09:13 +00:00
Mikolaj Wielgus
3fe54290c6
geometry: rename geometry submodule to layout, small typing changes
2024-01-27 16:20:04 +00:00
Mikolaj Wielgus
9f42991032
layout,geometry: move some code from `Layout` to new `Geometry` struct
2024-01-27 15:33:17 +00:00
Mikolaj Wielgus
8c1b7d1e7e
geometry: move into own module, move dot, seg, bend to separate files
2024-01-27 13:42:33 +00:00
Mikolaj Wielgus
5d1b3dff9a
primitive: rename "dependents" to "legs"
2024-01-25 21:57:32 +00:00
Mikolaj Wielgus
cded5eda7f
router: calculate lengths and estimate costs for A* search
2024-01-24 00:25:53 +00:00
Mikolaj Wielgus
bc72aa62d0
router: reimplement interactive routing
2024-01-23 18:06:41 +00:00
Mikolaj Wielgus
35d713b5e6
layout: allow moving fixed dots
2024-01-22 23:59:36 +00:00
Mikolaj Wielgus
8bd0f20ee0
primitive: create trait for getting primitives with dependent bbox
...
I'm calling these "dependents" for now, but there may be a better word.
2024-01-20 00:40:56 +00:00
Mikolaj Wielgus
37fa62a4c2
layout,connectivity: add band edges when adding terminating segs
2024-01-18 22:02:02 +00:00
Mikolaj Wielgus
644d648f71
layout: use `.update_edge()` instead of `.add_edge()`
...
We never want to end up with a parallel edge. Lack of edge creation is
likely to trigger an assertion, so a bug is more likely to be
immediately caught this way.
2024-01-18 21:06:06 +00:00
Mikolaj Wielgus
16e6162b74
layout: hide band weights, split out to new band module
2024-01-18 19:14:08 +00:00
Mikolaj Wielgus
afe4c586b5
layout: implement removal of bands
2024-01-18 00:48:04 +00:00
Mikolaj Wielgus
2d5de212d2
primitive: slightly reduce code duplication by calling `.adjacents()`
2024-01-17 11:09:31 +00:00
Mikolaj Wielgus
3978802512
geometry: create new module, "loose", for traversal of loose nodes
2024-01-16 22:30:28 +00:00
Mikolaj Wielgus
46b50439c8
geometry: move wraparoundables to new module
2024-01-16 12:32:51 +00:00
Mikolaj Wielgus
9007b850c4
geometry: rename `Index` to `GeometryIndex`
2024-01-16 01:31:36 +00:00
Mikolaj Wielgus
d9b94742e4
geometry: split loose segs into lone and sequential (seq) types
2024-01-15 15:56:37 +00:00
Mikolaj Wielgus
8f8f47a41d
layout: store component instead of net in weight of each fixed primitive
2024-01-14 14:08:17 +00:00
Mikolaj Wielgus
0c6190e235
cleanup,layout: make connectivity and geometry private and clean up
2024-01-13 22:55:54 +00:00
Mikolaj Wielgus
1af5b96768
deps,graph: split out to new geometry and connectivity graph modules
...
The geometry graph is where the layout's dots, segs, and bends are
stored. The connectivity graph is where information about connected
components and relations between tem (e.g. which ones are connected with
bands) and information common to all band primitives are stored.
This removes dependency on the Slab library. We may go back to it
sometime in the future if we decide to phase out usage of Petgraph's
`StableDiGraph`.
2024-01-13 20:36:25 +00:00
Tomasz Cichoń
9a4e8357e7
deps: add thiserror and anyhow, reduce boilerplate
...
This adds rudimentary error messages and unsilences some errors.
2024-01-13 18:58:20 +01:00
Mikolaj Wielgus
0b3fe216db
layout: restore infringability in `.move_dot()`
...
It was temporarily disabled earlier.
2023-12-27 21:56:55 +00:00
Mikolaj Wielgus
90972136da
layout: create `.remove_segbend()`, new and now only way to remove
...
`.remove()` is now private. The dot that terminates a segbend is renamed to "face".
2023-12-27 20:39:04 +00:00
Mikolaj Wielgus
81e316397f
layout,main: display attempted shapes that caused probe to fail
2023-12-23 02:32:43 +00:00
Mikolaj Wielgus
da8af817bf
main: highlight nodes that made the probe fail
2023-12-23 01:03:43 +00:00
Mikolaj Wielgus
9a005c8ba3
main: only color edge if nodes are immediately subsequent in path
2023-12-22 23:36:24 +00:00
Mikolaj Wielgus
95faf96030
router: handle tracer results
...
Pass the result of tracer probing step to the `.on_probe()` observer
method.
Unwrap the result of `.rework_path()`, as it should never fail as the
previous probe step should have ensured that this step is admissible.
2023-12-22 22:46:07 +00:00
Mikolaj Wielgus
b24578ff35
draw: create new error type, `DrawException`
2023-12-22 17:53:38 +00:00
Mikolaj Wielgus
59024d5e74
layout,math: create some error types
...
We need this for debugging, as we need some better way to display what
intersects what at what moment. Otherwise it takes a lot of effort to
figure out what is going on.
I had to create some type annotations that appear superfluous. Might be
interference from the `contracts` library. This should be investigated.
2023-12-22 05:39:46 +00:00
Mikolaj Wielgus
9a755059c0
mesh: fix finding neighbors and edges from non-triangulation vertices
...
This fixes a panic caused by lack of implementation of handling of these.
2023-12-19 21:24:11 +00:00
Mikolaj Wielgus
84d5f9c49e
layout: implement almost working reworked squeezing-under
...
I've temporarily removed collision/infringement detection in
`.move_dot()` because it was a lot of effort to get it right. We'll deal
with this later.
There's a panic due to mesh edges not being generated properly from
loose bends. But this commit is already very large, so I'm going to fix
this in the next one.
There's also some nomenclature changes.
2023-12-19 02:22:55 +00:00
Mikolaj Wielgus
5e3248014c
graph: create `WraparoundableIndex` enum for wraparoundables
2023-12-17 01:44:00 +00:00
Mikolaj Wielgus
73736fef50
primitive: create `GetWraparound` trait to get the wraparound
...
Wraparound is either the outer bend or the first rail bend. We need this
trait because some routines can wrap around both fixed and loose
primitives.
2023-12-17 01:43:55 +00:00
Tomasz Cichoń
ef593aca78
Replace SDL2_gfx with Pathfinder
...
Fixes #12
2023-12-16 22:49:46 +01:00
Mikolaj Wielgus
0706a8c258
primitive: Remove traverser objects
...
Tey were a bad idea. As such objects immutably borrow the layout, one
cannot use tem in a for loop that mutates it.
2023-12-16 13:24:47 +00:00
Mikolaj Wielgus
92834c66c8
graph: Store the offset from the bend immediately below in bend weight
2023-12-16 00:06:13 +00:00
Mikolaj Wielgus
294e6c4f72
graph,layout,primitive: store band index instead of net in loose weights
2023-12-15 01:42:09 +00:00
Mikolaj Wielgus
b8f6b32341
graph,layout,primitive: Rename "layers" to "rails"
...
By "layer" we should be referring to the PCB layers. A "rail" shall be
one in a spatial sequence of parallel and topologically linked tracks,
which together shall be called a "railing".
2023-12-13 17:10:57 +00:00
Mikolaj Wielgus
f2991af721
Remove dependency on `enum-as-inner` crate
...
Fixes https://codeberg.org/mikolaj/topola/issues/13
2023-12-13 14:29:07 +00:00
Mikolaj Wielgus
36710b7a51
tracer: Implement rudimentary wrapping around loose bends
...
Temporarily disabled bend-seg intersection to make it rudimentarily
work.
2023-11-15 15:42:58 +00:00
Mikolaj Wielgus
60c494a171
draw: Clean up some commented-out code and make types narrower
2023-11-15 01:08:28 +00:00
Mikolaj Wielgus
9fe591d4dc
mesh: Make bends vertices, too
2023-11-06 23:22:00 +00:00
Mikolaj Wielgus
d6163d3d44
triangulation: Parameterize to make independent from `Mesh`
2023-11-05 20:19:18 +00:00
Mikolaj Wielgus
961fc02678
primitive: Move `.core()` to a trait only implemented by bends
2023-11-05 13:25:28 +00:00
Mikolaj Wielgus
8379470bb1
mesh: Split out `Mesh` into a new `Triangulation` struct
...
It will be possible for the mesh to contain additional vertices that
aren't part of the Delaunay triangulation. `Mesh` is now a wrapper over
`Triangulation` that implements the same traits, and will be later
adding its own vertices in addition to the ones from triangulation.
2023-11-04 22:49:20 +00:00
Mikolaj Wielgus
66d5b3e605
mesh: Remove `Visitable`, `VisitMap` trait impls
...
I don't know why the original A* implementation needed tem.
2023-11-04 18:33:14 +00:00
Mikolaj Wielgus
13e38c6889
mesh: Use a tagged graph index as vertex index instead of a Spade handle
2023-11-04 18:33:14 +00:00
Mikolaj Wielgus
a6481cb839
band,bow: Remove unused band, bow modules, add new traverser module
...
Implement a traverser for wrapped bends.
2023-11-04 18:28:12 +00:00
Mikolaj Wielgus
9a5b046724
mesh: Use a `.map()` instead of custom iterator `struct`s
2023-10-31 23:35:33 +00:00
Mikolaj Wielgus
a3cedff577
mesh: Make it possible for fixed and loose bends to be vertices
...
But not adding tem to the mesh yet, as it's going to take some effort.
2023-10-30 18:28:03 +00:00
Mikolaj Wielgus
b84dab9d09
layout: Return an iterator over nodes instead of dots
...
It's more general. Needed because mesh will be also generated from fixed
and loose bends.
2023-10-30 16:05:36 +00:00
Mikolaj Wielgus
c46d8c7434
tracer: Starting and finishing is always on a fixed dot
2023-10-30 15:50:35 +00:00
Mikolaj Wielgus
700ffb0096
draw,layout: Move segbend construction to `Layout`
...
The method to add loose dots is now private.
2023-10-29 16:07:43 +00:00
Mikolaj Wielgus
f0e2ba6e3a
contracts: Put contract-bound function body in a `try` block if needed
...
This makes Topola dependent on nightly Rust. If `try` blocks aren't
stabilized before the first release, we'll trivially just undo this
change temporarily, as contracts are just elaborate assertions.
2023-10-29 15:24:41 +00:00
Mikolaj Wielgus
0cf7c718f3
primitive: Remove Option<...> as loose dot is always adjacent to a seg
2023-10-29 06:54:46 +00:00
Mikolaj Wielgus
c163716a6a
graph,layout,primitive: Use loose primitive variants for traces
2023-10-28 13:18:55 +00:00
Mikolaj Wielgus
4b46b2174b
graph,primitive: Remove half-loose seg objects
...
It was complicating things too much. We would have needed a new `Head`
implementation.
2023-10-27 15:44:36 +00:00
Mikolaj Wielgus
5b2e421493
graph,primitive: Implement new `GetWidth` trait
2023-10-27 09:45:52 +00:00
Mikolaj Wielgus
fae2ada334
graph: Remove width from loose seg weights, add it to fixed bend weights
2023-10-27 08:41:03 +00:00
Mikolaj Wielgus
3619c5eab4
layout: Combine primitive creation methods into generics
2023-10-26 14:32:44 +00:00
Mikolaj Wielgus
21ed14ae3d
primitive: Implement appropriate `GetEnds` for primitives
...
Earlier I put a common implementation as a placeholder, now replaced it
with a correct implementation.
2023-10-25 15:29:13 +00:00
Mikolaj Wielgus
6f5a73759a
guide: Take unqualified `{Dot,Seg,Bend}Index` unions as arguments
2023-10-25 15:29:13 +00:00
Mikolaj Wielgus
cedc2253ca
primitive,layout: Remove methods that assume order
...
There's should be no previous or next primitive, only this end and the
other end.
2023-10-25 15:29:13 +00:00
Mikolaj Wielgus
aaad590870
primitive: Remove `.tagged_prev()`, `.tagged_next()` methods
...
Temporarily commented out band code which relied on tem.
2023-10-25 15:29:13 +00:00
Mikolaj Wielgus
62579d98ba
graph: Merge `FixedEnd` and `LooseEnd` into one `Adjacent`
2023-10-25 15:29:13 +00:00
Mikolaj Wielgus
d5acfaccb5
primitive: Remove `.prev_bend()` and `.next_bend()` for now
...
Commented out the experimental code parts that use tem.
2023-10-25 15:29:09 +00:00
Mikolaj Wielgus
0dac23f018
graph,layout: Add creation methods for new primitives and a new label
2023-10-22 05:07:53 +00:00
Mikolaj Wielgus
a2531b078d
graph,primitive: Split the 3 primitives into 7
...
`Dot` becomes `FixedDot` and `LooseDot`.
`Seg` becomes `FixedSeg`, `HalfLooseSeg`, and `FullyLooseSeg`.
`Bend` becomes `FixedBend` and `LooseBend`.
The fixed variants differ from the loose variants by being unchangeable
for the router (though probably will be pushable in some cases, but
that's for later). So typically tey're going to be the initial
conditions.
For now only the fixed variants are used even if actually loose, to
split this change into several commits.
2023-10-22 02:05:22 +00:00
Mikolaj Wielgus
2966df6b2c
graph: Move boilerplate `impl`s to a new `impl_type` macro
2023-10-21 06:04:41 +00:00
Mikolaj Wielgus
403e3e4f98
graph: Remove the `untag` macro
...
To accomplish this, some more methods are moved to traits.
2023-10-21 04:37:18 +00:00
Mikolaj Wielgus
4549de098c
primitive: Move `tagged_{prev,next}` to a trait
...
First step towards getting rid of the `untag` macro.
2023-10-20 23:44:20 +00:00
Mikolaj Wielgus
4d20362e00
primitive: Move `.weight()` method to a new `GetWeight` trait
2023-10-20 01:08:58 +00:00
Mikolaj Wielgus
e271c82b7e
graph: Remove `Tag` trait
...
Name `Index` enum variants explicitly instead.
2023-10-19 22:41:53 +00:00
Mikolaj Wielgus
b52eefb1a3
cleanup: Remove unused imports, formatting
2023-10-19 20:29:31 +00:00
Mikolaj Wielgus
708fbb98f1
graph,primitive: Use enum_dispatch, rely on generics less
2023-10-19 20:07:26 +00:00
Mikolaj Wielgus
4e21ff754d
primitive: Move `.shape()` to a new trait `MakeShape`
2023-10-19 06:38:57 +00:00
Mikolaj Wielgus
ae9dd23b7c
graph: Move `retag` to an enum-dispatched trait
2023-10-18 22:46:18 +00:00
Mikolaj Wielgus
b7ff507302
shape: Use `enum_dispatch` for `Shape`
2023-10-18 02:33:03 +00:00
Mikolaj Wielgus
26778e7d47
draw: Comment out bend-flipping code for now
...
Was causing panics, so let's keep this out of the way for now.
2023-10-17 22:40:47 +00:00
Mikolaj Wielgus
e4e6590b4c
segbend: When constructing, don't assume bend before face dot
2023-10-17 22:39:48 +00:00
Mikolaj Wielgus
11c7f7fb12
layout: Don't modify bends while tey're in the R-tree
2023-10-17 22:37:40 +00:00
Mikolaj Wielgus
478f630a73
tracer: Don't tuck under inexistent bend
2023-10-17 19:02:26 +00:00
Mikolaj Wielgus
177b8cb231
guide: Return Err(...) instead of panicking
2023-10-17 05:17:07 +00:00
Mikolaj Wielgus
087d1deea0
router: Don't try to route around target dot
...
This was causing a panic, as it's not possible to route from *around* a
dot *into* the same dot.
2023-10-17 03:55:21 +00:00
Mikolaj Wielgus
c9d0b2178e
tracer: Add some initial code for squeezing/tucking
...
Not functional yet.
2023-10-17 03:16:02 +00:00
Mikolaj Wielgus
ce72a2ba4b
shape: Fix bend-seg intersection
...
By making zero-length bends non-intersectable.
2023-10-15 01:15:35 +00:00
Mikolaj Wielgus
4ec32c97ba
layout: Move R-tree remove out of `debug_assert`
...
Because of that release builds were panicking.
2023-10-14 04:47:30 +00:00
Mikolaj Wielgus
b1ac987d2f
shape: Temporarily disable bend-seg intersection as it's bugged
2023-10-14 04:46:16 +00:00
Mikolaj Wielgus
bfbad933e2
debug: Create and use `before_probe` observer for search visualization
...
Also changed `as_*`s to `into_*`s.
2023-10-13 04:00:01 +00:00
Mikolaj Wielgus
4e8e9298e6
astar: Probe neighbors before adding tem to queue
2023-10-12 00:19:38 +00:00
Mikolaj Wielgus
af61a6b120
router: Rename `Route` to `Tracer` and simplify related code
2023-10-11 22:23:18 +00:00
Mikolaj Wielgus
cc3b537b5c
debug: Visualize A* running during interactive routing
2023-10-10 21:09:21 +00:00
Mikolaj Wielgus
7a06a9b02d
router: Implement basic cursor following
2023-10-06 22:41:59 +00:00
Mikolaj Wielgus
0e8a6d6e42
Create new `Band` struct to pass around whole bands
2023-10-05 19:52:59 +00:00
Mikolaj Wielgus
0695b1deab
draw: Implement flipping the bend if a shorter one is available
2023-09-19 20:56:40 +02:00
Mikolaj Wielgus
abf92c7f43
contracts: Fix R-tree envelope invariance test
...
Violations were not detected if shape changed but not the envelope
(which is the case when bends are flipped).
2023-09-19 20:44:05 +02:00
Mikolaj Wielgus
f36f80537f
layout: Add invariant testing R-tree envelope invariance
2023-09-19 15:40:26 +02:00
Mikolaj Wielgus
efea917cb1
draw: Use `enum_dispatch` to dynamically dispatch `Head`
2023-09-17 16:54:23 +02:00
Mikolaj Wielgus
394510de8d
layout: Add contracts for node and edge counts
2023-09-16 18:24:57 +02:00
Mikolaj Wielgus
7d2cff9004
route: Add contracts for path length
2023-09-15 22:48:51 +02:00
Mikolaj Wielgus
c94a4c716a
draw: Add contracts for node counts
2023-09-15 22:10:29 +02:00
Mikolaj Wielgus
1a271cd89c
Add `node_count == size` invariant for `Layout`
2023-09-15 01:30:23 +02:00
Mikolaj Wielgus
23311122b4
draw: Fix on-fail cleanup when drawing segbend
2023-09-05 07:51:27 +02:00
Mikolaj Wielgus
05fc42aa38
draw: Change direction depending on chosen guide tangent
2023-09-05 06:02:11 +02:00
Mikolaj Wielgus
f88636057f
draw: Choose the shortest guide tangent
2023-09-05 05:51:21 +02:00
Mikolaj Wielgus
49038a4ddb
Don't forget to reinsert bend into R-tree if bend extension fails
2023-09-05 04:23:26 +02:00
Mikolaj Wielgus
5f37ff7616
Unroute path whose routing failed in the middle
2023-09-05 02:03:32 +02:00
Mikolaj Wielgus
53c24b1a14
Remove created dot if drawing new seg or bend fails
2023-09-04 05:46:58 +02:00
Mikolaj Wielgus
84a5b81032
Iterate and filtermap over tangents in math module instead of for loop
2023-09-04 00:48:55 +02:00
Mikolaj Wielgus
7d76051cbf
Route to goal immediately if a straight path exists at any vertex
2023-09-03 05:43:08 +02:00
Mikolaj Wielgus
73a831ba6d
Visualize every routing search step
2023-09-03 01:56:46 +02:00
Mikolaj Wielgus
c492bd1dda
Parametrize routing using `RouteStrategy` trait
2023-09-02 06:05:13 +02:00
Mikolaj Wielgus
bea6d84878
Implement `AstarStrategy` trait to not borrow A* context multiple times
2023-09-02 01:44:35 +02:00
Mikolaj Wielgus
b5f9a5957a
Route with A* step by step instead of only after A*
2023-09-01 01:35:48 +02:00
Mikolaj Wielgus
1ac8dd2828
Only remove node when collision is detected during placement
...
As the node is inserted into the R-tree only afterwards.
2023-08-31 22:45:51 +02:00
Mikolaj Wielgus
cd5365c26f
Pass `width` as an argument instead of holding it in `Route`
2023-08-31 21:17:25 +02:00
Mikolaj Wielgus
e5ba7401c1
Move routing methods to the `Route` struct
...
Commented out shove/squeeze features for now.
2023-08-31 20:33:34 +02:00
Mikolaj Wielgus
9f201d2c3d
Make `Head`, `Segbend`, `Bow` copyable
...
Having to move or borrow tem, especially `Head`, makes it really
difficult to appease the borrow checker.
2023-08-31 07:27:42 +02:00
Mikolaj Wielgus
1d5b428bf9
Split out drawing routines from `Router` into `Draw`
2023-08-30 06:34:56 +02:00
Mikolaj Wielgus
0d7b10606a
Use `Option::map` instead of if-else
2023-08-30 05:12:11 +02:00
Mikolaj Wielgus
247b78087c
Add methods to unroute or undraw segbends
2023-08-29 21:11:03 +02:00
Mikolaj Wielgus
f2346eedb8
Run `cargo fix`
...
This hasn't cleaned up all the unused import, but it's a good start.
2023-08-29 05:02:45 +02:00
Mikolaj Wielgus
ceef3a7fb7
Take `&impl Interior` argument in path removal method
2023-08-29 01:59:11 +02:00
Mikolaj Wielgus
47aadfcdd3
Introduce `Segbend`, a seg-dot-bend triple
2023-08-29 01:49:37 +02:00
Mikolaj Wielgus
79a26cb324
Split `Walk` trait into `Interior` and `Ends` traits
2023-08-28 22:54:03 +02:00
Mikolaj Wielgus
84a7f5d873
Make `Bow` don't borrow the graph
2023-08-28 19:17:57 +02:00
Mikolaj Wielgus
47b3ffba08
Some small improvements to iteration in graph and layout code
2023-08-28 04:12:25 +02:00
Mikolaj Wielgus
14f6b9f870
Implement basic A* routing
2023-08-27 21:14:42 +02:00
Mikolaj Wielgus
270a7e857c
Provide means of converting dot index to vertex index
2023-08-27 05:00:15 +02:00
Mikolaj Wielgus
d1571c99f6
Wrap `FixedVertexHandle` in a `VertexIndex` struct
2023-08-27 04:03:04 +02:00
Mikolaj Wielgus
9196d95546
Triangulate only after drawing finishes
...
Otherwise we'll end up with the (not yet implemented) pathfinding
algorithm trying to route traces with themselves.
2023-08-26 22:25:01 +02:00
Mikolaj Wielgus
a1afd19fcb
Implement Petgraph's graph traits on a Spade's triangulation
2023-08-25 23:39:44 +02:00
Mikolaj Wielgus
658bb112c2
Move Delaunay triangulation to a new `Mesh` struct
2023-08-24 21:23:37 +02:00
Mikolaj Wielgus
8456259b38
Rename `Layout` to `Router`, `Mesh` to `Layout`
2023-08-24 03:32:50 +02:00
Mikolaj Wielgus
234a52f9e8
Rename "route" to "draw" and "shove" to "squeeze"
...
The terms "route" and "shove" will be reserved to functions on the
higher level of abstraction.
2023-08-23 19:00:47 +02:00
Mikolaj Wielgus
bbbd2f57fe
Add `Guide` struct to generate guide curves
2023-08-23 05:15:16 +02:00
Mikolaj Wielgus
356154c914
Make inner and outer circle obtainable from `Shape`
2023-08-22 21:40:10 +02:00
Mikolaj Wielgus
c7f89c9fb9
Delaunay triangulation using Spade library
2023-08-19 05:55:28 +02:00
Mikolaj Wielgus
c480111624
Display mesh edges
2023-08-18 22:37:21 +02:00
Mikolaj Wielgus
a077dfbca2
Don't collide with the same net
2023-08-18 02:39:11 +02:00
Mikolaj Wielgus
17d03bb9db
Add seg-bend and bend-bend collision detection
2023-08-17 03:33:22 +02:00
Mikolaj Wielgus
6e87f9c124
Fix dot-bend collision detection
...
Fixes bend AABB calculation and the actual circle-arc intersection
algorithm.
2023-08-16 21:39:24 +02:00
Mikolaj Wielgus
4f473bacec
Exclude mesh neighbors from collision detection
2023-08-16 19:55:12 +02:00
Mikolaj Wielgus
1a599951cd
Implement basic failure for moving dot to obstructed place
...
Intersection with bends isn't working yet.
2023-08-15 04:10:55 +02:00
Mikolaj Wielgus
c2a553c475
Incomplete implementation of low-level collision routines (untested)
2023-08-13 22:49:01 +02:00
Mikolaj Wielgus
14c3acb633
Change `Shape` from struct to enum
...
It's more readable to use a match rather than an odd if condition.
2023-08-08 02:28:41 +02:00
Mikolaj Wielgus
bdf3930894
Reinsert all bends into R-tree when moving a dot
...
This was causing a crash. Added some code that was used to debug this.
2023-08-02 00:28:52 +02:00
Mikolaj Wielgus
409cea61c0
Add macro to debug graph
2023-07-31 15:44:18 +02:00
Mikolaj Wielgus
0c32ea7e41
Partial implementation of releasing bends
...
There's a panic when releasing (unbending) any of the inner bends in the
demo (the outer one works for some reason).
2023-07-31 05:06:09 +02:00
Mikolaj Wielgus
f9ec5a0ef7
Implement basic interactive dragging and stretching
2023-07-29 22:29:08 +02:00
Mikolaj Wielgus
e5a1c52655
Rename `Stretch` to `Bow`
...
I wanted to name it `String` (as in bowstring), but it's taken in Rust,
and `Bowstring` is longer than just `Bow`, and the thing in question is
very much bow-shaped, so I went with `Bow`.
2023-07-26 02:29:54 +02:00
Mikolaj Wielgus
f563bc2c5a
Set up shoving demo
2023-07-25 22:49:45 +02:00
Mikolaj Wielgus
68c2863784
Implement basic shoving
2023-07-25 04:08:06 +02:00
Mikolaj Wielgus
7c86b902aa
Add `Stretch` object to hold bend together withs neighboring segs, bends
2023-07-23 03:45:16 +02:00
Mikolaj Wielgus
9c75151d3a
Implement .next() and .prev() methods to traverse along traces
2023-07-23 01:36:22 +02:00
Mikolaj Wielgus
925448802a
Create a new `Set` trait for collections of node indices
2023-07-22 20:55:25 +02:00
Mikolaj Wielgus
f1772ca0be
Store width and points instead of weights in `Shape`
2023-07-22 03:48:56 +02:00
Mikolaj Wielgus
dea65a3b43
Add `untag!` macro, move `.shape()` to `Primitive`
2023-07-21 23:31:26 +02:00
Mikolaj Wielgus
8b5cfb3686
Rename `Primitive` to `Shape`, introduce new `Primitive`
...
Move some `Mesh` methods into `Primitive`.
2023-07-21 23:31:20 +02:00
Mikolaj Wielgus
69317384dd
Separate dot and bend arounds. Keep an edge to the core from each bend
2023-07-21 05:40:04 +02:00
Mikolaj Wielgus
16990517b2
Make segs nodes instead of edges
...
This simplifies logic. Nodes store data as weights, while edges now only
describe relations between nodes with dataless enums -- labels.
2023-07-19 19:47:56 +02:00
Mikolaj Wielgus
b5f85068df
Store all relevant indexes as neighbors instead of in weights
2023-07-15 16:39:46 +02:00
Mikolaj Wielgus
26112724c7
Make bends nodes
...
This is necessary because bends may have more than two neighbors: apart
from the ends, there's also the node around which the bend is wrapped
(not yet made a neighbor, will be done in subsequent commits).
2023-07-14 12:40:30 +02:00
Mikolaj Wielgus
bedd7c744a
Add some utility functions for working with `Index`es and `Weight`s
2023-07-14 00:17:46 +02:00
Mikolaj Wielgus
dabe364420
Pass around routing state with a new `Head` struct
2023-07-13 18:18:46 +02:00
Mikolaj Wielgus
0770917a41
Implement bending on bends
...
There's some ugly constants added here and there, will clean this up
later.
2023-07-12 11:15:54 +02:00
Mikolaj Wielgus
dfcfc99413
Implement routing *into* dots
2023-07-12 01:01:59 +02:00
Mikolaj Wielgus
cf6460a3db
Initial commit
...
Very basic routing routines and data model. No pathfinding implemented
yet.
2023-07-12 01:01:25 +02:00