Skip to content

The correct way to add elements (paths, lines, etc) in a loop. #71

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
exo-cortex opened this issue Jul 24, 2023 · 3 comments
Closed

The correct way to add elements (paths, lines, etc) in a loop. #71

exo-cortex opened this issue Jul 24, 2023 · 3 comments

Comments

@exo-cortex
Copy link

I am struggling with this library and am wondering if I misunderstood something.
I expected to use the library like this (similar to the example on the docs.rs-page):

let mut data = Data::new();

for i in 0..3 {
    &mut data.move_to((10, i + 10)).line_by((5,0));
}
data.close();
// etc

Apparently data is moved through move_to() and therefor cannot be used in a loop. A similar thing happens if I want to add data to the document within a loop.

What is the correct way of adding elements in a loop?

@IvanUkhov
Copy link
Member

IvanUkhov commented Jul 24, 2023

Yes, it consumes the object each time one invokes any of the path methods. This was done to allow for chaining operations, like what you have in your code. So all you need to do it assign it back to the original variable or use, for instance, folding:

let data = (0..3).fold(Data::new(), |data, i| data.move_to((10, i + 10)).line_by((5, 0))).close();

@exo-cortex
Copy link
Author

thank you! I will try that.
Just one more question: can I reuse the variable data again in another loop if I want to add more lines in a different manner?
What would be the best way of creating n sets of m concentric circles? I have great difficulties understanding how that works, if I cannot re-use the data-element in which I want to dump my circles in.

Also: what is a "path method"? Is it a method that acts on a Path-struct or is it a method that acts on Data and creates a path? In the main example the "path" (in the conventional sense) is created by invoking Data's line_by()-method. But the actual path-named variable is a different object. I think it would be tremendously helpful to add a few sentences explaining the concepts used in this crate and how they relate to each other. I am very confused right now.

It would also be nice to extend the examples-section of this crate a little e.g. several different ways of adding elements loops, conditions e.g. adding several discrete lines (not connected) in a loop (like i tried). Or maybe even recreate the example document used in the wikipedia article for svg.

@IvanUkhov
Copy link
Member

Yes, you can keep chaining operations in different ways. Just remember that they consume the object but then return it back to you. So you have to either append another operation directly or reuse the original or create a new variable binding for future use:

let data = Data::new();
let data = data.line_by((10, 10));
let data = data.line_by((10, 10));
let data = data.line_by((10, 10));
let data = data.line_by((10, 10));

let mut data = Data::new();
data = data.line_by((10, 10));
data = data.line_by((10, 10));
data = data.line_by((10, 10));
data = data.line_by((10, 10));

Think also that you might want to have a separate path with a separate data attribute for each your object instead of putting them all into the same path.

Yes, by a path method, I meant those available in Data. Here is the corresponding part of the spec:

https://www.w3.org/TR/SVG2/paths.html#PathData

Regarding the documentation, there was this issue where I shared my thoughts:

#67

I agree that it would be nice to have move examples of how this crate is supposed to be used—and please feel free to contribute—but the SVG specification is beyond the scope, including what one can compose and how.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants