Commit Graph

334 Commits (517c5edbfa3ae8dc5df4b7d651ba6a3cbc5278de)

Author SHA1 Message Date
Jonathan Westhues 517c5edbfa Add user interface to modify styles: change the color, line width,
line width units, on-screen and export visibility. So now we can
use that to modify the default styles, or to create custom styles.

Also add code to draw fat lines, with round endcaps, since gl
doesn't do that.

Next we need some user interface to assign styles to entities, and
to make all the export file formats support the style attributes.

[git-p4: depot-paths = "//depot/solvespace/": change = 2029]
2009-09-18 00:14:15 -08:00
Jonathan Westhues ce99217bbb Move colors and line widths for almost everything to the styles
mechanism. This gets filled in from some defaults, and stored in
the registry. The default styles do not get saved in the file, but
user-created styles (which aren't supported yet) do.

[git-p4: depot-paths = "//depot/solvespace/": change = 2028]
2009-09-16 23:32:36 -08:00
Jonathan Westhues e989c86a38 Add ability to set export canvas size (paper size for PDF, bbox
size for EPS, etc.). This can either be fixed, with a given width
and height and offset, or automatic, by the left right bottom top
margins.

And draw nicer dimensions for length, with arrows and more
extension lines. Add code to trim those lines against the
(rectangular, axis-aligned) box that contains the actual number,
and use that (instead of the elliptical interpolation, which was
only approximately right) for diameter dimensions too.

[git-p4: depot-paths = "//depot/solvespace/": change = 2027]
2009-09-03 00:13:09 -08:00
Jonathan Westhues f7f9000c68 Discard intersection curves that lie entirely outside of one
surface's domain of u, v in [0, 1]. Cache the starting guess when
projecting a point into a ratpoly surface, to avoid brute force
searching for a good one every time. Split edges even if they
aren't quite inside the trim curve, since the trim boundaries are
pwl, not exact; unnecessary splits won't hurt, but failure to split
when necessary will. Make the triangulation code use a better (but
not perfect) epsilon, to avoid "can't find ear" failures on very
fine meshes.

And turn on compiler optimization! I had somehow forgotten about
that, and it's a ~2x improvement.

[git-p4: depot-paths = "//depot/solvespace/": change = 2026]
2009-08-20 20:58:28 -08:00
Jonathan Westhues 36182448ce Oops, forgot to consider scale (pixels/mm) for translation from
six-DOF mouse.

[git-p4: depot-paths = "//depot/solvespace/": change = 2022]
2009-07-25 17:29:56 -08:00
Jonathan Westhues 806c3d8cde Decrease Z gain while transforming an imported part with the
six-DOF mouse. That's normal to the screen, so it's otherwise easy
to get a big movement without realizing (especially with a parallel
projection of the part).

[git-p4: depot-paths = "//depot/solvespace/": change = 2021]
2009-07-25 15:46:01 -08:00
Jonathan Westhues 606af2ff39 Add support for the 3dconnexion six degree of freedom input devices
(in my case, a SpaceNavigator). I can transform the view of the
part, or transform a part in an assembly.

Also fix up mouse wheel input, so that it works even if it comes in
chunks of less than 120 units.

[git-p4: depot-paths = "//depot/solvespace/": change = 2019]
2009-07-20 11:05:33 -08:00
Jonathan Westhues 92da6c665b Change how step and repeat works: now I build the union of all the
steps in thisShell or thisMesh, and then let the Boolean proceed as
usual. If everything works, then this is equivalent. And it's less
code, and it makes stuff like stepping the step and repeat work.

Also begin to work on line/entity/constraint styles, but no real
work yet.

[git-p4: depot-paths = "//depot/solvespace/": change = 2018]
2009-07-19 17:47:59 -08:00
Jonathan Westhues 8b7f45e72e That optimization where I display the previous group's mesh or
shell when the current group has thisMesh and thisShell empty was
broken, since rotate or step and repeat groups don't use those.

So force something (doesn't matter what) into thisMesh or thisShell
in a step and repeat group, to make sure it always gets
recalculated and displayed. Ugly fix though.

[git-p4: depot-paths = "//depot/solvespace/": change = 2017]
2009-07-19 13:30:09 -08:00
Jonathan Westhues f45eb959f4 Split export.cpp; now exportvector.cpp has all the file format
specific stuff.

[git-p4: depot-paths = "//depot/solvespace/": change = 2014]
2009-07-08 01:44:13 -08:00
Jonathan Westhues 4c825a803a When deleting a request, rewrite the constraints on its points in
such a way as to keep all the points that used to be coincident,
still coincident.

[git-p4: depot-paths = "//depot/solvespace/": change = 2013]
2009-07-08 01:36:18 -08:00
Jonathan Westhues 1692382d5a Replace the closed-form solutions for entity-entity splitting with
a method that works on the piecewise linear segments, and then
refines any intersections that it finds by Newton's method. So now
I support cubics too, and circle-circle intersections, and the code
is much simpler.

[git-p4: depot-paths = "//depot/solvespace/": change = 2012]
2009-07-07 00:21:59 -08:00
Jonathan Westhues 66c93aab73 Add a mechanism to record the lines drawn when we display a
constraint, so that we can export that too. This includes the lines
for the vector font.

A little ugly; it needs some kind of line style (color or width) to
distinguish those lines from the real geometry in the exported
file.

[git-p4: depot-paths = "//depot/solvespace/": change = 2007]
2009-07-03 12:55:57 -08:00
Jonathan Westhues a74f85e0d1 I had been using LENGTH_EPS as the tolerance on both xyz points and
uv points. This is inconsistent, unless the surface happens to be a
plane square with side length one.

So modify the SBspUv tests to take a surface, and measure distance
linearized in that surface. That fixes at least one
mis-classification bug, and doesn't seem to break anything.

[git-p4: depot-paths = "//depot/solvespace/": change = 2005]
2009-07-01 19:32:17 -08:00
Jonathan Westhues 3f5c439873 A very important optimisation; if we know that our mesh/shell is
identical to the previous group's (because our thisShell and
thisMesh are empty), then display the previous group's instead.
This saves us re-triangulating the shell (or recalculating the
edges of a triangle mesh) every time our group gets regenerated,
which was horribly slow.

[git-p4: depot-paths = "//depot/solvespace/": change = 2004]
2009-06-29 23:24:36 -08:00
Jonathan Westhues 4ca7548ffe Don't merge two coincident surfaces unless they share an edge.
Otherwise, we might merge in ways that make things slower (because
the bboxes aren't as tight) or less robust (because the
intersection needs to be split in more places, and that might fail).

[git-p4: depot-paths = "//depot/solvespace/": change = 2003]
2009-06-29 20:38:40 -08:00
Jonathan Westhues f865901bd2 Group edges into chains (that don't intersect edges from the other
contour, except at the ends of the chain), and classify the entire
chain. That's much faster than going edge by edge.

[git-p4: depot-paths = "//depot/solvespace/": change = 2002]
2009-06-26 21:53:56 -08:00
Jonathan Westhues cf77e51ddc I think this fixes an issue importing STEP into Rhino. Something
bad seems to happen when a trim curve's u or v coordinate goes even
slightly outside [0, 1]. And since I considered the bbox of the pwl
segments when merging coincident surfaces (and not the true
curves), that happened. So add a bit of slop, which seems to make
things happy.

[git-p4: depot-paths = "//depot/solvespace/": change = 1999]
2009-06-25 03:58:39 -08:00
Jonathan Westhues 3da334028e Let's use the direction cosines (dot product of unit vectors), not
the arbitrary-magnitude dot product, to classify regions (inside,
outside, coincident) of surfaces against each other.

That lets me always perturb the point for the normals (inside and
outside the edge) by just a chord tolerance, and nothing bad
happens as that distance varies over a few orders of magnitude.

[git-p4: depot-paths = "//depot/solvespace/": change = 1996]
2009-06-21 22:22:30 -08:00
Jonathan Westhues bd36221219 Clean up the marching step size / chord tol stuff, and add code to
export an inexact curve by approximating it with piecwise cubic
segments (whose endpoints lie exactly on the curve, and with exact
tangent directions at the endpoints).

[git-p4: depot-paths = "//depot/solvespace/": change = 1995]
2009-06-21 18:54:09 -08:00
Jonathan Westhues 684ba7deb1 Add a menu item to rotate an imported part by ninety degrees about
the coordinate axis closest to the screen normal.

[git-p4: depot-paths = "//depot/solvespace/": change = 1994]
2009-06-21 12:39:42 -08:00
Jonathan Westhues c6a0148724 When splitting a curve against surfaces, don't split the curve
against the surfaces that it supposedly borders; that will cause
numerical trouble.

[git-p4: depot-paths = "//depot/solvespace/": change = 1993]
2009-06-21 01:54:21 -08:00
Jonathan Westhues 4c8f535305 Split line-surface intersection and shell raycasting stuff into its
own file.

[git-p4: depot-paths = "//depot/solvespace/": change = 1992]
2009-06-21 01:14:49 -08:00
Jonathan Westhues d3dcd8fb23 Now we are actually marching. There seems to be either a numerical
problem or a tendency to generate backwards edges or both, need to
debug that. But it generates the curve, and begins to work.

And change the edge classification. Now instead of testing for
point-on-surface using the results of the raycasting, test for
point-on-surface as a separate step. That stops us from picking up
the additional numerical error from the surface-line intersection,
which may be significant if the ray is parallel or almost parallel
to the surface.

[git-p4: depot-paths = "//depot/solvespace/": change = 1991]
2009-06-21 01:02:36 -08:00
Jonathan Westhues 666ea1c047 Add beginnings of marching surface intersection; I can find all the
boundary points, at least. That required some changes to what gets
passed around (for example because to project a point onto this
inexact curve, we need to know which two surfaces it trims so that
we can do a Newton's method on them).

And fix stupidity in the way that I calculated edge normals; I just
did normal in uv space, and there's no particular reason why that
would be normal in xyz. So edges in long skinny surfaces failed,
for example.

[git-p4: depot-paths = "//depot/solvespace/": change = 1990]
2009-06-18 23:56:33 -08:00
Jonathan Westhues 314227ead7 Don't count point-coincident constraints towards the limit (when
the software is unlicensed), and change the limit to 25.

[git-p4: depot-paths = "//depot/solvespace/": change = 1985]
2009-06-14 14:17:03 -08:00
Jonathan Westhues 7eefb79127 Show a progress message when regenerating is slow. And update the
version number to 1.4, don't include force-hidden entities when
building the loops, and don't show force-hidden entities when that
entity gets copied.

[git-p4: depot-paths = "//depot/solvespace/": change = 1983]
2009-06-13 20:36:38 -08:00
Jonathan Westhues 3b3b7fe680 Add STEP file export for 2d curves too, and disable extrusion not
normal to the sketch.

[git-p4: depot-paths = "//depot/solvespace/": change = 1981]
2009-06-10 21:57:23 -08:00
Jonathan Westhues 19fbae5b66 Oops, don't let the coincident surface merging stuff try to merge
empty (no trims) surfaces. It will generate a screwy bounding box,
which will make things break numerically later.

[git-p4: depot-paths = "//depot/solvespace/": change = 1979]
2009-06-10 00:26:09 -08:00
Jonathan Westhues 2013f9f466 Oops, was computing numerical by perturbing a point in uv; but the
xyz point that I subtracted off had been refined to lie exactly on
our edge's curve, and the uv point that I started with had not. So
normals got randomly screwed up.

[git-p4: depot-paths = "//depot/solvespace/": change = 1978]
2009-06-10 00:04:35 -08:00
Jonathan Westhues 1ac083a9a2 Change the licensing so that we run unrestricted for ninety days
after first execution, but limit the number of constraints to 30
after 90 days.

[git-p4: depot-paths = "//depot/solvespace/": change = 1977]
2009-06-09 22:57:27 -08:00
Jonathan Westhues ee6939a761 Output rational b-spline curves and surfaces in the STEP file, and
make sure that our edge loops are exactly (considering only the
vertex id) closed.

[git-p4: depot-paths = "//depot/solvespace/": change = 1976]
2009-06-08 18:04:15 -08:00
Jonathan Westhues 603f47692e When exporting STEP, identify the outer contours, and group them
and their holes into their own advanced faces. So a single surface
with multiple outer contours generates multiple advanced faces.

Also turn the default chord tol down to 1.5 pixels, seems more
likely to make the exact surface Booleans work.

[git-p4: depot-paths = "//depot/solvespace/": change = 1975]
2009-06-08 08:21:33 -08:00
Jonathan Westhues 9455037e49 Add beginnings of STEP export, which weren't as horrible as I had
feared. Though I don't have rational surfaces or curves going yet,
and I don't have the stuff to handle holes or multiple outer
contours in a single surface.

[git-p4: depot-paths = "//depot/solvespace/": change = 1974]
2009-06-07 22:50:16 -08:00
Jonathan Westhues 3e86050685 Report the number of triangles and surfaces in the naked edges
check, hide the coordinate axes at the origin when normals are
hidden (but still show the coordinate axes at the bottom left of
the screen), and report point-line distance when a point and a line
are selected.

[git-p4: depot-paths = "//depot/solvespace/": change = 1973]
2009-06-07 15:00:57 -08:00
Jonathan Westhues 7a279c4e3f Fix interference check to not report not-2-manifold edges; those
can occur in assemblies with coincident faces. And turn on smooth
shading, finally.

[git-p4: depot-paths = "//depot/solvespace/": change = 1971]
2009-06-06 01:44:58 -08:00
Jonathan Westhues 213c21db87 Oops, was looking for edges on the display mesh that I generated
from the NURBS surface! That got very slow very fast.

[git-p4: depot-paths = "//depot/solvespace/": change = 1970]
2009-06-06 01:19:25 -08:00
Jonathan Westhues 2f7a6bb61d Don't merge coincident surfaces when combining two shells as
"assemble". And don't show "naked" (not occuring in anti-parallel
pairs) edges when just testing for interference.

