diff --git a/README.md b/README.md index e9a9d38d..554e4fca 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ +# SolveSpace + SolveSpace Logo -SolveSpace -========== [![Build Status](https://github.com/solvespace/solvespace/workflows/CD/badge.svg)](https://github.com/solvespace/solvespace/actions) [![solvespace](https://snapcraft.io/solvespace/badge.svg)](https://snapcraft.io/solvespace) [![solvespace](https://snapcraft.io/solvespace/trending.svg?name=0)](https://snapcraft.io/solvespace) @@ -9,29 +9,27 @@ SolveSpace This repository contains the source code of [SolveSpace][], a parametric 2d/3d CAD. -[solvespace]: http://solvespace.com +[solvespace]: https://solvespace.com -Community ---------- +## Community The official SolveSpace [website][sswebsite] has [tutorials][sstutorial], [reference manual][ssref] and a [forum][ssforum]; there is also an official -IRC channel [#solvespace at irc.freenode.net][ssirc]. +IRC channel [#solvespace at web.libera.chat][ssirc]. [sswebsite]: http://solvespace.com/ [ssref]: http://solvespace.com/ref.pl [sstutorial]: http://solvespace.com/tutorial.pl [ssforum]: http://solvespace.com/forum.pl -[ssirc]: https://webchat.freenode.net/?channels=solvespace +[ssirc]: https://web.libera.chat/#solvespace -Installation ------------- +## Installation ### Via official binary packages -_Official_ release binary packages for macOS (>=10.6 64-bit) and Windows (>=Vista 32-bit) are -available via [GitHub releases][rel]. These packages are automatically built by -the SolveSpace maintainers for each stable release. +_Official_ release binary packages for macOS (>=10.6 64-bit) and Windows +(>=Vista 32-bit) are available via [GitHub releases][rel]. These packages are +automatically built by the SolveSpace maintainers for each stable release. [rel]: https://github.com/solvespace/solvespace/releases @@ -39,151 +37,177 @@ the SolveSpace maintainers for each stable release. Official releases can be installed from the `stable` channel. -Builds from master are automatically released to the `edge` channel in the Snap Store. Those packages contain the latest improvements, but receive less testing than release builds. +Builds from master are automatically released to the `edge` channel in the Snap +Store. Those packages contain the latest improvements, but receive less testing +than release builds. [![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/solvespace) Or install from a terminal: -``` +```sh # for the latest stable release: -snap install solvespace +snap install solvespace + # for the bleeding edge builds from master: snap install solvespace --edge ``` ### Via third-party binary packages -_Third-party_ nightly binary packages for Debian and Ubuntu are available -via [notesalexp.org][notesalexp]. These packages are automatically built from non-released -source code. The SolveSpace maintainers do not control the contents of these packages -and cannot guarantee their functionality. +_Third-party_ nightly binary packages for Debian and Ubuntu are available via +[notesalexp.org][notesalexp]. These packages are automatically built from +non-released source code. The SolveSpace maintainers do not control the contents +of these packages and cannot guarantee their functionality. [notesalexp]: https://notesalexp.org/packages/en/source/solvespace/ ### Via automated edge builds -> :warning: **Edge builds might be unstable or contain severe bugs!** +> :warning: **Edge builds might be unstable or contain severe bugs!** > They are intended for experienced users to test new features or verify bugfixes. -Cutting edge builds from the latest master commit are available as zip archives from the -following links: +Cutting edge builds from the latest master commit are available as zip archives +from the following links: - [macOS](https://nightly.link/solvespace/solvespace/workflows/cd/master/macos.zip) - [Windows](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows.zip) - [Windows with OpenMP enabled](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows-openmp.zip) -Extract the downloaded archive and install or execute the contained file as is appropriate for your platform. +Extract the downloaded archive and install or execute the contained file as is +appropriate for your platform. ### Via source code See below. -Building on Linux ------------------ +## Building on Linux ### Building for Linux -You will need the usual build tools, CMake, zlib, libpng, cairo, freetype. -To build the GUI, you will need fontconfig, gtkmm 3.0 (version 3.16 or later), pangomm 1.4, -OpenGL and OpenGL GLU, and optionally, the Space Navigator client library. -On a Debian derivative (e.g. Ubuntu) these can be installed with: +You will need the usual build tools, CMake, zlib, libpng, cairo, freetype. To +build the GUI, you will need fontconfig, gtkmm 3.0 (version 3.16 or later), +pangomm 1.4, OpenGL and OpenGL GLU, and optionally, the Space Navigator client +library. On a Debian derivative (e.g. Ubuntu) these can be installed with: - sudo apt install git build-essential cmake zlib1g-dev libpng-dev \ - libcairo2-dev libfreetype6-dev libjson-c-dev \ - libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev \ - libgl-dev libglu-dev libspnav-dev +```sh +sudo apt install git build-essential cmake zlib1g-dev libpng-dev \ + libcairo2-dev libfreetype6-dev libjson-c-dev \ + libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev \ + libgl-dev libglu-dev libspnav-dev +``` -On a Redhat derivative (e.g. Fedora) the dependencies can be installed with: +On a RedHat derivative (e.g. Fedora) the dependencies can be installed with: - sudo dnf install git gcc-c++ cmake zlib-devel libpng-devel \ - cairo-devel freetype-devel json-c-devel \ - fontconfig-devel gtkmm30-devel pangomm-devel \ - mesa-libGL-devel mesa-libGLU-devel libspnav-devel +```sh +sudo dnf install git gcc-c++ cmake zlib-devel libpng-devel \ + cairo-devel freetype-devel json-c-devel \ + fontconfig-devel gtkmm30-devel pangomm-devel \ + mesa-libGL-devel mesa-libGLU-devel libspnav-devel +``` Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init extlib/libdxfrw extlib/mimalloc +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init extlib/libdxfrw extlib/mimalloc +``` After that, build SolveSpace as following: - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON - make - sudo make install +```sh +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON +make -Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the +# Optionally +sudo make install +``` + +Link Time Optimization is supported by adding `-DENABLE_LTO=ON` to cmake at the expense of longer build time. -The graphical interface is built as `build/bin/solvespace`, and the command-line interface -is built as `build/bin/solvespace-cli`. It is possible to build only the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. +The graphical interface is built as `build/bin/solvespace`, and the command-line +interface is built as `build/bin/solvespace-cli`. It is possible to build only +the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake +invocation. ### Building for Windows -Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed to work. +Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed +to work. -You will need the usual build tools, CMake, a Windows cross-compiler, and flatc. On a Debian derivative (e.g. Ubuntu) these can be installed with: +You will need the usual build tools, CMake, and a Windows cross-compiler. On a +Debian derivative (e.g. Ubuntu) these can be installed with: - apt-get install git build-essential cmake mingw-w64 +```sh +apt-get install git build-essential cmake mingw-w64 +``` Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +``` Build 64-bit SolveSpace with the following: - mkdir build - cd build - cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \ - -DCMAKE_BUILD_TYPE=Release \ - -DFLATC=$(which flatc) - make +```sh +mkdir build +cd build +cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \ + -DCMAKE_BUILD_TYPE=Release +make +``` -The graphical interface is built as `build/bin/solvespace.exe`, and the command-line interface -is built as `build/bin/solvespace-cli.exe`. +The graphical interface is built as `build/bin/solvespace.exe`, and the +command-line interface is built as `build/bin/solvespace-cli.exe`. Space Navigator support will not be available. -If using Ubuntu to cross-compile, Ubuntu 17.10 or newer (or, alternatively, MinGW from the Ubuntu -17.10 repositories) is required. - -Building on macOS ------------------ +## Building on macOS You will need git, XCode tools and CMake. Git and CMake can be installed via [Homebrew][]: - brew install git cmake +```sh +brew install git cmake +``` XCode has to be installed via AppStore or [the Apple website][appledeveloper]; it requires a free Apple ID. Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +``` After that, build SolveSpace as following: - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON - make +```sh +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON +make +``` -Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the +Link Time Optimization is supported by adding `-DENABLE_LTO=ON` to cmake at the expense of longer build time. Alternatively, generate an XCode project, open it, and build the "Release" scheme: - mkdir build - cd build - cmake .. -G Xcode +```sh +mkdir build +cd build +cmake .. -G Xcode +``` The application is built in `build/bin/SolveSpace.app`, the graphical interface executable is `build/bin/SolveSpace.app/Contents/MacOS/SolveSpace`, and the command-line interface executable @@ -192,26 +216,32 @@ is `build/bin/SolveSpace.app/Contents/MacOS/solvespace-cli`. [homebrew]: https://brew.sh/ [appledeveloper]: https://developer.apple.com/download/ -Building on OpenBSD -------------------- +## Building on OpenBSD You will need git, cmake, libexecinfo, libpng, gtk3mm and pangomm. These can be installed from the ports tree: - pkg_add -U git cmake libexecinfo png json-c gtk3mm pangomm +```sh +pkg_add -U git cmake libexecinfo png json-c gtk3mm pangomm +``` Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init extlib/libdxfrw extlib/mimalloc +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init extlib/libdxfrw extlib/mimalloc +``` After that, build SolveSpace as following: - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release - make +```sh +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release +make +sudo make install +``` Unfortunately, on OpenBSD, the produced executables are not filesystem location independent and must be installed before use. By default, the graphical interface is installed to @@ -219,8 +249,7 @@ and must be installed before use. By default, the graphical interface is install `/usr/local/bin/solvespace-cli`. It is possible to build only the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. -Building on Windows -------------------- +## Building on Windows You will need [git][gitwin], [cmake][cmakewin] and a C++ compiler (either Visual C++ or MinGW). If using Visual C++, Visual Studio 2015 @@ -235,17 +264,19 @@ Visual C++ and build it. ### Building with Visual Studio in a command prompt -First, ensure that git and cl (the Visual C++ compiler driver) are in your +First, ensure that `git` and `cl` (the Visual C++ compiler driver) are in your `%PATH%`; the latter is usually done by invoking `vcvarsall.bat` from your Visual Studio install. Then, run the following in cmd or PowerShell: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init - mkdir build - cd build - cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release - nmake +```bat +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +mkdir build +cd build +cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release +nmake +``` ### Building with MinGW @@ -255,25 +286,25 @@ Space Navigator support will be disabled. First, ensure that git and gcc are in your `$PATH`. Then, run the following in bash: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release - make +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release +make +``` [gitwin]: https://git-scm.com/download/win [cmakewin]: http://www.cmake.org/download/#latest [mingw]: http://www.mingw.org/ -Contributing ------------- +## Contributing See the [guide for contributors](CONTRIBUTING.md) for the best way to file issues, contribute code, and debug SolveSpace. -License -------- +## License SolveSpace is distributed under the terms of the [GPL v3](COPYING.txt) or later. diff --git a/src/importidf.cpp b/src/importidf.cpp index 8ca3432a..3cd501c8 100644 --- a/src/importidf.cpp +++ b/src/importidf.cpp @@ -332,8 +332,9 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s double board_thickness = 10.0; double scale = 1.0; //mm - bool topEntities, bottomEntities; - + bool topEntities = false; + bool bottomEntities = false; + Quaternion normal = Quaternion::From(Vector::From(1,0,0), Vector::From(0,1,0)); hEntity hnorm = newNormal(el, &entityCount, normal); diff --git a/src/platform/gui.h b/src/platform/gui.h index 1608a6f2..f63fa80b 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -7,6 +7,7 @@ #ifndef SOLVESPACE_GUI_H #define SOLVESPACE_GUI_H +namespace SolveSpace { class RgbaColor; namespace Platform { @@ -386,5 +387,6 @@ void ExitGui(); void ClearGui(); } +} // namespace SolveSpace #endif diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 67d1eb97..91a197d3 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -372,6 +372,7 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { double rotationGestureCurrent; Point2d trackpadPositionShift; bool inTrackpadScrollGesture; + int numTouches; Platform::Window::Kind kind; } @@ -397,6 +398,8 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { editor.action = @selector(didEdit:); inTrackpadScrollGesture = false; + numTouches = 0; + self.acceptsTouchEvents = YES; kind = aKind; if(kind == Platform::Window::Kind::TOPLEVEL) { NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self @@ -573,7 +576,9 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { using Platform::MouseEvent; MouseEvent event = [self convertMouseEvent:nsEvent]; - if(nsEvent.subtype == NSEventSubtypeTabletPoint && kind == Platform::Window::Kind::TOPLEVEL) { + // Check for number of touches to exclude single-finger scrolling on Magic Mouse + bool isTrackpadEvent = numTouches >= 2 && nsEvent.subtype == NSEventSubtypeTabletPoint; + if(isTrackpadEvent && kind == Platform::Window::Kind::TOPLEVEL) { // This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via // NSPanGestureRecognizer which is how you might expect this to work... We complicate this // further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using @@ -626,6 +631,23 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { receiver->onMouseEvent(event); } +- (void)touchesBeganWithEvent:(NSEvent *)event { + numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; + [super touchesBeganWithEvent:event]; +} +- (void)touchesMovedWithEvent:(NSEvent *)event { + numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; + [super touchesMovedWithEvent:event]; +} +- (void)touchesEndedWithEvent:(NSEvent *)event { + numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; + [super touchesEndedWithEvent:event]; +} +- (void)touchesCancelledWithEvent:(NSEvent *)event { + numTouches = 0; + [super touchesCancelledWithEvent:event]; +} + - (void)mouseExited:(NSEvent *)nsEvent { using Platform::MouseEvent; diff --git a/src/platform/platform.h b/src/platform/platform.h index 21c2b2bf..1ad5e175 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -7,6 +7,7 @@ #ifndef SOLVESPACE_PLATFORM_H #define SOLVESPACE_PLATFORM_H +namespace SolveSpace { namespace Platform { // UTF-8 ⟷ UTF-16 conversion, for Windows. @@ -80,6 +81,7 @@ void DebugPrint(const char *fmt, ...); void *AllocTemporary(size_t size); void FreeAllTemporary(); -} +} // namespace Platform +} // namespace SolveSpace #endif diff --git a/src/resource.cpp b/src/resource.cpp index 7b19081e..258c73a4 100644 --- a/src/resource.cpp +++ b/src/resource.cpp @@ -564,7 +564,7 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) { // Find the hex representation in the (sorted) Unifont file. auto first = unifontData.cbegin(), last = unifontData.cend(); - while(first <= last) { + while(first < last) { auto mid = first + (last - first) / 2; while(mid != unifontData.cbegin()) { if(*mid == '\n') { @@ -588,7 +588,10 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) { if(foundCodepoint < codepoint) { first = mid + 1; while(first != unifontData.cend()) { - if(*first == '\n') break; + if(*first == '\n') { + first++; + break; + } first++; } continue; // and last stays the same diff --git a/src/resource.h b/src/resource.h index 18c1e582..d5c2e3f0 100644 --- a/src/resource.h +++ b/src/resource.h @@ -7,11 +7,23 @@ #ifndef SOLVESPACE_RESOURCE_H #define SOLVESPACE_RESOURCE_H +#include +#include +#include +#include +#include +#include + +namespace SolveSpace { + class Camera; class Point2d; class Pixmap; class Vector; class RgbaColor; +namespace Platform { + class Path; +} // namespace Platform std::string LoadString(const std::string &name); std::string LoadStringFromGzip(const std::string &name); @@ -109,4 +121,5 @@ public: const std::function &traceEdge, const Camera &camera); }; +} #endif diff --git a/src/solvespace.h b/src/solvespace.h index 8a922167..7305b8a8 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -7,6 +7,10 @@ #ifndef SOLVESPACE_H #define SOLVESPACE_H +#include "resource.h" +#include "platform/platform.h" +#include "platform/gui.h" + #include #include #include @@ -122,9 +126,6 @@ static constexpr double LENGTH_EPS = 1e-6; static constexpr double VERY_POSITIVE = 1e10; static constexpr double VERY_NEGATIVE = -1e10; -#include "platform/platform.h" -#include "platform/gui.h" -#include "resource.h" using Platform::AllocTemporary; using Platform::FreeAllTemporary;