123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- #!/bin/bash
- #
- # Convenient BRL-CAD to G-Code (RS274NGC) converter script
- #
- # Copyright (c) 2009 Michael Buesch <mb@bu3sch.de>
- # Licensed under the GNU/GPL version 2 or later.
- #
- # Below you can define alternative paths to the conversion tools
- # Default is to use the tool found in $PATH
- # BRL-CAD G-to-VRML conversion tool
- G2VRML="g-vrml"
- # VRML to PGM conversion tool
- MESH2HMAP="mesh2hmap"
- # PGM to PNG conversion tool
- PGM2PNG="pnmtopng"
- # Image to GCODE conversion tool
- IMAGE2GCODE="image-to-gcode"
- # GNU bc calculator
- BC="bc"
- tmp_prefix="/tmp/brlcad2gcode-$RANDOM"
- log_file="$tmp_prefix.log"
- vrml_file="$tmp_prefix.vrml"
- pgm_file="$tmp_prefix.pgm"
- png_file="$tmp_prefix.png"
- function cleanup
- {
- rm -f ${log_file}
- rm -f ${vrml_file}
- rm -f ${pgm_file}
- rm -f ${png_file}
- }
- # cleanup_and_exit(exit_code)
- function cleanup_and_exit
- {
- cleanup
- exit $1
- }
- function sigterm
- {
- echo "Terminating."
- cleanup_and_exit 1
- }
- trap sigterm TERM INT
- cleanup
- # check_tool(tool, args, expected_return_code, install_hint, debian_package)
- function check_tool
- {
- local tool="$1"
- local args="$2"
- local expected_return="$3"
- local install_hint="$4"
- local debian_package="$5"
- $tool $args > ${log_file} 2>&1
- res=$?
- if [ $res -ne $expected_return ]; then
- cat ${log_file}
- echo
- echo "ERROR: Failed to probe $tool"
- echo "Please install $install_hint"
- if [ -n "$debian_package" ]; then
- echo
- echo "If you are running Debian Linux, please run the"
- echo "following command (as root) to install the package:"
- echo " apt-get install $debian_package"
- fi
- cleanup_and_exit 1
- fi
- }
- check_tool $G2VRML --help 1 "'BRL-CAD' (http://brlcad.org/)" ""
- check_tool $MESH2HMAP --help 0 "'mesh2hmap' (http://mesh2hmap.sf.net/)" ""
- check_tool $PGM2PNG --help 1 "'netpbm' (http://netpbm.sf.net/)" "netpbm"
- check_tool $IMAGE2GCODE /dev/zero 1 "'EMC2' (http://linuxcnc.org/)" ""
- check_tool $BC --help 0 "'GNU bc' (http://www.gnu.org/software/bc/)" "bc"
- function usage
- {
- echo "BRL-CAD to GCODE (RS274NGC) converter"
- echo
- echo "Usage: $0 [options] brlcad_db.g brlcad-db-object gcode.ngc"
- echo
- echo "Valid options are:"
- echo " --proj PLANE The projection axis plane in the 3D data used"
- echo " for the height in the heightmap."
- echo " PLANE may be either of:"
- echo " +z -z +y -y +x -x"
- echo " +z is default"
- echo " --imperial If set, use imperial units (inch) instead of metric"
- echo " units (mm)."
- echo " --meshres RES Resolution (in units; see --imperial) for the mesh."
- echo " You also need to specify this value in the"
- echo " image-to-gcode dialog 'Pixel size' field!"
- }
- METRIC=1
- projection="+z"
- meshres=
- brlcad_g_file=
- brlcad_g_object=
- ngc_file=
- # Parse commandline args
- while [ $# -gt 0 ]; do
- case "$1" in
- --proj)
- shift
- if [ $# -lt 1 ]; then
- echo "Missing argument to --proj"
- cleanup_and_exit 1
- fi
- projection="$1"
- case "$projection" in
- "+z" | "-z" | "+y" | "-y" | "+x" | "-x" )
- ;;
- *)
- echo "Invalid --proj plane. Must be one of +z -z +y -y +x -x"
- cleanup_and_exit 1
- ;;
- esac
- ;;
- --imperial)
- METRIC=0
- ;;
- --meshres)
- shift
- if [ $# -lt 1 ]; then
- echo "Missing argument to --meshres"
- cleanup_and_exit 1
- fi
- meshres="$1"
- ;;
- *)
- if [ $# -ne 3 ]; then
- usage
- cleanup_and_exit 1
- fi
- brlcad_g_file="$1"
- brlcad_g_object="$2"
- ngc_file="$3"
- break
- ;;
- esac
- shift
- done
- if [ -z "$brlcad_g_file" -o -z "$brlcad_g_object" -o -z "$ngc_file" ]; then
- usage
- cleanup_and_exit 1
- fi
- if ! [ -r "${brlcad_g_file}" ]; then
- echo "ERROR: Could not read input .g file ${brlcad_g_file}"
- cleanup_and_exit 1
- fi
- if [ $METRIC -eq 0 ]; then
- UNITS="inch"
- else
- UNITS="mm"
- fi
- if [ -z "$meshres" ]; then
- if [ $METRIC -eq 0 ]; then
- meshres="0.004"
- else
- meshres="0.100"
- fi
- fi
- # Convert the BRL-CAD database to VRML
- echo "Converting BRL-CAD database object to VRML..."
- $G2VRML ${brlcad_g_file} ${brlcad_g_object} > ${vrml_file}
- res=$?
- if [ $res -ne 0 ]; then
- echo "BRL-CAD to VRML conversion failed: $res"
- cleanup_and_exit 1
- fi
- # Convert the VRML file to a PGM image
- r="$meshres"
- if [ $METRIC -eq 0 ]; then
- r=$(echo "scale=6; $r * 25.4" | bc)
- fi
- echo "Converting VRML to PGM image (Mesh resolution = $r mm)..."
- $MESH2HMAP "--normal=$projection" "--m-pix=$r" ${vrml_file} ${pgm_file} > ${log_file} 2>&1
- res=$?
- if [ $res -ne 0 ]; then
- cat ${log_file}
- echo "VRML to PGM conversion failed: $res"
- cleanup_and_exit 1
- fi
- # Convert the PGM image to a PNG image
- echo "Converting PGM image to PNG image..."
- $PGM2PNG ${pgm_file} > ${png_file}
- res=$?
- if [ $res -ne 0 ]; then
- echo "PGM to PNG conversion failed: $res"
- cleanup_and_exit 1
- fi
- # Convert PNG image to GCODE
- echo "Converting PNG image to GCODE..."
- echo; echo
- echo "--- IMPORTANT ---"
- echo "Please use $meshres $UNITS as 'Pixel size' inside of the following dialog box."
- echo "--- IMPORTANT ---"
- echo; echo
- $IMAGE2GCODE ${png_file} > ${ngc_file}
- res=$?
- if [ $res -ne 0 ]; then
- echo "PNG to GCODE conversion failed: $res"
- rm -f ${ngc_file}
- cleanup_and_exit 1
- fi
- # Done! :)
- cleanup_and_exit 0
|