[git-p4: depot-paths = "//depot/solvespace/": change = 1967]
2009-06-06 00:21:03 -08:00
Jonathan Westhues 2d653eada8 Add code to identify planes and cylindrical surfaces from a solid
of revolution, and put them in the same form as if they had been
draw by an extrusion (so that we can use all the same special case
intersection curves).

And add code to merge coincident faces into one. That turns out to
be more than a cosmetic/efficiency thing, since edge splitting
fails at the join between two coincident faces.

[git-p4: depot-paths = "//depot/solvespace/": change = 1965]
2009-06-04 21:38:41 -08:00
Jonathan Westhues ae35b3595c Revamp the edge classification for Booleans. I no longer make a
separate polygon of coincident (with same or opposite normal)
faces; I instead test all the edges against the other shell, and
have extended the classify-against-shell stuff to handle those
cases.

And the normals are now perturbed a bit numerically, to either side
of the edge, to distinguish tangency from a coincident surface.

This seems to work fairly well, although things still tend to fail
when the piecewise linear tolerance is too coarse.

[git-p4: depot-paths = "//depot/solvespace/": change = 1964]
2009-06-03 19:59:40 -08:00
Jonathan Westhues 24891c0141 Fix a couple of issues with SolveSpace as a library; was using the
wrong parameters for a normal in Example2d(), and the horiz/vert
constraints were not documented correctly.

