Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
e435f2e
Fix Visicut calling inkscape in an AppImage.
jnweiger Apr 8, 2024
ab42570
Update tools/inkscape_extension/visicut_export.py
jnweiger Apr 8, 2024
64f5e4f
Update tools/inkscape_extension/visicut_export.py
jnweiger Apr 8, 2024
5bfbeef
rewritten as suggested
jnweiger Apr 8, 2024
4a551e2
Ported the appimage patch to pathlib. Much nicer code and windows com…
jnweiger Apr 9, 2024
693b6ed
Merge branch 'master' into master
jnweiger Oct 26, 2025
fc2ceae
Fix regex pattern for Inkscape version parsing
jnweiger Nov 10, 2025
f0d62e5
update LibLaserCut
tchilov Feb 8, 2026
e2bada4
fix moving because of floating point errors
tchilov Feb 8, 2026
ebab5dc
rename Inkscape extension subfolder to VisiCut
tchilov Feb 8, 2026
69d29a2
move to fablabnbg/LibLaserCut
tchilov Feb 9, 2026
e9daf62
fix LibLaserCut submodule url
tchilov Feb 9, 2026
7770719
fix LibLaserCut submodule url #2
tchilov Feb 9, 2026
046c479
Inkscape extension: fix deprecated codecs.open()
tchilov Mar 27, 2026
4fcb743
update LibLaserCut
tchilov Mar 27, 2026
bf794a7
generatesplash: move from rsvg-convert to magick
tchilov Mar 27, 2026
9f8d896
splash: FLN edition
tchilov Mar 27, 2026
b31da73
Makefile: make run actually run, not compile & run
tchilov Mar 27, 2026
7b15783
Makefile: update help
tchilov Mar 28, 2026
2bf5906
UI: do not hide Extras menu
tchilov Mar 28, 2026
473562a
Inkscape: rename to "VisiCut", remove "Add to"
tchilov Mar 28, 2026
ca7c985
Makefile: add appimage shortcut
tchilov Mar 28, 2026
486aecd
Revert "generatesplash: move from rsvg-convert to magick"
tchilov Mar 28, 2026
0fc3a0e
Update README.md
tchilov Apr 30, 2026
cd74e68
show an error dialog before sending if any laser setting is zero
tchilov May 18, 2026
48e9781
improve Makefile
tchilov May 18, 2026
0ab8c99
increase recent files list to 10 entries
tchilov May 19, 2026
9302fb1
fix laser cutter settings pane being too narrow
tchilov May 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[submodule "LibLaserCut"]
path = LibLaserCut
url = https://github.com/t-oster/LibLaserCut.git
url = https://github.com/fablabnbg/LibLaserCut.git
43 changes: 29 additions & 14 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,49 @@ PREFIX?=/usr
all: jar

help:
@echo "\n\n\n\
usage: \n\
make (or make jar): compile (includes LibLaserCut) \n\
make run: compile and run \n\
make dist: build setup files (in ./distribute subdirectory)\n\
make clean: remove all compiled files\n\
"
@echo "usage:"
@echo " 'make': same as 'make jar'"
@echo " 'make fulljar': compile VisiCut (including LibLaserCut) and run it"
@echo " 'make jar': compile VisiCut and run it"
@echo " 'make run': run VisiCut"
@echo " 'make dist': build setup files (in distribute/ subdirectory)"
@echo " 'make clean': remove all compiled files"

splash:
./generatesplash.sh
jar: splash libLaserCut
# Write version into properties file (used by Help-About screen).
./versionnumber.sh
echo "Version = $(shell ./versionnumber.sh)" > src/main/resources/de/thomas_oster/visicut/gui/resources/VisicutAppVersion.properties

jar:
mvn package
java -Xmx2048m -Xms256m -jar target/visicut*full.jar

fulljar: splash libLaserCut
@echo "Version = $(shell ./versionnumber.sh)" > src/main/resources/de/thomas_oster/visicut/gui/resources/VisicutAppVersion.properties
mvn initialize
mvn package
java -Xmx2048m -Xms256m -jar target/visicut*full.jar

dist:
./distribute/distribute.sh zip
echo "Successfully built the Platform independent ZIP file. For other build variants, please run ./distribute/distribute.sh"
run: jar
@echo "Successfully built the Platform independent ZIP file. For other build variants, please run ./distribute/distribute.sh"

appimage:
./distribute/distribute.sh linux-appimage

run:
@echo "Running the compiled JAR. If you'd like to recompile, run 'make jar'."
@echo
java -Xmx2048m -Xms256m -jar target/visicut*full.jar