[git-p4: depot-paths = "//depot/solvespace/": change = 1963]
2009-06-01 19:17:18 -08:00
Jonathan Westhues 438d517c5a If a Boolean fails, then make a note of it in the group's text
window screen, and remind the user that they could 'fix' the
problem by working with meshes instead.

[git-p4: depot-paths = "//depot/solvespace/": change = 1962]
2009-05-30 00:49:09 -08:00
Jonathan Westhues 842645d61f Put back code to generate emphasized edges from a mesh; so now we
can show edges for both meshes and shells, and export them and
hidden line remove and all the usual stuff.

And fix the zoom to fit on startup, so that it considers hidden
entities too. That avoids the problem where things get generated at
stupid chord tolerance because no entities were visible and the
mesh of course did not yet exist.

[git-p4: depot-paths = "//depot/solvespace/": change = 1961]
2009-05-28 21:40:17 -08:00
Jonathan Westhues 7536ccb054 Put back the "snap to vertex" stuff to remove tee intersections
that the BSP-based Booleans create.

[git-p4: depot-paths = "//depot/solvespace/": change = 1960]
2009-05-27 23:07:54 -08:00
Jonathan Westhues ddbd0ff77b Add ability to represent our surfaces as either a shell or a mesh,
according to the user's preference. I templated the housekeeping
stuff for Boolean operations and step and repeat, so it's
relatively clean.