libLaserCut:
@test -f LibLaserCut/pom.xml || { echo "Error: the LibLaserCut submodule is missing. Try running 'git submodule update --init'."; false; }
@test -f LibLaserCut/pom.xml || { echo "Error: the LibLaserCut submodule is missing. Try running 'git submodule update --init'."; false; }
cd LibLaserCut && mvn install
cd ..

clean:
rm -f src/main/resources/de/thomas_oster/visicut/gui/resources/splash.png
rm -f src/main/resources/de/thomas_oster/visicut/gui/resources/VisicutAppVersion.properties
mvn clean

install:
mkdir -p $(DESTDIR)$(PREFIX)/share/visicut
cp target/visicut*full.jar $(DESTDIR)$(PREFIX)/share/visicut/Visicut.jar
Expand Down
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
# VisiCut

A userfriendly, platform-independent tool for preparing, saving and sending jobs to Lasercutters.<br/>
For more information please look at the [project page](https://www.visicut.org).
For more information please look at the [project page](https://www.visicut.org).<br/>

This fork is actively developed by members of Fab Lab Region Nürnberg e.V.<br/>
It includes sane defaults and many smaller improvements over [upstream VisiCut](https://github.com/t-oster/VisiCut).

## Download

- [Latest releases](http://download.visicut.org)
- [Some older versions on Github](https://github.com/t-oster/VisiCut/releases)
[GitHub Releases](https://github.com/fablabnbg/VisiCut/releases)

## Compiling and Hacking

See: [Getting Started](https://github.com/t-oster/VisiCut/wiki/Development:-Getting-started) in the wiki
[Getting Started](https://github.com/t-oster/VisiCut/wiki/Development:-Getting-started)

## LibLaserCut

Expand Down
145 changes: 128 additions & 17 deletions splashsource.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 changes: 23 additions & 7 deletions src/main/java/de/thomas_oster/visicut/VisicutModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ public class VisicutModel extends Component // FIXME: "extends Component" isn't

private PlfPart selectedPart = null;
public static final String PROP_SELECTEDPART = "selectedPart";
public static final float ZERO_TOLERANCE = 0.0001f;

private PlfFile plfFile = new PlfFile();

Expand Down Expand Up @@ -866,16 +867,30 @@ public Modification fitObjectsIntoBed()

for(PlfPart p : this.plfFile)
{

boolean modified = false;
Rectangle2D bb = p.getGraphicObjects().getBoundingBox();

result.oldHeight = bb.getHeight();
result.oldWidth = bb.getWidth();



AffineTransform trans = p.getGraphicObjects().getTransform();
//first try moving to origin, if not in range

// automatically move if there are floating point errors
if (bb.getX() < 0 && bb.getX() > -ZERO_TOLERANCE)
{
// adding ZERO_TOLERANCE to show 0 instead of -0 mm as reference point x/y
trans.preConcatenate(AffineTransform.getTranslateInstance(-bb.getX() + ZERO_TOLERANCE, 0));
p.getGraphicObjects().setTransform(trans);
bb = p.getGraphicObjects().getBoundingBox();
}
if (bb.getY() < 0 && bb.getY() > -ZERO_TOLERANCE)
{
trans.preConcatenate(AffineTransform.getTranslateInstance(0, -bb.getY() + ZERO_TOLERANCE));
p.getGraphicObjects().setTransform(trans);
bb = p.getGraphicObjects().getBoundingBox();
}

// if outside of bed, try moving to origin
if (bb.getX() < 0 || bb.getX() + bb.getWidth() > bw)
{
trans.preConcatenate(AffineTransform.getTranslateInstance(-bb.getX(), 0));
Expand All @@ -886,7 +901,7 @@ public Modification fitObjectsIntoBed()
result.newHeight = bb.getHeight();
result.newWidth = bb.getWidth();
result.newX = bb.getX();
result.newY = bb.getY();
result.newY = bb.getY();
}
if (bb.getY() < 0 || bb.getY() + bb.getHeight() > bh)
{
Expand All @@ -898,8 +913,9 @@ public Modification fitObjectsIntoBed()
result.newHeight = bb.getHeight();
result.newWidth = bb.getWidth();
result.newX = bb.getX();
result.newY = bb.getY();
result.newY = bb.getY();
}

//if still too big (we're in origin now) check if rotation is useful
if (bb.getX() + bb.getWidth() > bw || bb.getY() + bb.getHeight() > bh)
{
Expand Down
Loading