Still need to add the stuff to make a mesh vertex-to-vertex, and to
export sections of a mesh.

[git-p4: depot-paths = "//depot/solvespace/": change = 1959]
2009-05-24 03:37:07 -08:00
Jonathan Westhues 03ecbad981 Add beginnings of stuff to represent surfaces as either meshes or
exact surface shells. And add interference checking; I'll be lazy
and just do that on the meshes, by modifying the self-intersection
tester to ignore coplanar triangles (since that can happen in an
assembly).

[git-p4: depot-paths = "//depot/solvespace/": change = 1958]
2009-05-22 02:02:02 -08:00
Jonathan Westhues ddf9364257 Add a separate display mesh and edge list; so if we're working with
a mesh than that's a copy, and if we're working with a shell then
it's the shell's triangulation.

[git-p4: depot-paths = "//depot/solvespace/": change = 1957]
2009-05-21 01:06:26 -08:00
Jonathan Westhues e70bb37061 Fix bug in hidden line removal when an edge, projected into the xy
plane, lies exactly on the boundary of a triangle.

[git-p4: depot-paths = "//depot/solvespace/": change = 1956]
2009-05-20 05:07:56 -08:00
Jonathan Westhues b4dfb1aded Add code to assemble two shells into one, without checking for any
intersections or otherwise trying to make the result not
self-intersecting.

[git-p4: depot-paths = "//depot/solvespace/": change = 1955]
2009-05-19 19:04:36 -08:00
Jonathan Westhues bc6bdfade8 Save the exact surfaces in the exported file, and import and
transform them for assembly.

[git-p4: depot-paths = "//depot/solvespace/": change = 1954]
2009-05-18 23:26:38 -08:00