3Depict-0.0.22/0000755000175000017500000000000013451744172012462 5ustar pcuserpcuser3Depict-0.0.22/config.sub0000755000175000017500000010646013414250067014446 0ustar pcuserpcuser#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: 3Depict-0.0.22/data/0000755000175000017500000000000013451744172013373 5ustar pcuserpcuser3Depict-0.0.22/data/3Depict.xpm0000644000175000017500000001350012233244573015410 0ustar pcuserpcuser/* XPM */ static const char *_Depict[] = { /* columns rows colors chars-per-pixel */ "32 32 229 2", " c #5D251D", ". c #602C26", "X c #6B2D25", "o c #752D24", "O c #7E2F25", "+ c #65322C", "@ c #73342C", "# c #653934", "$ c #613E39", "% c #773A32", "& c #35410F", "* c #056933", "= c #10723D", "- c #615926", "; c #61423E", ": c #60602B", "> c #29385D", ", c #1B1B7F", "< c #2E1E62", "1 c #012370", "2 c #163A75", "3 c #2B2B75", "4 c #23237A", "5 c #353570", "6 c #3A3A72", "7 c #5D234B", "8 c #64264C", "9 c #622751", "0 c #431B66", "q c #482677", "w c #57367C", "e c #67376B", "r c #014D4D", "t c #094B54", "y c #004D5E", "u c #21447A", "i c #306D69", "p c #64524D", "a c #87342A", "s c #893429", "d c #91362B", "f c #97382E", "g c #9A392D", "h c #843D35", "j c #883B32", "k c #913E34", "l c #993B30", "z c #A23C2F", "x c #A23C30", "c c #8D4239", "v c #9D453B", "b c #9C493F", "n c #AD4034", "m c #B04134", "M c #853140", "N c #843749", "B c #993944", "V c #864D47", "C c #9B574F", "Z c #90475A", "A c #935F59", "S c #A5574D", "D c #AC584F", "F c #B8594D", "G c #A95C53", "H c #B65952", "J c #856741", "K c #B9665C", "L c #9E736D", "P c #B56E66", "I c #BC6A62", "U c #BD766E", "Y c #A67F7A", "T c #B17A74", "R c #BB7A73", "E c #C05E51", "W c #C16D63", "Q c #C37D75", "! c #038103", "~ c #008B00", "^ c #088108", "/ c #0B8D0C", "( c #019301", ") c #009E00", "_ c #0B9E0B", "` c #00871F", "' c #108710", "] c #138913", "[ c #188C18", "{ c #159215", "} c #1E9515", "| c #25951D", " . c #02A402", ".. c #01AA01", "X. c #01B101", "o. c #00BA00", "O. c #00B60A", "+. c #0AB40A", "@. c #00AB14", "#. c #00A61B", "$. c #19A619", "%. c #00B417", "&. c #14B314", "*. c #1FB31F", "=. c #1CBA1C", "-. c #21A11C", ";. c #1CA62B", ":. c #27AC27", ">. c #23B223", ",. c #26BC26", "<. c #23A630", "1. c #3AAD3A", "2. c #00C100", "3. c #00C900", "4. c #00CC0D", "5. c #00D100", "6. c #00D900", "7. c #00E200", "8. c #00EB00", "9. c #00F200", "0. c #2AC12A", "q. c #29CA29", "w. c #33CC33", "e. c #3BA74C", "r. c #4BB54B", "t. c #5BBE64", "y. c #44C544", "u. c #50C850", "i. c #50D851", "p. c #62CF62", "a. c #62D161", "s. c #6BDB6B", "d. c #7BCD7B", "f. c #74D474", "g. c #7EDD7E", "h. c #04058D", "j. c #000F8F", "k. c #150C89", "l. c #001184", "z. c #001E82", "x. c #151586", "c. c #010195", "v. c #000B90", "b. c #05059F", "n. c #0B0B9D", "m. c #0D1790", "M. c #141491", "N. c #21158C", "B. c #271F97", "V. c #211C9F", "C. c #263D8E", "Z. c #0202A4", "A. c #0A0AA6", "S. c #0303AC", "D. c #0D0BAB", "F. c #1313AE", "G. c #1D1DAF", "H. c #0101B2", "J. c #0E0EB0", "K. c #0000BB", "L. c #1617B1", "P. c #1E1DB4", "I. c #1C1BBC", "U. c #2121AE", "Y. c #2D2DB7", "T. c #3131B5", "R. c #3E3EBC", "E. c #573B84", "W. c #4943AE", "Q. c #4040B9", "!. c #0000C2", "~. c #0000CB", "^. c #0000D2", "/. c #0000DA", "(. c #2627C5", "). c #2E2CC3", "_. c #3131C0", "`. c #3C3CCD", "'. c #0000E3", "]. c #0000EB", "[. c #0000F2", "{. c #5151C3", "}. c #5E5EC4", "|. c #4949D5", " X c #5D5DD1", ".X c #6C6EC6", "XX c #7676CE", "oX c #7C7CCF", "OX c #6263D7", "+X c #AB8985", "@X c #AE8D89", "#X c #C58D86", "$X c #C3908A", "%X c #C39791", "&X c #C79D97", "*X c #C79D98", "=X c #C89E99", "-X c #CBABA7", ";X c #CAAEAA", ":X c #CDB8B6", ">X c #CEBEBD", ",X c #80D780", "X>X>X>X:X%XC @ jXjXjXjX", "jXjXjXjXjXjXjXjX] [ ' jXjXjXjX. c R -X;X;X;X;X;X;X;X%XS @ jXjXjX", "jXjXjXjXjX{ r.1X4X6X3Xd.1./ & h S $X&X&X&X&X&X&X&X&X&XP b X jXjX", "jXjXjX^ :.g.aXsXsXsXsXsX8Xa.| - S #X#X#X#X#X$X#X#X#X#XP v j jX", "jXjX^ >.s.6X6X6X7X7X7X7X7X5Xi.-.- U Q Q Q Q Q Q Q Q Q G k k X jX", "jXjX$.w.g.5X2X2X2X2X2X2X2X2Xs.q.} J I I W W W W I W K k a a o jX", "jX/ =.0.f. E.E.w e Z H E F v a s s O . ", "jX_ &.&.u.p.p.p.p.p.p.p.a.t.i C..XyXdXfXpX0XW.q N l d d d d s + ", "! . . .*.y.y.y.r.y.y.y.e.u R.rXgXgXgXgXgXgXpXOXB.7 g g f f d + ", "~ .......&.,.,.,.,.,.<.2 ).eXiXuXuXuXuXiXiXiXtX|.V.8 x z z d # ", "~ ..X.X.X.X.X.+.+.+.+.t P.`.qXwXwXwXwXwXwXwXwXwX X(.N.M m x a ; ", "( o.o.o.o.o.o.o.o.o.` m.I._.XXoXoXoXoXoXoXoXoXoX{.I.L.0 m m @ jX", "( o.2.2.2.2.2.2.2.o.r A.J.P.W.}.}.}.}.}.}.}.}.}.Y.J.J.k.B l $ jX", "! o.3.3.3.3.3.3.3.O.1 Z.S.S.U.R.R.Q.Q.Q.Q.Q.Q.T.A.S.Z.c.9 @ jXjX", "jX..5.5.5.5.5.5.5.@.l.S.S.Z.S.F.U.U.U.U.U.U.P.A.S.S.S.Z.< p jXjX", "jX~ 3.6.6.6.6.6.6.#.v.H.H.H.H.H.H.H.S.D.S.S.H.H.H.H.S.S.x.jXjXjX", "jXjX) 6.7.7.7.6.8.%.j.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.H., jXjXjX", "jXjXjX .6.8.8.8.8.4.z.!.!.!.!.!.!.!.!.!.!.K.!.!.!.!.!.S.4 jXjXjX", "jXjXjXjX) 2.7.8.9.8.y !.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.n.6 jXjXjX", "jXjXjXjXjXjX( +.o.2.* H.^.^.^.^.^.^.^.^.^.^.^.^.^.^.~.x.jXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXh.~./././././././././././././.S.5 jXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXZ./.'.'.'.'.'.'.'.'.'.'.'.K.4 jXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXZ./.].].].].].].].].].K.4 jXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXc.K./.].[.[.[.'.~.n.3 jXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXv.A.S.J.A.M.4 jXjXjXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX" }; 3Depict-0.0.22/data/naturalAbundance.xml0000644000175000017500000016175613414250067017376 0ustar pcuserpcuser 3Depict-0.0.22/data/startup-tips.txt0000644000175000017500000000664713414250067016622 0ustar pcuserpcuser#This is the startup tips file that is passed to wxTipProvider, to generate the startup tips dialog # each tip must be of the form _("some tip") # wx docs say : blank lines, and lines starting with # are skipped _("You can reset the main view by tapping the space bar. Hold down modifier keys like shift,ctrl to change the axis. Double tap to switch which axis to look the other way (+ve or -ve direction)") _("You can delete filters from the tree by selecting them, then tapping delete?") _("Multiple languages are supported? You can translate the program into your own language at https://www.transifex.com/projects/p/3depict/") _("Package files can be easily shared to allow others to view your analysis, using the File->Export->Package menu item. This will automatically import all referenced files (eg pos/rng files) into a single shareable folder") _("You can export plots to SVG \"Vector\" format, for easier editing - edit your plots in inkscape!") _("You can access the manual from the Help menu") _("You can change filter defaults using the Edit->Preferences menu item") _("You can overlay multiple plots at once, by selecting more than on plot at a time (e.g. using Ctrl)") _("Calculations are much faster (more than linear speedup) when working with smaller datasets - try sampling, or clipping out a small region to work faster, then remove the sampling when you are ready") _("You can abort most calculations either by pressing Escape (OSX/Linux), or by using the Abort button (Windows)") _("That anyone can contribute to improving this program, even without knowing about computer programming? Reporting bugs helps us to prioritise our work, and directs us to fix real problems for all users") _("You can load more than one file at a time, then either operate on them separately, or together") _("You can have more than one range file for different parts of your dataset") _("Cameras can be saved and retrieved whenever you like, using the camera tab") _("Subsections of the filter tree can be saved to the \"Stashed filters\" drop-down") _("The console tab along the bottom often shows useful messages from filters. When new messages appear, a small symbol is shown on the tab") _("The raw data used for any plot can be accessed from the \"Raw\" tab on the bottom panel") _("You can ask questions about the program, or using it on your data via our forums (https://sourceforge.net/p/threedepict/discussion/general/)") _("By creating a camera, you can switch between orthographic (parallel) and perspective views") _("You can open multiple files at once, and get a side-by-side view by translating (shifting) one of the datasets to one side") _("From version 0.0.20, vector values in filter properties (e.g. \"(1,0,0)\") can be specified using ISO 31-11 spherical coordinates using the following notation , with angles in degrees") _("You can change the behavior of filter dragging by holding Ctrl (mac: cmd) or Shift whilst dragging? This switches between move, copy and \"splice"\ operations) _("We like to know where we are being helpful? Please consider writing the program and version number in any work you might publish - whether in print or online. Alternatively, link to our website, or write to us to let us know we helped!") _("You can merge files by placing two \"Pos Data\" filters in series, then saving the result?") _("When using the camera 3D cropping tool, you can hold Shift to only move the centre node in one axis (up/down or left/right).)" 3Depict-0.0.22/data/atomic-mass-table.dtd0000644000175000017500000000453212270276630017373 0ustar pcuserpcuser 3Depict-0.0.22/data/textures/0000755000175000017500000000000012342700204015240 5ustar pcuserpcuser3Depict-0.0.22/data/textures/Left-Right-arrow.png0000644000175000017500000004356012233244370021061 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs#o#o5tEXtSoftwarewww.inkscape.org< IDATxwW}>3{{\.r^H#Lɭ;ZQ%GyxߑF)$uǙ@2=1X,ΑY٪iE !{$PQ.n7M9'7qY-lZ2N30iL; ɭ;> n_e9\ƄYuǴ[h`$U D,Sp)M\rN+VW@r8VhqՖvBCܬ8>SL;ZF!uZ i[ڋ۹hs YK ͌ ہ*UK\sOiƨ8U4iG @MQzs$m 4s= `F+Sr @Sr!f R[wQAk1 ӛv/ٕ;GhfއaD,[~a;͑O.SwC1 hfJA{\~~+Wni)Ҕtː5?(;(O fFXܺ# ܂2knv.=x̠j*v_8W<1-a @rK6JmQ׆? H!7Pr|a@r- ք`^96Uo/u!'kR xJc @򒻯Cl߬]5 mc( xdi1^xhfy) c casGzi\eoU=}%~U<C fFWpq6 "`87nଓY{ǔm 1v_|{Z43¼+kE % E1n9#43iS1-aN @U~_xiUKcxq;X j˅FgpR[ 4nT0;A7D5 uƀ6T >)44XT*Khf9%#(Gρskj.{@׫.{60` ~a`OWNfVtC7"LQ>fHdq\tZS%6zaAEzFje _F۷j3k<⯀O̪4Oc 9ܷ6Y\Oom3jɄF&N]`I{Z <ې˷C&!?͜gVƇ_a ʇvFSՔJ@@2"|r#N}4Dٶehx٥ JsJoh<3:/@kwapU4%M9Kl"/B20f)n.|z\>Pj_Yu߯?8#YoEs'M*icF<=r*񍋁!a.L42W2ѹW"h9vb1NFD/#kfi7a>?j6Z52r#_bWv_K9yoÌ[կB0 5cD#/l#DZĥm4.|C2fp.9'ֈXd~dX?ipVN4E/߭@sI @Onn6N[nȆm5-$c!51y]ϟ&7}T.m]LHZy? q}l|1nv+a,5& \OL 3J3%o}z=o-+ ze8k]]lj^Y į`ʹdDZ} . aȾߋGs g]U !=ϼ>pPf.L3!w~?? ZrWJ^Cs΅;`"Uj?̀c1)7} `SUZ_o >%Wq XQq3wn7}2z! C8gۄ!F ŕ8hUb/ŧvZU=7}\t`^m6"7liaMGa!]3˫}k#nkq&z,/<kWFeh*bZ8 Weg1 "&2xp_>;S8nRe`-Q/9._ ׬10F>ś ;˃n[`JX 5 ^7yuaSUOֲ&"K ߏty&zSI0i7} |jEmj^Msb$&$7_M4,wj%H5Йrj˖cK'&kT^Q (aD Ir)84,#%Yg웰 aL\!P62nvץw0/XU[ZY!fBL"yrD%,I}ɛ7C%K}3Fn`  Fu/풵% +;^]:yޫu"t?P$b=Bh`PfYo0{X( lXH"i3 k*p 5G%{Ix_eۅy@LDªg >X@{,PpK)k#ܺ{L|h1\B7޳X̹酏2έ`U3nkGxyX-Kpr3iPAB/& ?Iep^&M'I $e_&p{,48HjDz)!Ux7+#q9d.b%C{Y8^8Njf* DMГN]0Tpa7–pg ̱ mk@]cC)oHqB0hO@B|5^RM1V%&XDHర͕d/s^.?prX4OꂟY@>#GeO,j0)73:I_K`DL(8VKK65$$@0 jp"8RBX/]xq^z.l@re p2UE؂_I;lBE`R9b ;Nϊ\9-S D J #Y `i޵nY u}]ЕGza\.&-23U+B|╾bwh uǁۇ̔lH5RN X"od]3v4Gnq{0<֓va0j`D6Dlv !fHaaF 1ܤipѿqCƑ*>"‘j9 nt'1;pxd^?# ¾d)U=x`MJj\xѵoKkFS81XS^]<1BG$IF8q`/KTn@݇հķ|?"L㷜{_l]@wFBMvN^ØS *@UF 0W7xKE{!rf+ ތZ Ɣ vMY"K}%,J NINN /!H|7['qO1?f~7Vns\3/ ~ _HꤿK ƀ$ K#J푦3{j99bu*v?pVNn$vv bS"E)&bā~*''ղdNϿ&){W`nH\ovYN\E?&ƕc^?OЮ~r+Ejv<·[P"@q ZX"%gwt\F7.oAg #ƚs[0fw?l K Co]gF*;X%1X;KGHL*䐋+ʃ"nXd;qOW`DV;M|U5_o$p}d#дʗ/_O^wGՋX(<%OP>!0"E7~e[/5H<8FffLҀ QXO Ltxd@ Y$"`c6%`]\3o\D- 9<DF7)N\Վ?cc#v]=ݏ>-Tpϸ/Wsgܞ|O "vٟ_x[^c #X'7?1lq Fm'8  ^ő¾y Iz_g1s]/ ۀ4K\0T; |JnxOn?HܾВ'R"T_KXׯiOoVulyqcMęMM&j@2N%`_0Bހh_Y^8=XC CGW%.Nju |-}●r3]mvn?1c<>{Ar[F(kxͿk?le{C6,\:R^5z$DlW'['/~^aEڗ[ܤ&N$o/K Xo: B3$XyxpV==YH-0d~#( OQEO]e1mD?^q#<NZ7۫Z,*9w`R+zP0ٶ5ҸTaV3`q)Ib#S`L%" <1 ÑY*SΌtÑ{/W;T'IX$>*!w@ݏ~aQ(yA@7zBDhO.K/b 2l &@LXe2 Z,rpO/{Cil >BƬw(9Zm V {Io4ʂқ7iaX#hCOQk Xo4lY,D,/ :O xufo:W7eqIaRgރR"])tzW"]WRRHJוHuf~|W{Q}?*5%i x}oCߨ>ʎ(*x69.],A$SjSs˘P^A0NPz&Ճߺ?yS$t n‚vĆ890R6lp_wfMJz/pM ̠Nd/mT4JP"0PM7>)/P⻻QO,jcٺ; Z~_ [?}nԃZʃ! JP%0^濔ud^O1࿄xBr/c6[ W ȡ7G{q|cF(;wmy˕sa`?eVmGz"e?_))dxڛÒjXko-?2DȤj\mXijG$'*~cr{/>xUVR.{[P x݅Sx5J"ފ#<;c0KyGuK˪0[L/PT2W1ˆv/7k 3| *jqNzCdͱ?ٽGR@.~{[kof#ll h,$,a@H-1^A[b,⮍FJDaP0By0`FaDA n E\uVӔkEnAFo6lv >Rl_ 2 Q_]ʔ 2PPe>o9kFOOд\U&DL7a"v5&6t\/Oo.0}HtD/BN0JI 9O3X hSz)ᅄ|RX`q%2(AJ@d.==Oκ5p|g~ySSxboF f 7Hɧ  &nL$W$WUׁC9ܒ}(qIX7 X~o4j/K*EʫܗZhɷ0g?"mWU<0L]ܻkL-R]%MmYǟn07b!=x]beۄ&*8 *WF  kLmPtT^ŷ=M7fT 1h 264cy |Z&7Ěeik u9ܠ_=Tκxw͇T *϶=1?*ś-8'f֜nwֈ6wn` dBF "M5&b  _tAvty>{%}P`8ャ%䄣^m}+c'_oXv?؜qqsJ EVb# 3t wKN{ӚMV x2n"c&F+ X)(${>./].G[?P3g3A:;@ᜁ7!jPm՘h'sg Gr!2rt?"oZUqNӃ?xwxL1,`8foDc]g'i!13AlaA|1: Jdˑ?8VˇQΌ6$uKcqT۪ zPY=.*FP.8rɣ})K7%y`<%լx"jXHUB`W+veރ?  6pMmQ%NkFO>A8@?8ꏽLt,*A@X.h\+w>brX"FGV=rO>Qa0$9s.M䯶T/5< =RJz9c`)[_c v$ |_Om3^A|ӥ;o,x FY4ԨECm521fGcϪր"2pK vw="<:)}y"@f9[r׮=Dz!RJdw^ 85)H$;ooz0"@T5! Ar%4UA9G%֛q.hZ>܏Eםu{2BN3T!jW-Uw*>ٟl M3=?A6xЌ8tO6^HS[E_ ^~ǟS)EzDZzjpncp|3y[OQHXsp8.n:V 8/t˃s4$>?-DX4^ oԛk!,R  ǟ0@ڹ́ރnk)#m%8°M&sθXm$"p8.n&FJe_U7̄lTOι=쏷=8S%4j6JWO{Ճ"+h]]yY`҅  0x|?5.J'/mhQx/}(7f3h<-V:+yFe&wPbHo}":HۚךLp"z0JGE_f$}cb 3Q*ZR#Ujmұgt23jꇎ!$!ĂT01Ld2 EA2vA.- wHng ybPezGO|?iS4odGi"Z;׍̥\!T/;!DJxxLF F)k%U7e`6Ő(n:ض*Z/**?l{3>ͳB ^:U/Hv># `U+C\ .?9A2juaQƟw "Jr=38{k8xD^2,'D@oZbM`E0ɤQo_j:c  #6|sǨGCW9-Bf$@!Hr\9T^rSQt0ь^E @ula0?#9 eam u^ -2\a{Ku~2! 6XՋ./\;"pr+1A0yL΅l4Jސyri+^@ݏ3/]GL@yJU2'EKPlu SRxpWpfT7xXc%q&˛W%&,,@rJ Mp UU/€M1W*HdR6xa*7*A*0tcgCsb.:_%fUU#EqdŮڈ!8ky-k"('W Irg9F h2 *=$\e؆W`o\#yFT `*z&nl}]! p@\-Ӑ6ˎ iyJ#9W! CR6щc/H)5 >"S_ze qZa {gG};o ;_S#5Ĝ3 UUyCW]wF\҈?<m(ٛp.hWRA<:J!PqxIX rE%f0:ࢎپïS}*̋cpضԓʐ.S^{nO^}#+0V0@` !*m0 :fuN1h\މ,u `P7ߥײEB;8kބ $fmBE` w8Dri /,D G sGݒSĜ/!^Q͑6[*dfrlnRBw`(_/@ƅCjR'7h7\ѻAA)Ȧ`nS$qG40]lRr?ٯ\ ,;`8zyx%Ⱦ'zF0 ͮ</\ 0ի/bj"Þ!؟R&oj Z 8:,Ew̴͕!tJ(0gY;i`: ELAYLοQR!Y^(+ie6XTՀl Wt} RZR<ƕ ~`c_4GE K-sȜ3"Z"kg tUD}e|S΅؛V?s<5†x) ?~~`9rq 5|iNv]=;{)7|o^ OҔD/ž%Z6`lhI4˾2'Ȃ kaSPG/+h֬Fܩ KYT ) #zjŐkRR[Wg)( X]_Ty_~[Dƚ-jcraLIwIpa#\\ *F mWXl6=CG2Z#̡z4 )o( =z*q @wkŲ;.c "+py3li,Lt髤<qfkKG=%'p +Ha2O?ߺIuPY}s|g^Q@ 4эY'~,,cymFpYl#zB3A^apNT/ɿ}@ߏtGs ?OoS_A b4:ZSj$٤ńK`[#4Շr.Bsl"!ם'R H#T\ၝc詯ͯ+F_V ڻ9(Um8͒KW.Hv83ldxQG~(ݼ$s$G49g%B:n{7`i?{hCE@%(hnmo|ړaEc(҅!0 CaH!@z5P{o*Da"kq[݄9޵V7@rNXa;߅xtYRcns!u0OHcȖ5gyabrn??)74M$1]ӅfC,i|<1<^# f-AO^+tJ/,lIMꀍ#R6-+K{K{!]_OͯhNE] 7 ,}#o=_1[/_h³ X/8.yGa# s=}sSfZ.ޯU#M}yB^|Gpt@[,o"!s!}(OǍޏnnz۳>A#/什~_ Z e%-&4f-g͛GIDAT `N~;ar0>$v6s]4~?fɢ`R& lуf/QBG:j @eC昃8iagodO yjNӅ3|-s'`_h+pIQ*="ItHqY8Ypg&k纞{[/ 0Ci0`PY^% թxpjWiws{~"xcfɢ@3]TxҵmaDH^'`0  vgOnO ?7X|]@3;P[`R*F ovWO;F Ζ7/tg-C-@[?`(,`j kƓ;S]CLMoyߌ7Yh`t\R{7xJ۩S?=I3jiƫK.ztq{6WnT)-! wu?>OZ4SMTkv c']xE^出c{_ꇿyyLL !E)jHc?g@’-!K'Yz{[Gսnu;};u9O;9uN )%wVgMUzׁǀ;j;n7k$z Bpp纵檙pUq)ρ9simm]ǝ)i3ػwaO|h[jU)oᒢ+B*U@T)S(Y3g`^2)oV>q"`'@mKWF aF4-)DRZœO>AWwW1ʲukoV1V,) 9!H2wi4OmԂ,=bˁ(BSc#@Oo7RJ8}Mk'F ؄Ud$N?ЇYs;4Cl2I eYŝՐhFSمB޾4 ElTMmˀa&~-3ME%fj@VB#AS5TU=E1"2urpǤ]aI1giX`?}\Əާ!{Gx6%Cr!!@[<3z'_ D uzb8x-7v:b‰Pl?tfpLחP"%DEع7 7nc*u8ǍOhљ|__{7'|jDRi`(8{O(bx^%p*=bn};M$o'psJ}SsW&t!» 'I8QL 1'߄ -8|0ӷn;&)o1߷o\I^h=H!o>sBYcb*pÑk^b}O;hhh%1u|DxǸ;ߥDb/AD dX )>VDך+ 4?<]_Ds%?}#(t0 |W,璷_ D"HGH3"@HB"p9t pZT1a҉e4u*z{{XsZTU-#WR_~%t E8 5q)|n-!MDrBJ'MY9D) =H MITbxA j >hjj6yl/{tMIX+9\jS)5| 9pI!1pv`LI|p"M7nYJO字9%gZ]* +Qo|LjG^9)bb| Ɋ*HyOKɁOx6S)1JQ45whفVM3L2Qqt.U9)Tv\K>GwA]ܟLMW .@+ýƧ1*I!qH(o>Y}|>K\iR=iL&tCM\QJ OS釈b7 9rIԊ!s JjLJ{8[[fXAT|yx5hVJ87̘iIT~BH!h^G}AZ/9# BM5&Σ Fl%}!2.b['q$(v]S;I_(,xN!C^ø2\գ$bIҙUNnLD4ZL&ƴSxԵSq>-!]oqf'f5 ;6L7g@HDK"=zx"L81 #+;^fsB**‘<&5ؖ Zw r:L>CQfLEg1M&hzLdppmDz-O`T M53ϤPGimĄCAks+E[ a+YIt&M}]3cL:|'664{fiOdv'% #33c,eb5ũ-[0 e&*464^=T#!pݲ7]ר/<0W2ևD4 [ژVi/@r TYߩ|] =C̶Lm%S(0J躎-m dj6U+j8E&w|E!Hb[˲|f4~ wB&Dso]G_5ΣGefVXIDQTg>o/)mc&_}?nWՈQwv)o8DdPub~f!p&U\/]8_7U1a8?oRSjj 1ą2s% [ܳ~$.|H<`TM@S2w wxBuqJ,RU\D.t_6[yk}bգ[ "mZ{*囚I )sZj @SGeRj? C|ؙ!=&LUF,]QY,>۬)q!Hk"cWpҖ47 {i W_KHgQ$6!ض\|XIݼ̖9EiӢmq +$Tw&""*BlI܁Q9M݆Mx?W_#"& iMDpWbsECWQ㺣E Xeu\ݝy6dۛC瘖K ?l RAi"r-s\YM: \o(`#36MW2 U4LwmP1'ДQ`ǔ1H4,),hZ|z*{*nIނG:nm 6q0 7%Cb`ⶤJEJ9iT7fT>e:Se . lZ UTɈ)1%-Ȝ ;$O5eyMbӗ69oygCkj\ ~9Se(S3j= 3`_Z|7ᝳ`q}nJ6 k`sL[cM[;,teaK{vFx )εiN(evGQ)= ;!k:X !A_ڳO=cOT%Ns eSu! ~V +80/ g 3B< OvͰ"?l@Ѡtwa!(mVRZӹѭ- 55$]·dN@q!a@cY.f8˭/nh{z3`O^8/Hij0 !b-GQ,y͜{0; RpĀz=0'+ [t|aؒ'3d{zЄR_/C-spIد5%{1 NgAhZ{uY}M8XsK-EA{k8g`ff`Q-j+fB/=pZAj UɹfNke !aI 1;NZJÆ,l4%I^tH>w~M˪h71h 2@"'FΆ9؛9h`Y 5 =0`xG ҆›i7p$mGz@-i@SuY[+S2ʼn.Ak݀ТBaz#P^Sy1}LKYDڳl ;Vs_٤.UQ:iH[pȀ^J8F/ ÷ 73vҲmp#uKRJS @ Ȝ5^r3Q%e#(8*C*03c&ؙ`O!`z!۰!C`93> dcp˧f})_@YTiCiK< mdLtXҖ) `Z`Do+ 8n])DP&I?Ig\0uɚG.VD4.k53 2 ` #:T ^˻N_15t2I#88榮Ysm{oX(NkH E.@. }huu' E 0]t!.M8dCnJKk70veG 0,i}GOmkr] CUzeaTh]w|ް,QQώ]#8z7<fG!iæ{|r7]Ǻ8t.)e~e`:Ni8Ypނe5V2A %),۝>b@6r훟y_[#ɐr8t Ca{XBNGp5+zgyXz\#(H[|Qq`tgB@M#savݛ:QNq dH)2u);`v( 62 *g]dwXG `X؅to}_Boa2P&CQ3H/FCHL|ߛ{}gWο.(tTIӉ4*#> L|/p ۇ%r8k2eBSddc\EO&fOF? =\@cGeO c c~ Gځxc@}.H>ЈHm%R$/.UTl5 oYVpCw+Nvyif_y=[38Ÿ^pI 5{?kyIr$?cN]SDg$g+D[D e-61cSH3ocE ` )1{MD62W_xle2XafVjJ\؀!I)Hܲ[>gu.?-PUDT#2M!ц&` v ܓbIQ:f $ 2}0.1m0,j߯  ɐdbBf$C&{zj}'9W]7Zg;UU`uPL% f>_8oezv7̈́$Ǥ-i-*!$FbƆza|ڻ|}VwK@GhB44mI׿_k3cOdxA2$2䜊 pfpQGq =rpfci7c s5tI"4IdJBh8őe3!e?rb‰ȪP%HtIENDB`3Depict-0.0.22/data/textures/middle_clicked_mouse.png0000644000175000017500000001532412233244370022105 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs^tEXtSoftwarewww.inkscape.org<QIDATxyp}?'ApMK,YcvU+٪d+Q]9ޔS&jGXʎHq$Q&EDo@ Aܘ1= 0 H|y{~עb-Jɵ ,!" ȳ']d "2؛"CbdreH&, {Lޑ+2dAcA9h̉ ѝ]+2dAc4e{AFʶ7'VdȂOrbE, {4lȉ , "|#e\ؒ) _c|`S2cADD2e?(b[yx$͍E  "C\)_?:f#@RnUgA7@DSM3,K,`D|5` m97lX@"Yr|G)T2;[n._^d[=a!{h,=DD#֗8~˲BFF]{:2&[N"rǃau\t:vn7a`|9ᖊD~?H$Qkkkٲe WFuO9y$ (jq""dp% "NC`iT իٵkS6&:;;y뭷FDXx1}}}:= ϧ]2K\˗/' p$ZP xͶm^1 "tbY[ls\FfFǻ\.}YD"x=gBm7#S]]g?٤oN'_җzC!\NgLF1Wz}"^d&J,^-o)**aD&-Dd#.yi}^̾MBaDbEvS@3QJkYa8>\O|ꎚywݿJu[+pMYrhh;]O!p:}5!"o\%uǝwޙQgt f嘆0='2I`h+Q}9_))b:~ Jry)dNMM 7k +sNJkEނj/<C!BC vvP\UÊG>Kʋ(AqC@f]]dKD\Jd=w1֖zC}!y}@#e<ď_PW'm|O-l wr3*|RqQY$_0%jnZ)g8ߢk__Y:8CtSYY%|[hoe˫(r珳l2n7p8-% ˗g%k}|:O>5.~1s_4jj&[2?|@ؽ{7o6##[5p5k87(w0|=,t*/^ y9oDGl~<Ȇ عs'eee@ł>GO%K\:cc!Hsʾ}ho0i^@ |)&rȹMYfMlvz{{innȑ#Y{'0k?zSd,߿kN'TWNGGǸ-> ;N'Elij" rNZZZhii&VZL{JeO3L(GA ̊+ ØCh 4uGr_aA[6o9.^v~?7nd͔NH&F/&J)hnnٳ z*j0 {)z40Xcziڴ6g߾}۷zhll$^wqR&rq﷏ըr 4 뫋4&fW t]tfjZ}}>s E]]X;p3 #VJA{{{"xPR\5kXЀ0M cu7 ZKdCqYNpUΝ;ǹs/*aBjJzrQ_WkJ#8]YS3d"8Mؾu+@?mm ¢`YPBHeKP_O}]w1mO`jՂ)jD1x >ol{C8D$G\M  ,bD; 4tQ4Tw I<(u! W`xQ<8,$1f(./M ǖPpI$~ ;Ɯ94F4VIoW<$jR; Cx}+XhVd5 )4P1I҃E)hN Kѝ&E A!J%4)F5""Nr<&R 9~<t")a'W˹v {]Ĺ Q\Esi*&y-2?v=s[$ \"2}!,Kx2LJM S' pA( ;G\DNFԃvc^Cĉ8£5'vbDth! B8A.W;mqx<&mp:=-^뽒9+Yi@qO[_q:Á._=e{qBrq)82FA/0nfʶa qBA?8:0Kr>,""x6{L0+ 0MsdL4)_"g3$0 0s pq@jwl0l!&>"s&@Khq`/}Q}Au[F3 .lI<@ /1G2 cPs&DHx%ihv!F 4MkYjR$B MXl$^@ĄB 6m;Ѭ9b W]☴~ƌyt=][sh"]NSThbl"h9+(IIlyr8te$3 x=8#YK񲨲TiU x#v̒ Ϝ`0a(kZr؜̐ ``ptJKkBfܹu"2?}w;k}Q~Sv/3eÞd:d$3$A |Ԉc&.`Yy]=;=xoPQ"0ŧpYH?J$/X-1M `3`eΟc1"BuA|%pMΟ <XDb gYJV!&42p-,Gb0'\#֌=:5@0oQ8DfΔH$B(BDg+  A{ʠ\ܹ7w[k{`MDGӉi/\%xß)CCg˖,Iy1geKyF9PSYᠻ妉5M~ (EE,^(D9Ғ$ ;ujX41Ѵ![Go-Q|}}\.j|Ci;ujffy#'NE*,(_{{ kt8slKD>zDv5sW8r[SW[oi / ==n]‘ߚNǎ|WDXTZJC}=si^OG:~?0cUC;^m>v쏳~қ2-[7mz om%RXPώ[.3`H2o{>r4).*bE]]|-1k9򏹼a^ `w?"_TR\#vs6.WF}J<1Tx1ǻځ/jn>gy/MMe. @oJ|>ߤOw߾IJ.%%TqGb*_2vlZ?]. ]_YDX\VFue%5UUB!>ҥ KӔPUY ~Wsf-#8l۶uSp5 ){u]XRQ\}.nܻ}RC! `~r& }s-+8ءF`%xS syboC p `2߹SjbXnq[ `TtIENDB`3Depict-0.0.22/data/textures/Right_clicked_mouse.png0000644000175000017500000003673112233244370021731 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< IDATxy|\gu>i$˒[EvVoq$$K[RG- 򃖥@ @Hp6ڱ;-۲Edk_fqg{hFҬ~{Gs4ws< / a`mTEDB*ɯU11mw8w`@kUd0$2,"q^Cs 11yKq~YN0@ٔ  #'+ 40A ""U@'c RUmɑIØ l`iB@fI?CAa rb&F2`((dw !M,@cj@U#gjrlV3a9FKGmMc CH3%Z+{"u{A?()y@*f sT8ߛ+(V>ZXXA·ۮbǤf) 5W`{*,1=0_H5<0$}SYĊDPQ|W s ̉S*+vo%v]l~+~98?GDjsaa]9Xw+}5;F2^ZS\vy.l*uo5PZ\m,vd)_+S]DUKC}< Gmec JqX1zF@EU|80YRyo97dž#b֎Юq*` Z(3T.">#6NdU=<ȜSDwb}+Ac{ͷS#+)ΗF71xX2_DoTo Y)dvf#9,y~>ԧb"Ʃ Lȟg۞bE5-*S,,@Ds*a ;'3RD~,"L Cw)Vit_5<Ʃ,Ct xIDkUaB"qgFzqssa KfӼ||EDRy*u*,Q,˷S#YDU H>OYKZLh_tๆf?,` |mV|h-"cV6t.ӑ>#U{mT@QAශ&\| ho7@rfYXg1Գ[OeDZcE3"ҐQHk•nRA=1Vg#9BUU]z"򈈼]DJ2ec>Iw DTO/|81cT>-ĶM7'Ck2a_.9һxI|81Tu;01_7{HQ?gw C&'jweL yY$Xwxi<7m0gT[U?,Ž> eNjsA$L/(T~FP:w/ "rg~y#sˎΉ` kp][zIb,`Dd#~n2TT~߸9"|-yzsidX]"oNyDCJ0~xlT`3Y&a E(l/?8pe+9UmR40_т.kPAU4L%"?#F B wridno+4RtdhAo_fPӪUU]ȿ2G?+"9}rG,pED8We2_E^?@Ur"FU_SH}L,EyDb< F,{A2qWU}'w,LTSUX0LU'E/2nÝs|%ʙ =@m,WP+YХ7mo*L!T5?RM50stDUDUDskO Ut{QuqtGgmN)wcx;)kHIWa;Vq6{_X]qN=VOKJ_MU 00Qǰ7%}(oe8,v@装]<$; o^]~a-.~%>o>¡]U Ô7\]OUia^l#+ފ\>3ڞȇ@!"ǀΞ~z֭[GMM͸ӗB'j+B|!uߏ林+N>D䷀[UuxNORWOT9/UmE?S( DjNyy9H$a_d wq~__ڞܶj6#;OBGh1KEy9}qn:DU}mƎk!B4)pΡ=Y X ػZcEE}}} B!7oR'ob.}6ޱ6~޾Ȅ \;!?Txi@]E@߂ '>u2bo߂~эׇ70XD"j\{"@gF} bݰ-&{DΏ( Y dDs555-oɅY)QA+ou,E9ߏ~͙3 'zT|~߃jAK,K2,џ1 FQw> Ǯ:A C<{}>"9ظ49'@O߼'ۏȕڞroᚈF)奷 V"XX-R'`9jʨ/j<[Zٳ@OmFccc.lJH!|v#x~kڈVN؊FۓWq=+a_h ?"HEŮS/"F ?"Z 6ʴ, ?5\'GRWy"'!k-ѻ}GA} &܃h)G-䡙_d`DU\QQwB^=7 ?K^Ddl־s,+vy@t.PTG9hXo$r K|7؛=L?es"M7T0~'Lgo]ηi36BvѮ[-!6Xn,f#v.DX5bDxוltVD00 ?䜫5kkf13 ʂ~}[}Iiw;4Kc㧓cԯJCr$ o#[sw 7.}WӚ*e҆ÝK#yCcy *c{AFzhne/7&9z`V $>ޓ["#=p(ŝODaXg kӂcp?`B{8{2AMBĈ>=E'C/[jt|сĶm)@D䂪 ~pn:^01Vsᥗ^9t( x&+ɤ8xqrȁ_G~jkK%VU5~00nZg-ܒeO!Nzb^5߸`,>1 ε3f`Yhz*p2>r:ߍ;Hۀt.ꪫ vşb}|Ci'c;5PV-YX4;5%&#c ".\Hmmqh]Ly^>|ݸ7D! EtBYeQKX9g\, ҹ+ZTt@DH}+ :Kx5 \[`U^` 9iC{u%qY1^@$')yАm[2J1fzf:0 F " b4ϦifyS#Ie\lY6 >*筫f%f#IRWWnj3mKƙ pK^F`6sEŹl* nl[#\OK1 @'T|RA@KJY~Ru1%v… l"Ow B'Gyv֖1ETrل?iow#p):ē̞=9c.Nx^9o?8|çG5T÷/Kh9777'{yZv:aTi*d{Yŵ|W2f7JoDZU/fۮb}rւBssS6РByv|/ܞә32ԔY ؞l91\Dǂڶ*';K˓/n2"ԩPP22 >eO@eU4TO7h`^~#,STMZ0w\JJެ"'D#XѦs THQB%!?.j &=O;ܲr\Ӂ&@$BtO.C=LaOvl_ а{4?o|X`sF|&@HG%"9s7w.'*c#2k{E`$AX.ho4&#) G*r6/F@:{t)ʁł}SQ{woEdž L@03y@(!@2D}b3@^T@´x#.!swD@zz~/?.DbqIUȷF| Ƹ^"aX,?6KUz%ydJ޳$8#6 $WŋB+Ct5kPw"- 2@Dx{05^ c?v)/I=Ddƴ`sd^魨oOA~PFOЇؒW&L{>< "./Ї9[YX% A8 qxӺ@c. ]<bM=8ޯЈ $ :ՙH[x{䐎v#DUØ8@P\$ ȷ&#dž8z~`|aP y=@tH0 /5oN;^,t!0{{bs 8 @>^$ ./N(kG7uCﴡ+((0 X"0 J4%"ɂFm@I'84u!M)Q'*  $ÀH?)CM09^J f+:X !V+),`L I<~c@DcHp$B@^B 0:y.pW/W}cq~1$_o6 `az֘K'2c ?~QU; &$@ 7%Y*|޿#z5@` bA)vÍcl4CMp ش```˲ Bz~%0Ć.2d6j˺1E@}-q>_U@5s[w $nG,5?H؛' #Jp"B⥮c,G81D!~^HdZL,($2=qK?$^B`)7X( E "r@D^(T~JgT** P^'u ct-,\8yX#9\>Hp/1y8w|3$ܹs913.88uȳX===2p:rO(Jӧ##xI0 G_:C~?MxH,-)q]a 8}挫|{ S1t0EUDy{;wx2L9D^͓'N~h*0X]fYgΜɓN{AiIIg'N,` "P Rii뺎&OggkGIIICy4`1'.A(,w <H@"hc``&' o8y4Y' wk|܊ |K_̢=vO>︲$$X!30881"Y}G3@*D(Eck(j%3FRpu<7 :1.^hr!ױd˓E ܿ 0Ą8 q4;LMuS\Ncwo$xK#irȰwAN9yOᏙUUɂm9rd8VFEۈ&zX5֊raD'3#irV6ew"tuuq ױd:|Lɤ tC2 c޽%%%'3#`KK|tGfnm&p#G͜938@vDYS媆mvWP(,/,`zqb`?t0"{ϙ55[E,m;vɓ5+Y:'S# P?k뺣ZcHUm\F20ML}A>o/TUUWn+PKK& zUϘw) "Eo$".?_fx$+۷HEc: "_Cd%mhhp][TGGܼmmlDky2uJ``ٷ/,Iuu n0g߾p̝${ND6-z71C1xiV]'r}})!"B987ᅗ^ʵmE'ٽgجZ]~37L#ൽ{ϊ罽TYYY\nͬ!zױP m޳y2wJa Cڳ߀JV?tum=8-QU߼n?w.>gmF2|PDڝi\P`pp_&eK\YHG|0ONIdwwH;35xydiapt߲R̞GD;w6f#^{K-G-28{?X `.o_F?[C1DoDIo/hpҖ-fKxG]C aBD"7y4yb صq|,?ߵl_jl,200?i\qΜ=L @رkISDY(b͍D"?|3.R7kuf%EvL+ @پs w DDu]D#LY J͙(7"p;_ȃ#YfΝ qBYf1/<b"?0~cN{NQY /Bo۹<_"[Wy0wZH}!cP<-vqu/LGGo[َyy⩧lFe%K/K7{`c<u{Hso{?Y!~C<{fz g<=mbv1k|?㽽9g@u7 6|# sIqa{\S?t0 +!7ΙÜK.Iqɖm.a#WYAxb0IHݬY7bٲ /],^DA۶ݛ0n k׾ VU ŸKo&oyy|fl,+-eْ%q|W~>0a֭[[=wy'\: Yf mD99>^ںg>' 4͛?q pK[Mu*[Dh?q3gN .]W\A Ȋ?~{-۶%E'[ #5׿0{ǎ=ƦUU\u4XĄ sQ8k{hjlwIL'ly`]i}/lb!F MW_> 0{^UpSOsqC6 B\@C}= o?f9obtՕ*]ϩӧ9s,+KYSr@/We3/` n0DD,.Eo_ߤB!1{M s/T#EƵ\x'0ck#]tuw38800p`` @0ޑS< ع ܋/Mup0P\w5۱=&;"=]ܕO3{'K b4g> ^,c`qƍMz`́ [碏}ĩMB@0 u^v>8yϏ`(j S`01n[tIENDB`3Depict-0.0.22/data/textures/enlarge.png0000644000175000017500000002341112233244370017372 0ustar pcuserpcuserPNG  IHDRg]x2sRGBbKGD pHYs "tIME7ܼ IDATxieWuk3ݯ b@92v*NR.R3T%]* @ =J=o~w:g|{Z-#'){o{޽_k-fv;DD-@N ԮwԮ1mrÕW[ߍ//m(é"fKg⿿@dztI_"Sތ`>N;f?`(A< dx,xyC "Hax fUPIW6^32qЬͣx`f 3T$<7 |aü!J6E~@Xa%A%>2^L,H1"!x󀈪bADD03$gfhV3pԜyrXGMHojbjQuBxQLN:&*8ATDDUp CoVX{z{Ҭ4XQ6(m7,z6$Hz|Wt|EjPGH-2ױDa&f&&2?#ZaV&ˎ\z_Ͷėte Q}tIN1tS󅂨7S˳  T`*O\'OSf4u* wډ($**#D:5uf! o'댚$pdCD0<7^i&_ vMԅ"KNC Ns) 9$BF?~_ް‘ʠXp ՕTx;$sN2JCU$<Vz5VCVĂ2rkűbPCTvg8쪈Y4jZ1geN88 D#lH{xAs0ن+mc;l;s{: vTaT >|jXW<#/cb%xC{"9'X%fJ 뫤s|ಱ:(mZ;Rbm7k\6t[$h*fn'ə3/\,y @PQp)%F#?A 4HxƠOćY+o'<?7w۷/j166bq~hªFn&wD7~|QI$4~T/#JcLsȺhZd{&k߉ׄeLG-qV1WʡRgVNx?ȡg`L'~EJYʈ&Q (ȅ<F-2r+e" FZv5sqN̶eJB9VC.qYb2!쎌LU;[Ţ?Pڅx!$ELFg&E*"]+sk17\\?~톪׽͏>gÇIG]̯ذ+ B#dvlˡ:C\+)$"`w;q#&"SUA@(18G11dFDCL2-*+Ef'7Jp!;},+њG]gY,0X]qF޶-|$R2դFL,U 8srU'1ؼ?!Gg#UR1ab"CqR(pX 'DAM|ݎ廖`M致xd9DeYX8m!f42'"Q&z;;rs5&#kHt"tl{G^s"C7̰TϜ/8>7 jW{a%e|L5sU_OHמn1 E GvD_0H609z@{ϵv4wݼ%ݑIC8G^զNX,Jڂ .kΩt\.p)ӝ$3ubƹT#yA}Z.-HazF @L2iCh:)n}vfͷɵJ |pr~_NJ CPS7&HRHlwĥ9Z#&1LgέOm_pTiP H n MBFUm 7t3ų+ ۚ~y];3vEvMg{ZPzOHڄM=r$IƌňaDZo> _V5y2 F7܂4t&txM3\{Yc* ά`gC7tXU=mkZ  J|R2!yҦ7l.)'*U<;S8-$QJ=/I>Ivx,߼#Ԁ:*4OFʉ=miA Kys`{*I2HF AJ#$eXe+BIpT7?mLhb!,E*L*5W6{og:`}'H Pe8e%z'Ӌe`z/@&iڐiIڰ4qU&#Tիs&إ% /o +Y?;m7|ÎEn_HdݣAYb\`!<90(Cq6 o p4Fbu录 c*X&%Gu;*5r*=mknel}UjLi# "^0fTŠ|{ xz9_F>eM$i@IbiiHΨܱ!l6Vk&^1R󧆻޾waGa :4O̍(VROn ŁDţ2[&yțMHDm޼`$@)٘SU55 ݕyOǻ{fK~Zc+Q$sh 2|y5/7WiC+ZP}ӘeM4mb.ιIz"ٶq$ZZm^T/ 3q燍i}rvLaE3+.Ye00X,́'VwIF@KMC%M^a/󧺻)#&.P` x| npg[sҵAOށY\"u*M6YG:&=!`qPVqk4M?tLwn#wiW6H`xvKxe(Y*ɵ-cswRӬimdM DDX[g jVžGmcӹ7~#Wn܋<Ioٙnak!^fIMӬe$Ip⊄աIMbvhY1Xqiũym|g>rU^ N"w]`7K<\謡Dp.pRȁkLdb G 2/E5 ]2_?W_t`8 }`  C8?X:$I4Z5ͫ3Q œgWD1ZSKԩs}futĤi>3ǖ]m"9k +NȚB[B+./qխ>[̭ C߃؎ .]Vŋ7skK( bm`sO70j旮 /\)3CDa K2$mA6fHTO-o.r'mw*ӝTҖ- -J[,0Sl݆ I J.RvHHi􆇴a5LVUU KQ 8ԳcKr!K[2Z6d!(/uzëyq}pǞ-ppzsPaa搷e HrAS%zD.BX0yCOEԉ lpMW?R LepY 8҇lΡ>EFwŠKtu&6Z q)Omx >ljgQ-9dַg7uK}~K{р1x 1 (6=>(%} I&8'Ƶ6#-Ϊ~q#gED NO6m8#s{b9]G^т!/b2m0`@x63KJ#o IS$IA+5; aUՃXDzltWYU7^IA;GmV@<=?0Pǥ5"0 4!(1jm̂¨~[6Sgcv璳qto~e3 @ GW/pc'8 XB{ [3F, gS%!ϤQQ3qhf+ReP_$g/$7NIlغ2`` w޺egps`4G⡿7HނIjh&kMQe$)5*#+2ʍnp$[7F ?{ O<̳qzxJJ<1%>g-!Q֔j]LF`j&m#.fAusCr̤;c`DJ/ Y7̄/6 KǾjTH&yX[KY}mNT]Rʯׇf4?Lkd" 0"*,xxtf3l>-a`}mCkAB@՘d/M$5Ga,h\m( 1QMGz}eI'T"0\%9pn2.% sp=4=1uV86i{F]$.ʊ\ʶ:8{vO'?׶7Sr\ݤ1/Nzv,,آvY3柼HHKsrQZOʺr$I#=Q1_q)WS#Wo&7P8VuY8Cc6H_ ū@%i"JfNڡ6 dMщTMKҰV] h5PgM8C"fs*(8[Ǜ4J% ̧ );3u4zܷΣZ RΤϿَkv 7Oq3CU(+!ۚ}l*P5]X9/[#!o4:Xڲ@p(X7H*{:&D#ZE1t1.ߚhWb|2ܙ|S+UEԗ+Jo+oHBoov}YK|ߍ ŀ|GroSQ5xtXƮ&3uWoReCLݱuyS?vU/ç$v9?ع ])ڻ?3N6ؗ?dže9w~2<ًk(psۦ`q=gdq I_*?AJvh1U3AHD5ͤ]{agmx'4+/,}>cw]HA(ʡ{5q}mYs׶u(_ڟ'Q%/ߕL.S/r=0osa|oRsMA`GA4"fFm,m`n:t4^($ټI̘ F -XvapASerELS+\K[艆\3]74'=LJ|6yU}Ksp`ݾ0Հ[:pcbi\ p4QUM \`lO18a@!4oS"f 7.::)*$$sB:2UD\uDLh ϧ3~N- |=3npUm^<x`臇?$)8X9lP%O`iЁRODI m|qiAdċu%\ANY$fU}zcuX<YV>-W ivk9h K"p4_ L-53 ID_!2eӢN5!Q?*0}![$%%U].Tj[ȳxuMn"M-{}>ir>{Jxtuu`L#?̆ *DĀ{cH: S5K?xo6: fBxƸ83tWp&zMk$- ٮ}c;XHR~ѶD, || ׽< im@we\>oCL;$ i!uFob1dBMj)+`}VijP3jmj6MKⶔIl $b>[\q(3:jO2=3d}`+9 0NTaũ'Gg◫D;1 gcS>{k::Js/ o>xίi,!Aڍ?|K_8c_Hhʖuoy9?in,M/ph~=;9᳧[3g{܍g)`v3@o}.lCo b7(s _YT.զvxno9+4YX71i3|e6 2xρS殳ϭF6(zo_Xb`9^WjL^+}ּoɗ(L<"A8^cYP3j _d{\{]?1=;2ry/|۽wODgJMr5>ӿc7>yկ}xxzOhC*ېlQk-͉RQØ=P>xCO{֩2GcŠ7pZsɚT G٫߹rҹWCaX6gƨl6 R1E6,Q)_=C'98%LujC~f")Pf|hښ]ff2؃:үuect>eMIz9̤HoŤ+;Y=!)'U$@80UԌע["_DoDDݬ%^ݳiZ+[X"Pz}/|}'}ƣk*l#iLQ .@5'|$1F`KQzrU;-@ |S 9nYMː4< sp 8kQIT} P*05nqK{YgsI[<ܱI20 d#GN\(PqKBoUyjň"JKTq*BlpCOmI#D&i3v2oYj]-~~$@ѱ8lkAhl_7٨3hG4Z `^H>Bٺ7%fCH'@9H.nA5S_wPF_ ys^`f}J@,I"E ؂!Vřk_B;IŨ5{a#,xnI>`j 5_>y3s\i"[ 22R|b^Ğzazy$X=Ow^qj%`/F;w_e?d2uw_Ȱנbޅuwk'I沾Uߘ^g='ug䳋7^?AAɰ.IENDB`3Depict-0.0.22/data/textures/keyboard-ctrl.png0000644000175000017500000001321012233244370020513 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<IDATx]{|T՝y$d&dB`G-UY|Q^nWѶm1XqhU\P?@x($=3{;s91#q{7̜{<}޹ƅe;`bha0 `p08L& I$a0 `p08L& I$a0 `p08L& IÖlZQa"-h 'S$ˠZ`0#FM~_ `U5 )6!׎̤hb0ꪚk?a&QE\ PW_̧p PRR‚B8NXf9==h܎ ΣE)f^y]׎p+Ǝ جfUD8F&4:P(0VxDOu]W7jѣnF䆤KMhZyދmWɓ's2` DAHGM$ BB6aEoy_Y^o:_Kd`tGD`?0V+Jv`X`W)wD" Kx9Ak%*+Ǹ(p8L$#1b\tl(X <^)"zz{| Vc\b߰Dr(pJ/-G{G;NmF @_x<&T.NmE!˭èr3YY\|mfnntt\F{{;JKPP8w,:PY<ºZ_uU%6SKSVv90vtH!=c\ \4rr(Eө8w 7٘ӝ2#% AFNB^┟ Rգ+ȥےB/t?d֭} v~p&LVM5. Ç`ܸ 1GK 1"0$Yݻ|ތU?%H 0-?\ o,!@CxqB< g꿽?y_{d6mEwr~!ɘ t#}/ .X薷lpߊx^x/6owB6aM7~&QP:xBpϥ fF~$" `;Rx7Te^/Y+1t$ +jEkkOcXUttt2@?z!]p;3~LjD"N "኉1?@YwHKP3"Cz>`ݚu*#a;QToEEE6V,ŋ//;Z^|Q|*O/i4 @>'/1q@= $Js0x$4@||y>绰f+&guɪ8x't6zvW E4XfjY&G(! @XPc\} `[tWҵ@l9 $(HZa X9,YXVf+V`ocG.^Ĵ |'Ep8B0sַk?"Z[Zrz bo-vbJ pE#QŢ .x M>o꺺zEө|kya\w`Ҥ-mcOA<S3D?tkoӧa`ǎ4`>x^īń Wku`4#cP~0vO8ƄϙHLSĒ8*HV,B0*2 DZ.Fƭ@]oYow2N'&N!P8G^񼂕rMV^Պ|n2$jY|6;- Gn. ʮHs<+{ҏ@sѭ}q)ҏNTUV,˿Q#(''ooZ\S`Vo<̹yrsqqz,N+()iYLRddm:s]QtNhm>KuFF[p=6'qW {xerm w3]cȧL v1-ʋE2l,V+MOSڣ}*iæ2 X~ftP\6R~xV٠yqx-W#77Wu1dlB;#HK?+IW +=9AFaa!Ӿηbm0%H01cF>O.*'OE|p@׷`32Dmn7HGkڈP!1HnTTpeQ!Y+L'92Y6?*-"Z@ўr<ӈZ$G?U}9k"0ڃ-7H$[3ƌ݋ŋ/N1b(,5Ipw:#cL-'N}؇Slt9|-3mc=Boo/~?Z8q׷ 0Ӓki9n+-I0҈V[Y{3Ɔڪv 0'O֬^rpntBNihsS~U l:> ad؃w-Z_,www磻Yl{v?O+DPUqُ2ysAd Cii)qEֿmߡO""w0Y]fg#+層g 1PZxɟ* Գ$J泀's0z?򱇹'Y߿oo(Ϸ@ e_>X#JG0Jr嶃 z{z;4ocg֞D82pJ -+0rg?DC 0q~iF#tU$PيVՅp:˂cY`hnnƋ/+1{l̞3 e(++EWwCF|C:ÇcRÒ;wn/] -Dhh+I!&F?.4,A+HGT#xGp`U/!0[6o[(FĦw6+GW-\سg9{,y}}[.sI@F@Fx!G7_Ø1ɵG,]?+[#6ĉt.[m}gW. 6+绱M9kî8aKZU$?Hs ӻxAcV+q;s>56chmiEggBL2cǎja+tRZa>&TSZP+zrDsBy@yst݀̽yN BTt5d$@3}Q=p8OrjbI[`MpdQ@UA*A bI3{ zq@B~BXF |(Q_/ς(g?V1>Ʋ赐.m$Ffqt'p&@OO7wV V:M ִ'6\=Q `͈t"9BJvĐDQs1rDnl zz%}RƙLlt;+t~T.0:yeauZM{ENRݶy<أ5wtv 4eA.Z-VK(8xh?gAJH'odA8y |7H :Hl6dgg_ jÑKhl"}юP6;"󦐁"%x$*pE~I]6DQD ^Z=]e;};h>M+Y5==*(㮬,$wCAq.y{ 5PCEB^(Bp[!$^#ػo/&}8r?x z5#ai]7Q6T `nl{Z4_N,Ξ=vyKuUZ8 {ŋQYY8L B}8pN`W\A_5tx KLGLd[!" `fb0Sm6VW$؄ D]} ( GMj{æIձ&:0 `p08L& I$a0 `p08L& I$a0 `p08L& I$J\B68IENDB`3Depict-0.0.22/data/textures/keyboard-shift.png0000644000175000017500000001166012233244370020673 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<-IDATxyp%}?ڃ]ծ`U$,ĩ!JJȢ@h  c|T9a5WaV}>i&̛!|UMOO߿= ۶]$V1V1"GL#&@ q8bD1"GL#&@ q8bD1"GL#&@ q8RfLK)#FY ,YACÃ$pp>p.P[L1ʎY^G}  n.)1V/W Kw 04}͛ضr#Fc.6oꢳc 'OR)::; {m3=3L&ٲ5kKD.xϱYҴYLCà ޱb۶93z6ogK/UUXm466N rò,ellDKK}errLftrCÃ}'Hi85=ɫfK6zl'T55tw277 #o{ォxWl Gd5˲hmi¨SO*/%iuwVj}G&_/LB G u7/FGGim]"V6JH :1/JPg`WM!֟g2zIt%K  9lP C%CKKK'.chNznm2A6-%rrH$ذnM 444hQA S@}}"'Nh o|!< RJ^~Kᛏ=9nݫS(;ھ'[&CQK{y|h]bHzy%E8! u~e .E@@1ܗ}5=^N =c||k]-iH ]VIj$N!ŕbՖo$ 1P RۂjN 4$XqWᒯ{*ɺU˞/|}/u_K:f׭7L%,[nڅmujOJXa*_He?h| zY}FWgsv/ml+> ')H0Z9,ꊷ$XA8cx{D/Np.0Я꯮ w3cvM"C۹($ȰRX1xs|ĩW_6A#Gw=8 ;/+p=cc 5F12 *Nk_JKRWvyOﱽwxs? !]!mn%2>@J_d-@E!Wn*X)@[!Wu d/PUUu_x>;~2:̣k`BH\CŠ. +JURh+&WHDx12 6l\xW455p{9y>:IW3~3nU#@P!~_nǏ/}Fk:u}099wziò෻~: MTSsàjҠ(uqnN5N[[ ۲ϰgϏU#B@ Ie+Џ!@`o:$Sd|2!${2y]jdrR)n6/7,--f;!A m6CpN2OEP) os?P߶mn ^9jkk<o]}v^xګЃg~aQrA0'2,(;d^ tǞСtw?u9`zX_MH]s{cǎ[P #>PCBEV`?d`d*n/{ny̏ظa}*kRnczzv~+ض;qy8"N6[ -yL %½NQNy|wls>s>7ܳCp/c-۶F lo.٣~j Kly jYTP^Gƍ7gگ_m~m*fV.tP6zCü --|;ߒ{^{ȍGZZ[lJ{ NTUŻ* /Zpn~+,֯_U{_(Շy9gfG]$2ԁNCY5 h~뱺MV!4v,Qf24[?1LxZgQ57xNgͫ9x*{BMo )MFn2B:8EE빼_R(«CC6&OSl}mjZ Z)ibRRP6?yY tNBX%Bb J 14V$X0WUʧXFUCr@.W3I4۫uK^5-s@$ 1*{7P|5 ,!A3ݍS_0)b@ECۊZ_,+|:0.zJA?j(J-_ɿ[092WţhO&-2, !r te)zm/s Jąw#gjpFPKMf-x~+Had1E\/T*{fsyqzz ˲Wuejfy07n>#CH+sa\knnvٳCX:'BvS&&BR Htm"JN[p9ov?pM^g Zx{vsdeZH;%H-'2X֎D"I}m=신y_8Ex5:L$Xƨ,lX%bKIKKK9F!+y<Ḿ;EI J/ߥd2ImmBe-195 ҩ4Uj:;pB$9s ?yRQ:;I7f_]ŭ4 XtXfS*hxޟto-sȧ5(;"@UU5 J\,+˲?ʑNmʯQ9_,U5J\]mUx PSSC]kTuFRq>$D"AKs[ T,+9 !28G]9'Ӌt*mW, ecmɤ=>uϜVԷTLOZ]UUUXKK,,88}|x/%SWuu03;e[LZŶm,kɹ1&SضM&1 a"^ Y.YK,!Ɗ`qiѹn8C@f@4:Feq=}iJ|j }8q;b2 8p#GޔqliD ^ <,ǥRi:;;iooD"{1Ve119ə39ypU#as`hxn1g7L |#W܌e1*q<$_‚04<(OGcfxo LCÃ)`3z\ 8v1 q8bD1"GL#&@ q8bD1"GL#&@ q8bD1"GL#&@Xr9 x IENDB`3Depict-0.0.22/data/textures/rotateArrow.png0000644000175000017500000007653712233244370020307 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs#o#o5tEXtSoftwarewww.inkscape.org< IDATxwG6Jڕdɒ`9lc 8q@:#s6,9ɶlQYrؼ;鞴33~^T o}K tLFp.0,0)"qmM7u,`SXԇM ȝ-p[/T(,hu qS +, ^j @nܴxxE[>:YP7< r"-` ^ k#M.P, q[JM *[o! w,(RB)D qǀ@BhRM|=ntG PH>]ͬ酛[-;OAM}"O9Bt WE^w.6 <#ťN5nܴxh-{ b:fFMi`c'o|b5:`/V|u܏G2,jY a%y*yeli?%}7nZ <,.XԸW3@*c25#K_t=9^:GJGCwְB/ Ȅ|!D( [W7LIVkY$ eS4H* X]wg,`Vb^2M!⒋x]' )7LtOǚGU~KXCO65Uu׻LPLwH&cj)SW1)~0^4+wHY_@Mq42|Nҙ% |Jt\(:_HI,_gH gTBlLkdT'>f4Zѽ`7{nI\'%AetY87ILG?ʮ:ۇv8k9kVo]I\ OAO[Lh>n1}3Tp&‘]@31@nWP$v[T3ߟh߯R͝LK`iU}VY&K}~8`G>f4δY?A`-7 q,ȳ 57p5] UvaM4fJ-+%Ib" 7λrW̒=>18uwm{$Arũx ܸ؆У[o}b^tq;(rIN4 d6[-H~%`${jx&id]uY0kq |X~~b.]E{ϊ6R*^j>mRSI[ gdsqL0ncZ9Üd+oqxEF ̽|}i C- RB~ OM$b&O ߱g^y_gn(H}\IDP_LUHkc/OMKkʯOdn^F;? sC开k]R@ygykzi*%i?Ӥ~w}p<:N*k|pkNK s6WeBt\N'!2rgOW:;iZ> t i 5ɨ&i@3L!$Y>Ψ|&/+e4CTis dO3 x}!;bYdȒ޺,_i ԯ=ƭ"̼71S*m\c, i;,~MADgT#UX^?,J߬o0M~:杉[~M9BWoWீV SSk>ƭ܅h82@#Ka:ܙe_+yklX`]P,e.U8(ID>#.ft#{~ί&)ȼœ`7_r\LZbzU)TbfTlS ]<`xJwPvNZyAذyD̠1o#21 8 [vº ze:Sh ->9#[O%^e13FR, Oy8#)Nɿ,Z,<ȭ r[5Zg3lbj5VR12:fZHd-"_(JmqN sbC y0%㎸5\Wơ_]h3o0|:ri)+^|߆A7,;T?w0apZԭpTڂybWڂ qr*iOdR͈rP}^Ë79YLӓ|Lsڌ_]=# tN,hq#tmwSi <C*)є%IQlqU{@X[O)͚a:0?9<#tnXҳKJ'N4nox,6ulqWWۈDg:WU'ye]g [/yeIHZ5xrovOp?[cerBPEY҂׋qahC Sh&0҅!:( vm ŨQC2)Ѧdg,]>UA0/mQڃe94\y2%t6COQMwv"><-x{[PzU$ \T*e^ui +˝׹}(uW#8s[pN/|r$j5WAn6+tXJ?0&>iA(y|+;Ks{m^%+,k%a3IRV2ezjB8u(k'X뮈-uNP|bpBOvc|cuBn9؁ ' #oPe$É3 >9skD+a|t=0t-bY>{ YHCS hd`!ED-uAn+dЄ׷K| ~yLe?Ebek#a| J{)eXk&㩼H_naᔋWƻnKS)$7#: "n&fT '`O O@z kI2цc h ɼ/9/(:?1Rpʯg.8n8Oh 0R 1*f {([;ip~*0Sn8Ru0}@^^ܝ[#7tPz^mi/vfY߫HpUE]\ՀqՒFW!̬7,-1xdTH~.o#omV!&pϳ ^Py(]%D2'c}~^13 p\@s蒵E8'R>_u8e :6ﲶ9/,VoːQ7Q؏d*:rAٱX +=jz{N┫$ŒQ_WFY3IV| 9XR;84 !ZG|^W_ۉJAO=(N Vmųx"i1LD(<;&p-Z:L,#]J̤巌+ð2K63dxQ=7 >fG9(A˖Y~r1 &22s ~UhXCk]{3g B|p`xI-NT7cӥOm6#ώXD?R6 ik{t:V$Xs ae:ѥfm;W`_ExGQ:Bd Xj .  #q;*llAn9?+sE9_o>yƔh/>Kfk0am"E=pqn4cUjXjmcFL[֝ o0wi7_A)Uj'(Z< jC_v}L5PL A-Zu[P* Oϩ,Y,g3*l鷶.?\Sﻧi}CA1rk!~,8vU& ]a !Y,0Yt! KXYpIJAoӤE ADnqi?8`Ǧn{:1_UK+20փQ V^jQEwn7rk̾!0M6JHPëZcg" /[5R(ZC}52OPex@MC}l\nxelh݈( kv'xtNtr__B[;*K9a~0'o߱6} )A鉜:ν*ww_6+SܣC|CXk{K1M8\އLwb@WD7T]O'x@nv#_X>?x9gG /rk:F ]##$?OY,SgoTH`3>w !Eye=/Xb `0sCdRagwۺ#s 1/xW#6~ߠ^eV_b${hᑑ;(aE`W'^A>yܱ;U!&Iê.Ob^0Yi J lۜK]U|W6 eKEôeL`#n2 _ F/!`y)ŷ $K1qZIw]`*hm.X쒉iW120킮\R*lĕ`$$$\p IT"Bqoń_* Aw뼄i0AI~Gцx, ~vm+enAn 䆋c);I`N "7?$ ; ŗ9@x¤Y- D$_0q3Lһw7ꩉ|=kfow }*.d$riEB`I?sG0_ p91LK=& 9 :<C*Y6u K@d.[cqmVPz $fMsuĖ}wYCw,ETPz#~QZ!++#!Ö&SϜ O??z UQՎ%<}$4NX&/vźhaVB_u 28kc)qE刍RWTM+ʧu3=Upc)ێMS駭Xpa;jiX# | ~D3K@ !b]nNia5zȩ!(||`32h6 Hi.*KԯBکI}J~!ϢzB`f42H4G2]RV/sGa.+ )&43>1Y0^\⧻ShDT0Ͷ {*t$G[ IӓIn *h #r;OS5"1 7P šw`C 6?] l/Zu}%`kFs}f )#1BqQ`*iEw+e&XwN1i~RϜW '#~"fB9ۧN aG4Zju6 :w38-Ն?0$%jUȐ>q;xRqR=Ichґ-˃%W(I+Rx e(_bG)VK;ƻuJsZDj?XK-DGn >ҐٙY"lovJwJ6u*^.l,3 0&d,d̮ܗ~{+mGUz=v8{OwewMFǡ8cېۂ(JrZ@]>S0+vir? FWmǾSm 0HGv̚L)`Xq5 t N IDAT)2CYpXϢ(C#c`$N%rF)#&9%3=*ԓo$Vlҽ<)hRuQfV#w o[2ضFa -]`>#yq@GBO-Ipڂ矐ĔAU-֪=6K, rL52@ڱe)0Tb)\_a3~;]ՑoPYrrY ŗQw] ²ۂgQ,MnYQe4GYv.`QGX)C4kTV+mA}"]wO"$4m`@q4'ey}xH|go{Vx=37ڷ 0Lcc k` 0[Q[48\V}#B; E=f3{ xtXdz,bO1`<(zmL3p2Pl\ol+nX/QϻIxB]ӗT` `4{P:Bx" =5<$Y#5d@Sp= e֯(X:?Q@)m޾Vһ M rtG;bPLஉrs:]#ͣك")˽+{Yr%-uz,r$qI!o>@`fcz8 @wX熑73?_|R@A qA ;s]T;pĒ ,`KZ(WSs_*/f6314%zW\|ч^t{r>^_kzd}$giR@]Vff|}p@叆;?K G}MyZ( =~KmjU;`W !{pK,{p˿ +{]%"˔؍HdGYd0j|FK6q4# v/ 꾐>V3X{DI?wrG-x]=XTt_Άd y ǿ<]q}{z7 g )NhqaVߑ>vt d~/8;j)mV4@=Ʌ*:#Y!{ȭ+ Oc JJ`taL7A*.N-D39+BGkugɅok^_NNRď昰zyNC.G^p]0ld[-VeCÐ5,u/sndO|afq{36ݱiXۏ!E9aj׃_>-mߺΈ6K)gH«1KS3$tø+9$۱+U@GT[ޒ@{&LB@ך`Nk[v(Ǭ2I6oOa+3m׳KOn@uZP109SBCHck/mhϧL-aiE!D kz,6 oSq:1-.;U{aw |V,Xį=O3>޷ (.i!shy*#fJr P [3{xkz䎛|O{w@K^>LͰF]\܌ԲcLݶrFa@ǮFpud0`e!2 ,PˠKPk ]: ͻ,\,GPoWev<<d Bgm8m q0>Е \w%oBv2t>2+N8vMCc՜wwY|" ,e.ZIZnHRiXIw͗ba1Y U vA}Hl C_C_"趿23O5X]Y\|, ouʐ,SW/0t#Y,ZW7Eޥ- Q:\`鯬i][3:} P^c?}oTn})B~FrY ~s ̰ ^-wpB9Luk:pi U'~8vր=s X֮!K vWc-X s!PY+G?W7xzZ$L2,'L`F5a9?F/߷iI'AV/R݄iH8`Ha=4iby>Q/Dn_gzIHo8gOR` aldN4R[+p hCdG_G|һk+[3gf=kƌ1Wm ":jªl*Y/p, Pq<)%guճ⋀{)os(= ml3kHQW=>r7p E^镾snA.N—F*yj-ggis3ni{{~<`$kbH8e$CuiFB1gؚjA9mYLs'𹧀/7:ɭ}7IHbW` j>MA4rVau֟uJ4磝3ˑXq/Y 'R#!% m#^Zh7Ru`lk-5Ut{谒YH+~?GnLw=f&]Gܑhz\&~!ǽ^?!QB?WaVj{dJ9a~LVy޾=#{޳4n@9<;n/>6qgSq;[:LiS=s@nT,ag̈́=q~Wn&/BjH!N-C<, 9 p}brךu3x+`2{ K?kÕyUa(|0 fW@-Ji!= '@/.7{qJG|7 %9E9W]·t?< +|l"_n[4derM؟W sd- }Ŕ ר2{d& o4B\t8ڥm ſb<{ iӰy3p)es)h3ws }IFg9 yY{8) <c*N0P$IjiBkZ,d IlnWIJUT$ eùP鼙ǵl.%5;&p]`.d)L `5Óf0hh}[G{QP2m–տNd,xk3+` 0RIE(YmW=R'l)0y8fL^)ʫ* rIvxkzly GQ?V8M[ƾ;`g|"L F@T' L-?!Ub#9W|r/b8oO:?w L^$$ʵd0d0_;޻o}h\M/r؃h/,!VyiSp,MCeTG5=n8ŭ H'Cͭ`H ݀F֙&  ,BVATawQ5mG>4ɜJw]2'fL j>,qJKu*ʛLSS01 r֟EW1fk;Ka3w'm X06]ބ_*Y.d Qz2k]Ֆs)>+CE;+TES@l ˯XÛs"C)5!h&p elیѱZvyڠz4S7糑% Z{’[ ">rLާh-_Q40)@,}i^*#ry;w=;/c3M|I, ` |_4L?'U_  uW >=HS"|'o?{f0}md]|اIM Ӟ8iț??R'U0#aڠO a}U@nU!v~x^੘jӁ19ƘЫk6FOdL}С?v1qŽ^{,iht}hGt E2Xsrmx׆j~˰>vEDԟt{ {N]h6F2/(-i+V@r0 )<`$t2FCHSwoK=۫Z$TAׇw SW1Hօ<<+*xQ Jkc^2' & 4_gh`ksz qQ8͗a(6H=7>Y -W3/<;=#ŏ2x9z:~ Y6_ &Ő$0+P Ll-o@$ gozj WZ+XPK}Wq{l` O`LO7u-22vJn3|QppʷWu.da> 1,QLQ' 8I%Z$X!Yki};W~FIndF}7+kzre *2{G+ǭ9&.~.1OKSYO߹-73Oz,šXf(DWʡ#0%,NvZ^E%$˰TdmΩ D<}7\Nq$hB@Em^9_% ' .YU[rߥɒ,U4LTjOԓO-oV?Lx3DG'$ĻWSeexWΫ[Ы?@R`o\]`=Wf 4*OBơ+-?_Tj~lodT3/mJ=C wazY-AK;@Gl%7yeEV3I! XmuҤf#VtU(oCK`˰ Xϒe3\_iooΪMIgl*$N`yevLC&j|"ڻe{잿{P;l.&zhFX ޒ7G\ |RB+{"_%|."s3ɜIZ-~"%mJPffFZEa,aZv{ Ohea"P ԡ/A_!k?qzϱ S>?[~m5Đ46rTˁOʒtW {Uap_ iƀ6^%ژ5DUs0 B 0Ռ. -SZ_?Ó2 0A="31>5R)-uzlɉ;#s~9P0yS( R],0gE!6e/:ᢀe V ڨ>k4BRٱeyC@[ ^{3❔>_o\ &)2; 4 ?{p/vhL{dw$0Rjm=}vJNbwny؝D$v{Yu}@AEQ>x[daثUeӆ|:OaZK#,Lg41eu) Lq!V~KOfCKҜN7] 2;5M51Gx~ڬ6LywMNo|Ro3 'of6~]=DHx}(^OR}=Ų6Qӭ#ݕԠ /OeܝZF@k4d4 ֟e9M_2a gKp(3}Ld 3G$ԁ͏V}xtΡb]ͩ Kj>SQ7uRWAÊ\2Л3f woՄIJ?Nӵט<';uidS޻J<4cV,%z'#xs?de`K"IvHZ /[{n& c8- m,/Ҟ㙂sVގT߱Y eBk%|:MPBʗ YC~uS2OQk&M wnf:VNW#rDT'#9G6?B~ WzZHAU|䝚WjEiokvCơEjN%tNF0RJ#;9+ή(x=)Ӏl"&~Մ%`szj$Uݟ$Z k |0P ĉݟ;U[!ǹYeck)rKaߺɿ4=+{S04Y;u[sa,0?4;˙F!S@` S( )\ H*1yrs {U3;swjdv9N_Lf% ~9=?N Uy=S",?/3?Gm$JKyO؛7Z/)mM O!`8het&ެEUZҏIFȜL?=|?v'#JyK?ʻÁ+\RD^jS|j)\-v%skSV_ذJ< &6(ufi9<`ciztG_0,\|A~lD=AH[O>ŇgG)N· IZUNJq_W%+ O9o˹6B228\b.)KY'=G*ڜҿ)hl@Fack2% K1aAYi'̌Aq1bj{'ө&V=v$o_,+~}aL?xS%JJzEZ$HQw.2X*LX IDATOHvmB/fy4c(AGE:x/fS&+ѲH?:Fql4aN8s'RPT<J!V¾w{{gZD " aP$e>V*߳?iO^PU|J=ώe@4_*ʹ"XT8ڱ4Fk&*lԓğѭ%?UjsEx |ؿmjA E$$[R9X L Of V'SJ] F>m! ϛXdwI=8v$UWM$Méw4sܽmBwΥwN-6ci|Bm /S;!%muS rYoNTJ{0 '{k|{0 Nj/?F~b CiMH_'~~SeT&$>'SOP:vT}b_;oOZfݻ9v~ r?JW4x#vXVe}8)=_0}`OQX߼<ܜ9~CNr3fcou4a'O?{3ݓ+&|';筴w<`v98՜WI͋ʖ?|Vמ'l3b/8{pg M\X|!;!s"bBj8I`HyM2Gx<۵]1zyZVڗ¼s#-^L^B(x{@Mu੆/e\ jP _@׆.^ hLw}k+<' tiΆ T)ώ|.=;S~`n}lPZyL9\G@i "jԒJC)9MU:oaT©,`+, 5GIcu=Ph s#mw/2j =y@[;~3F0 $ pwNƙL/&|<ލ%Nqm:郃uV^Mܢt*H& Nc^všpPsYkQdz%s~R.R63Agh'6Me\xx3n p {4xԓ?NBd98-NorA6d0-XzJ%upNbP@*Ha9$:X: W0{*c( {ק pLJm7TCG(<#D7}j7WeMuϐ0dvA63㏎qY+ Bhӝ’XN/眍O樋sued4/ Q%c&t@oXCw_k?ž2Ȯ~&zB?(Vih:5_v!i&r[E9PWũ? _L( w|k~Js*|6u ,D1vϳ+|ŸvA8%3vDIh3pz@kErZy-}x48FhV@ (%S3MaR+E3ׇI>^Y੢DL|L T"/ԍE+u6RXn ƚb<ɝ$ Ji ? |q lJe:UUP|o^X ?M'ySsNfдB>.Gb}m N`&BveY2 ǵɌz Q0#bc &29. YҿZY:f2i 'Ql{w9J4l;E^֞O;&컫#U@?dVbYIpa $9lTltsQ&Mi̞fS*`gk $ڞY7vE-R'a9?XB#d خVl?Ei {0;+80<>?C3ȞL4+`i>n ώ[ e7},e5'}v)蜮U hf;+6utJ|g&=/as%bhՃ:F.;89Ks-ɒ|IHHI HX>9p%'!.ˆn†$,&0mٖeYu4ќ=wwvuU]=#Fӣ}T귎>wk%$_T_9f U̗NrKWlLESWĿ#(r"LQ;5؏ iKdžd` 8E ay$ïbAENJqX_W'E%@E/ s7}7;'YBQ CFsLi{̱5*ኴxN[b#Bp^ό`HM!VP<&2nQ^ okQ`G/ߏ:ϣVw\/mK'8K~D Ok?1ы!c6#>Mc:8{ .QT>nhfqnIzc.:T!DFb!l-80:rTYG?¿pw_٦F~^.dGDML}z{Z3 L c߶O*;=rXE%e[|5 ~ ?=O/.r IC =NE\Pܰ@mۡZosXu +p6cWyJwOp|@87R_nF%~u xxgI0; W xzՊbv鰩,8gLn5TI㲮#̦JwAW D_;o. <۔)b3I`dF>?G#7^i>.`g!KpðEZޯc3p;ʀ-ˏblWkMaSΫZnhpY3Jk!Cd֯V~Q ~q#gEV7'6L:!2jNCMi$Elsׂ3-o޸kafKFLQeZoԹ"shrsW_5~ռ6.slG#-Es&9.1 b9H ܊/ώgV*s=|h[**#iaА>潆ޛ)_A}'c#sΊK]haȆNW4pO+¯l}G>|% Cy39li^5 wB΀ da DKwLXk'7H_ol@C ߒ։n"-D/#)+%#0|pmۗ.WxQG`,v1NN9a_ڏ_b\c(:z#z[~"k;P}ѕ?JUó?;Eъg *|Xu'V +ۡ3z~2`Bz5w䰝?ǫjKFH@HH j8Ě+(r-߸ZC<S/"{'.rEc+PsvKwKA_L9_(p{s8n`>6UC[e@_hѭDEC~ pcs suЕiUWQy$Tx/ VPO͘f6]/ 4 n@;["&C2X::sܸ¢~5I+>}}0[!F{z͛,?.Lَ_ƳӞaM݇m8潿觪/YAc[n@<9nw]! ]#m1@+O\9؎ă}[:G_Zj}k1h+I/#+X?C>J.%h: Qo<.0ُ98DNyk}߶ہ:L.+~dN4aq\\)f0-۵BFg'-~?0Rkd 5ZΕwPrnF<@T.\^.sT>-!cƱƱ@W kO#.GV_ )jE\`R׿lX h Ҩlp;6h ^/p߉@ D7wmtrF&$ZDx; ~^Q"ĞOo_'"mJgn4: w/= cWd;gdɒ (:%%!\{_yV2%4a%d_ň_;y.E̬7e-Xxm>X^{u{& An'd:GoM}fEZ~+Gp{ɵY.'S5uiWlTNHk&Oxܨ§^]|X-"II_ʭ{!dPvI@L&H15@%`R]$|$2$ZHC1MI_LAw.9r}D܌10}vOE|/yvw/] ;z~%x~"kN%f jEKrҢurzn=s:腛挷 9&uSeŢq{(cey*+/ fPEPw/TA,Z \yzAznRC+Bhhu^ىt>IΛ<~(9\~xO-ko=Jwka$ ߟ0R.}m|0تA$8 HAvګ<$(k)g^44=6 `"U}^BG\k{3ҖK?n"kfׇmk:[g[79I{ƈyѥm?\ߚ3 vLκ_m9}G3LRf>c! ߉Ⱦ M~VL@-@;%h3iLK ,Ỉ B2o`k="5I tIDATBq 4/":쐩зN^, ؑZlw1#"&=J{^V?U4,TJG%4m+沂)y_Ů1^ߙ#_~dsĶYRO_-m[k 8]i8^&n5K7 d-'FeV-DGv龳D|,͙qe_m <^Vot.xB EtL-uGl7w12S҆I9[{ W 9:W£_%ӆ$YȘ2 W^&kbvuIe1sޮQk&1Z %s9!siZ*mAUiq|y{vde*GͱGv!F D߇DuO@=?E]_MW\+'46bze2QJIw-S`*J*FiSL<_94i"(4G$آ @hĻ==|?[cݛ{s O)9!0Әi"Dh ӰC]r^Մ,<3 NV0tK#NN{ z-1!Σ|-[s ,KTUiރ-E?4&e+OkmwU+ '& ߓ\twV{{ZA=%l_#^lwaB 2ICţNV h\1OP4] HHW0If_yG̳_{toC xI`i$!_ժ =_P?*?[;oT4s]A Oo/g(B9\ u&m驌?ti% $`0.k$.~*SERhQ<2ILҵ>;'xӍ\k)Zhp_ x׭ܴq2mGƊ<\Ɋ|MxfAJ0e,UPn=ׯw|]iDt+W\:~2ũsZSߟBDB: @;p?s?{sl֯4MKY:!S} U6{#1:9FD#:p6Dճ[Q)T&(6Ǔ$Ӧ{=IΞ?ϗ[ ?]f`?tto'vC;ᘜ B_^+L* *F=JhM3A3,Z.XŒ4_Cߙgg<'vGΚn_U?7׈ߘN/@+.#{>ywlO(j)1~/bߏcEx% B1B (z,#Z<\PjJayv^Mr1\)΍ +T[ĎKt>뀝)W0S̤ ח'A5ǾqS//NNOμ a ,ENC*kq|ɌDtGnXyo'g#/ƜxƉ|V٪NA 4nϓ*Iq "p@u jzKTRM$j?ϏUKPEL-[w .w:h] ÃCf8;ŹrmXFWi}L>Wh#RYmS1Ϡ{^ꛂY3Eb|:xqo3>\wjM:>O=X@!p :o8P@ ;[q}H{-/hH<e;EĸW֟3>WԘ\F&e|B^}"(rڹ!|s^o200q}OfpMGC]@Ul\aU-5NAK#Ez]\C(&il1e3@W|ه fqxLNjd)|2_% lQtJoٰ c0BƇ1ĆŗIe+v!U~3xQ/Q.p08fC~2p* Ĕ2pΡ`hHtۻwD5۶顊h" vE[:Q`l"[,2y9xDP i}[#ũ V;-[|hzk_(صWO癝"̅_N^/`-wJo7DjM 88B.4[jQ[׵ĮƒwZn\K5ֈ5Ew#:ԠM6oK[ %Sx jT" Bҳ45!cvԄ:4a;8%:P)GOl?*p`guFro~^Ξ=$ބU&D*Ȏ"G`B,"~P5[MWhV7U6 5΢hvr)1mYҒYڂ/-}5g~D٠iyǣi1UsdT/>*Kp !ѩm"kZУaHHHy= a ̂!!|Iy3k3kxNK +A/CWQUޓ "Q7aIBXHQ,/X]:/i|~\&@|?c&M0!~WOA'Jށ(d͉$ 2>wvo[D = 'NFKعzK93-$2SyU͟Bj_VMXD.!T[wo sjT[ H`>bp)hw5ϖrWձ4@!;{޲iGl⻠֗ng`@*9\W\U&,uo!Բ~_["`u|yg5YV5gsB㽚es侃{q~sE$h7U /Em A@-aE* ƫEјq܂#~|2scXH^IG2  ZnS~~GW PVk%=|MmK柭o uU>ٟ5(gUIgd- e]_Ղw }Pѹ B؃OG}5+/YO4n\2$x-\Hp jSs~JWĆ kMʥKG?~5܄d-'ч\IAsb Am mֺ|:]5 @JG>;shV9c cqS|.o/@p'`aV-z`^ ?e۝:7]č_(9J?򈰲* P#uϏ󜅡K!DRK]Q :,NV^'.!lZYs8yěLM`b/4\Kԉ›C i 7N Z˖[ʥK>k[g,f9_]b*4]&9Ǒ37u#gsE-{)en8TZg^&4lPHlG }_yF~QG;}/eZtPs88SiHk}UFMMhb٠Ծ{՜&xxŸ|W&h@  8!gn5$X9e7O7h h@ j^.ja ~8XI6j h@j8݄y߯.-4h@=%pfQo  %//IvF7ǟ4Mh!`W/ Mdh@5dÑZ $&V|DM_4M$4~Ѵh2F@M\֌(^IENDB`3Depict-0.0.22/data/textures/keyboard-command.png0000644000175000017500000001323312233244370021172 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<IDATx]{|EAd]">D=t~[A<芯\>zfQyE9wU"`2 HH!L&3GwWWuWOLUUWU&,F11                       pE o0e؈ KKʂd&ˠrFs0@J$'u|=*-)aE<qm %>}**P 0@jˡ|l=l7p,IBkK+,IVmoIÉI0qD`(=R^- ҒoDyuߗٳ`rm1\NƏ+΃EŖB|h'䣰K?YQw$$''}*6Ғ[uYZ 9)@H ?~ߠ`cpp:=p8Hp%]<NDk[t\ - #o8LX,wa#"o8OH?=rg @0"Fʲ.N&cA5Fdr+3m=~z4͈#,B\@EeXo, @yc!B I! ## .{mHήNcƌEvn83g 1!ᮨ,g#Er; 0ή=vOBp8X#999>tQgΜz=;li$I;{m!Frr hl:? JǏԔTTz=ɓ!H2Bl9V\.2(p`j4?y_ 8qؠI,Jذgx;x2 ܲ e& CÁFEfz ==Yhim<`. --sFl|j8Bτ}~B,~l9ЪLꪱLXIBK7 $\\ffvDeiXRG|_jx+*/]jkjӉ0{,<*٠-xp$$IgS\!kƆ 2@A*`/^TWHY=;Pk^[n  MP(_믾% ÁO?yD?]>Ǹxu' Kϝ#t-xB]kb@Wȕ'\ܰ ͽOm~j0566  Y Zq7N@^?^J$ <򺉔&+q:!"'A0,vFuAxÃ9^xn=-v>m7G,Vz>χ|D!٫@%R29y i˛xo_dee~j-Np4?N0 Cdg[/n| <ƻcQFQe|F1 ˲_5ؽk~t|avl߉k%~;o._|:;;˯< @S@!L" C5>ٞ%P/Ubԅ8_ܲfNJy5YP[{5{&,YU_ر_LܸCHWa@^ԟg2e g,vzW\\DaאG~aT,:FPʟV4;z+H!'lt B`xH0d>>\WIHOOhii6~P7-lZzZ i:;NS U0@@(qM8 "(t2=wޥ; JZk[6M7p*}ahs6~t?+_I_Ǻ5@ 1'Jg2M]u|[68:W0DoF01t+W[ߥ5-pZ!22uٯWCm]_ؾ~{&hkk燫@q? "DVjdQOFuP٪mxfSo1YΆ] .<޼ --o'Oɓ,uY?YjTUU[xt^o-Agg'ɗ_űr=5k{Esr{uҤ|L8D1p* *SiSd@DL5@sHFo 0բb_Vl<|`R~>_7\?=Xt1_uU ⺑8B$༼1s؛xW aUU~"eM,Y7MSM~+`?kb N`^rIi|*NElz;6pqb]sX!& z'al 2pgj2O7D,s?qBϙ\'0_RF}~"q-SsRgvI0[/Q vLLkLb}~s<1_B'Xe~&׏mE-~z2seGQcEz?&b,ឞ?ڋZ<{gq} Ei}M/omYY(,Xt)\ N)%:'tJ৅h{L ~WpY>V=`}: χ_3]ss3Ca+bӆ5?AY1BjIt";zҺv7zBC޵K-񣅚Z,f'Q3 S{I*+: z,WE=xG_c̙vo!v d%_C&W_?2---س{/ xpCض}$''A ǽLzaU]!*f-(.lpm˒!\ B֭Y3gP|~2Aߞ=z4/CX-om(**'>(y_uuuظa_ DVlH5RmPYA<;]jP ɿYX9*.@$P.-ܱgV ڏ.ꬄ~n4}Wpe,ǺbUDy4&yE+!i}ˢ ?o:pELB}{Ӂ[`ǻhK(+R-6YbDW0H#ɿ^@ ӧg?YTz 7S򯒡x:Mz5l}//P-4[ WgLW),3>|o=wފ`Xqr\vehow.v!f͙-,c3wU<~v -DZj*>=pm~5RNNj}<7#`tsJ!6?Q$w#j?ڟ~x򢊍66NŚ %1/nP <:\1g;vu i*ʑ.tLDk : %;1*g$Q߶V9GXpYض*D:ژa1^4ݲ\E,YTpBƚVDw&GDŽ A^ѝ0Ż0yشETUU٘2u rݾ !p{#Y2&Mmͯa'[.\:{LOu ,GQ&EyWRe^FQjW+_T Q~})rasrŐڳL\xxSt S#aFJq#if_g]qi<T͸ϱ3@A,m + ~p 0w' )q$ƚ6XՌ~'5$"b_ e|ic8b,CXhAnJB|.{yw/si]]IsWhAL Vw5r>6`3œ)Ɋ\ŵZ",h8 ~xX@+N@Ww'zR6.qUEwL` zh]6S/y^Џ\J p8HKIC"h@y_s[{AucǏ"7g$RRw:-6b YQsSH0Y@(B]C===;52%R J\.idfdt"%%F I!ttv\ HLH'w$1_ (EwŻ@{{;]]}g1(x0:-~"v HO!"-3Lrrr<2DLUtww ˋ>C#G 11 i\-CILHp%D#ר䊔!)1KMI X}ʖaq!==c@+"p\gÁ 9=~a#2d:nzwGhE+̯ yP`~4jf#Jϯ+a`:6>CViIY oQQYa A%e>S 1l};66666666666666666666666 '; IENDB`3Depict-0.0.22/data/textures/plot_zoom_x.png0000644000175000017500000000737112270276630020342 0ustar pcuserpcuserPNG  IHDRrdZRdsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<vIDATxklu\Β)zۖdY"TNlH*Y*Z$A#mOu@Q$Ԩ P +'ʪ("G$-YeIDR⒜}p3ᐔKΘ?`9;g.3wNE( ԠgH8UH94i_ \  8YLlE‘MPʐ%C/Uaqjlxh,rYS$>G6NҬ̲h("#B 'I@k+Uqb܈ErTD!'kV8yu t8nD!jݑJ' TR9,-NympiB IL쎪YJ5~Bv]OShWpT#jgjR{|U$@Ün^$D,8BH9J5O8mm?ig!w!<R(OFfpԀǖB؆tT.=joNF;YvʼJ6CUiYԠ?LHl]̷~vB|t t`ˬFg.[aG!: 2l{cfi4æ?fqD?i+!倲駫rAG cG{t0ވ^$y,:N2jV݄ͫ䩰I)Ej f |6B¼6qA(^ bhWǡr@PcL(]V 52Be1?1%`bkc޲0~.I9\ oU@K޴:$X)Gaaɐ"5#_AD-gEe9L Yo2[L /O+cNmY]{@1vsO`Vթo"}!oeLMwZ @ oi9̪rs{BNÀUq0i@p^ ?,,xa' zm^dy$9tQ# 6  3p=n9D.1:jƣfFF=H䉗2"b*R t@#g-cF AFXJ$gZԶ-LY%BBXwIڗy[$‘Lj/k'%%b麿n$˖gMkzƄ9*!o'!q/BIDLw,ci&E𭅰 c-6s>ҲzA\%^. (H੼.B뉯RzzL}*vByZ%=b*ucYX~ _-q2ɲcŒ\L[<BV>WO=+*/V~[z?Ά3ϦtᬼF-(HA/v]/Hku|pRRɥU/_e<*k_вqo{%'s|o|oLR7s||o 5\Zm^g-&UO7pj^q u 9%i7Bz{ޒr &4/{7lע>|p8k\$R"UdXث+e_!.y^ tMcC@X0Kqxbs@?Z7;Hh>]f˪V>@Bm,jjpۯ8#g^ CE Me%6wNVr|וߧߧ9+q 31|t}"WkΝT^#.O Ub߭h?C0|fiEYNo໫{jY6:M=б|r;qYEA$xā& l\|P"FRÔm~+grswg tiNyKWsLHneK,-\7n2sFGޭ= !Cw愎=G&0rl舿`ZHB@<͝Av,_]#}=1޵eM+ g_kMD5~!R T9%5(]vvF<s-|3Nd"g+RYHBխeBz:yQMYKb7a7\yg#m+H^{5eJ 6Xdk%PV_W+zJBrnݝ;mz=PS iDѯ'򍟗=5KWϯ^tJ8;=u/]$GMF BZR-=m!}J#uu޾3r_h+œ 9AHLDxo~-'B"˥˗~=r9ӆHᓩ#' XsR2jaڦSKH}˗$Rv%vcیKPsLAEJAN)a=xM# Irl yͪ }Gn?\(ZwV&  #NR?fe:ppٞqRnTn^ʣJDkaHÄ yzHD]  ZXm[B^CF0>)ͻp ?uYޙF䝻u5 ahajS!6'$Q@{! _gJ,#gx;,hd\q^m~9 91Յ OrϜ?C'M~_#L5Ei(ͯ?=#EZ(B2%Gy"( YR'3{~%4{05 #$r_{`c山C@?Is7 ]1~tQ2x}q ?f)!Bw1GK@ ga@'vkR6sYHn#HUOeUo9Ľ 4B>cÌ$B"<o <:BJ&V*4XX l!,6Ljm|U`P d^W?|Xr# ՛,>9pBdv9<:R(sGpֈ_n`oČӾ> 'cϑs@haH0$ duHCpf7EZz@Rʁ :@e?}pɯjBQMcSFy5 y B <:N"!,#sٺ3' ry93ߔڸ`C4Ye~-5q#r=cGеċ44uWGo)X#JB70-@884n~o*jȨnv5yŐ~IYHSou7F U@6Q84(CG%-Tn%^.;sFY .|4i0vާDƯ F { P6xIGGhr j-A?/Qؐl+ jP"𖷁J ۴@xfGuz< (  b,)AQ8(V(+oI٨pbq9_ժ!fr9Cgwqu{_Ґ!ar 444!t @H*xi;lHCk;i\UL~XT+=`!4 +s%SkÀe04 A9 DYsojکMbM?m !Eȟhd!<!@Jx"!ZRkk[r`U)jLj䜡ʫ?CG%KZ-i6 t%\*d T@ʙ݆&1 ɨ!aǥs QϼQ7umiC#  7EA(7%Hl>nЮm4F*ݍޞlK,Yn:,nê2Ek{˱#37bv܈ණ/_zV y BN/qjoqH'+^:۝ml #(杛uD2_˷[:A]1!9BLCˤ#f=|0`Y@Tק+U;n gs93 jiGX2ulK ,׍SpXlM ;+ALyͦ{<&ş_BEmA aQ-Z ab\AtyS/\jlФu_pF6[ltD A붿j+L؜ }̍P ^Vڅys*(K_E!jC$f}{;؆  F/#N} C@ấQm ; 1m1YW{Ċ}Ș 4+^eDZeVcQq ղUvD֤_xA_Q}:f~005*v:"C҆ HoNصp@^7GmiU+ $ jA N'h-)*xըƙ #K>AOR'!v;3;sPU c[ =(k_ڗ2|U܄PTDR"CC0-~؊˼ 蛃0t%=uXx}a}Ĥ3nWY~؞b6,MW8]_#^mm02|gY[S8-b4XP "%*Ð\yZе˾eϖ>Է{,M p*e'̨C*vؚXɋč#Vdm*ણ鋟ñҍ+.^!`yavmvT/ PJ56 2o5K%F]Єqx:=ڻk`ܤ3{X5ŋK5 A ;A-h: ɨBk8O\(: pQ.Oa[vZU5& 0aN={W/ xx{eOֵ R;gl$.~Ug 3j46e|Ȁ)k5\YET5xNuU  l+һn(; ̗'j;V5kٗmvuV)NHD30M#M Zv]\qJ{.h}+SeiMe|@ >۔͕ W'|xȀA@(`(Tj]TZvTg{Puefv_֙XE.zv8 WD<\\vTP0k}$-nH8%€^W-ho+z唾e^ZGn !);HA|n:^@(QQj~ L Vm' zpa$o:bHLWؖ޽rIbk[q>Ri 7 FL>ِnVH8"$gJU+~kV\ѫФG|@)ZDx GI xֵQuO'wv4 ;N@QO|NƊNȘEfQqb;NZN@.H0{k:Uq;+)n d+@~5@P/ZbV Dra36vyIEi=rbs7W&^an΂X"F4UԿ׾xu/J\էRʆMVfqΨ0ZĎ[S|إWC&P68Uh՟nq#4N죪&AvQ5j_7>k($r@BA׭ SQor%+HA07 Dcw{޼s*O(T} v슿]W`'*ZvdB.sH[V7DPSI5~|`3aS3+߷d  L>^bFH8->Xp>ېh )XDx i% Ҹ1"m;5=` u=i~ao-ߦX>EkpU?{8hF\t]sC㦦.nId[ 9i;y']ytpaB:<̡bM-N<(xyYIezuH⤾^mM£PƸ@ؘC<VrRWo{ibŧ[3D;ڝm՞C> ,*+Zt@@N? ~7kh+3@~~Pm1`eYkr]W⻶O|dP)e! 뽁qGi۩|p?xdnb-c@Co:Ԟz8~ {&;V5?Y8ukqwO8TI[klHZ;U|LH)|E~@ 2lI5~,\(b/uqw8@A"N1ܻh;n?;ڶp Ŗ}ywx*M-NYp@IȋM5NZj\] v )hBqԀJZv\ vٺ(R=N)ڳVF/Z!=} +JiPU z o`[E"%sۋ/f0w1EWiPq2SJb?~[;(mWܜ'Eд} 5%~\18D0 HS/ă-L<0dMׂ7U㗜B9|z@>WU87 !T#~sɅtWs}ui8l<9"Ѥ6VZ\3g $m毲[N7U=6孆7xQ%6@fԸ@.lbPͶNrV'crҦWo2p؋N0;2e nםn~Lq#Zlkl2%%fW=Ij_] UFݥm&}WHe y0G-x|Ah&3]3"B ^e>N0-:## q3mWtUͿ-?ݷ ?4iM1zDTǎGT Q/nu;Vv7eHP˿sϺ¦+@/ zx~IԦ ō'VS&8 8de*\v˫f3sQ=cvF޹.!Zzt|Eϩ>xbAf}l,SiE+.bwFmWnZdU4+$3_F!f0iWqtV;3h )ތ>>.)j¶@ QFhȥ#@q|L63ʸOņBq±a)BB&tֽ&bs>hmhh!a&~?=bDێ>Hy`nrB7Ac]uWGHCC+ 40 I 6a&^ U `B  xLF>~ȁ^ LOdco4wP׋ο4!4Mi6j5FJk_fyV=|zA Cz[LУrݩ u0N- < okq i]܆)pQ`yqeN]E9 NX ڔEP6\nePi*7Q~ eF10|gvuqgwP51_W x ^Z\%t[bB*k÷5NUe|c۔>wſqj{کܦrԡJ9ix>^>8},;@u}=3rϘ0_6+ݺx#^@؆iSa}j1X總{Gƶ+88qԾOpgljF7#S:ˌH7stH)"A^ 'w0G!πU BGf/jzKa7$xqV%*䨆V0"c-Ozk2"&Z]u̯qxQؖp΂t; lj3wt\;Uw}=Vdr$tJꚧFn +,(0 G\(U*86A [aU5eW_ގJOֿ7};{mdlG2= %cE5Рܮے֤ڋ6-JU?\ܥrܡ`#nƁeB%^ܸTipYӮ1K!tM352+L@Oan~9r^q؍)6o'xGG#[=idgƜ\뽗w1Ђ>H6Vú uL:Xl_ HH초Jb6vfw݌QCp9q{9((\ w޲NBj^bsӾR^`? ~ ;J;)uw5t}fRԺ. /|~9,KlNhؚ,Or^vQ$cBrGت*jc'vOgf?wnM e(J]̢^6!5C+5A]( 0$ÜVIY$הcIZ]QW]}rJ,Y/6D:ZȇP+9Ol5*fk[LHH_ĉ8Ɋm5-uG٧q8Z(9M+) 'M pbCwÍ6mSn_Quӎ J)?tݽ(^GD.ͥ)H'ʷԼXJ$`.;ꨵp_&nvxgާ!JLrl_)LJ nv9}+*eu/>R)w3PJ' ם# $SEհ%;-$uT:kS w!??B)\qNxfسisטC#' 捏w3wE=vFR׾r"2~a7Gl,y# R3XT-XVNkDjKF*ع7&TB#AZu_ /z'>g#178im(zqO}\ɚMktMXrːsxz!UJUDzIg,ȾDI,"bJ'~[M6PbdW)`Jyλ@*O,5BzJNG9.hS<ꙣDe/ yX׉F4Hjy#-NnYYǒۗt j-u_! P9gR;$} N!h ehLmzȔȿviڻ==@XI/R*߾tl~j\wf5Y(}QodcH7Xu)KvRV+UHM 7m8[h -5r# `mZV iI/zG5MS݂ 0CC Fƒ'Z|']sljΨ_͸҄Q7olޛ=WO5Z20h wkK `3f/#fT6K6-5մTSB}~t ,S,ƢÃF$210chHQ?Ifqyȏ?~=$. bEv]k;60B\rr9&q.sYU w4Eo]G~ i]\CB^jk8ڊdD0[0`3?KrY+]zTx:Ë׮q52L%!>ۍ>o|7ASLK}]@Tz-TU0>`4m)g^B L]o|x]0>gדzO$(@sU }Cm`[K4rW$}g˝̤|k)o4gj ܅&:nch0`{Uv=7IvULW7oEf2擽#^K;F~(ٟ y#&|3w77z=w/#Tߺ@ʥ9urM 'j6C> o7+\|t:^L&QmϹDx-1qY9bzt.VWVS䖒 } y)_:Պd"JH$P%|ge8_ɯ>Qxc?Ykls~m74/ۂ6΂xHT?\-!? U >{Gcc#vՊᠲݎ^G$rli&''qaddQ?$Ut̚N9 pW*e㍰E8w`osᜠrem*P455DUU.xe4&&&`rr n޼͛7/ _3 4@ԏzxWnsQzÆb2zE{k1A=GeC^__OGGFjjjhF4I,\tHdΔkDA+{୵~mݶFgQ m^U8p,6OFTQ&? =|p]wE16;ŸqqY&&0Q蹮*h͍uE~{]fcEb}=~S^! $AbnP(_0ȑ#477p88p6mR6###\rl6i\~sΡܼ16 {\fk:_\TS7㿦i_}w?/vߺBfzÇ~DQDG}}=jB\.Ǖ+WFL PSaκe'4^f603ae97ax& \[֜ Ul6wNUU4R]](k-~CDx뙟#WKU:MmnN\.UnFf:4K}+s&C=S@5@MM Ǐ`0( pA\.5bKK k w^^Q'"8fl2b]:Z{}{若P(tV: E okkY^ϲm8ӧ|N]Ӿ*-1Ϲ3x|U : Q5 I20m*CPx0Çihhndz_.@^^V)$c0҉# NP'u~=P4V$? U?9Bmm%I,$ҩ狿X(h((5McjlluXLNFB"=Ub\ @ӕ O=`*`"!/ߵ,3SSUoE, +'/|R-<y㮹yQnwY{n* 9P| `T$Ird>ۿg.2Bǘ%8p`Q#r!bH}zi걀Hd2k8z !d2_K  nvEw8e#^yNAuRNq榭xuC4vvCLAɪ*ϗڊ$IKJv9kWԫڤ0. r3_oC$XzNAb4%s~߾P('pt:SthoO1ͮm CAg$ x?3>^ݨYKTASY%RD9fd~UzQe22ivڹ@U%MkD'&M[S}è{2ك0OBCސ3L+d-"nLMY[sDk4)2L1Lqe|uaK9VSa64 "c`ukT2ߪ\D<"aƥЕHTEۍjb/Պnpʒ+H066$r2/ (p5U0ul>29qI'(5dIo4. K*82񇧦i{QD\",FN]$I>@ @]]ZZZjbي(ɞׯ4H>"\Yx}l&[w.t#LƢu HZQ3x<^]*)rV=OOOSQ&t>iä's2ύNs),.xQWWtr=pa<ϢgJKpPWWǻn4M#pY^}UR O6sz?z2wU9tS-~,3L1[aH+*T"N!aшN[u,>R]]IK!+HNH**'Ǧ9;GU(o>1 r $)7JXx衇xkƩSzvm\zk׮( gǦxu|*pW`v3ĥ`U%J&mfn ӻVuMI0::Jeωs|As|?JLEX,z=PǏқ|"GСC<3>}v W\Uxy"8l$+l6k/H4cxx,ThDfpzrhy^:::Y~}c\.얿W(z Yۊ`hh(qnֵ2;i:!YWX,F$Yr.6.ENN Acc#R((nH555|;f>L$ŋ(x4+ق=7($B!'p/~oppłѸmJփl6˙HYz=wqn:?H >}z{ٵ^God8=#z/f.pk0%02z{{ EiL&wKt*oYV,K3wtt EͯGy|fq1.\_H!~ɇks F*bNk^sd%Ȳ>oۼ~Oӵn7s |.j!I8tDQƲ93b'(ch4:N(Y^%I҆l,344 sߟ_zikk+G?m, w}7'Oy[[$D|5lxޟ(II`EqӤ0l+..\o Ug0\0Simm/P__O2djj udll`M&T|N鎚xiHss3(. pv˚F~_.[innEQV&=fSl@ӭ}4e Xɥt: qq;A` yhFnq<)rY_Nlv ˵W ^KWnʄo0k?UEee5~ N,\p7j]1N˺Nd2b61 dY~:<'UuKoqq\Wۯے,[jm/_&ʫ/ñ%Xe]VSq:DQOeϪoN5` pݗ;::PB~()\KO%ږ-a6UGltVXqrɣ{WAr+`d3㫮jʹX9ROsM9}jអC^xz}@oo/`,YlH$w6PU,,>. 555gjjj^(G'8R)Vz%4$i˭!VD*5kΜ$l6˛d v'Cib1\?`8tvvb2ʞI$twwy}x=2As26YT؝u444~ӋQ ͊]Ӹݫm5=r\z}ż_e:;;ݙ)y*S$x)_&hm74O~ʐ ~쒧rKUF'quvn,M:CqC-u:h{KQ!x5UU. ՟,Yz=!twwS[[#@e퍠ߜcSgsі'_R<\oVmRRK!Re ]詞ikk^{{ީH~8NB?O:ftt}[x|kr cX|*XlK;(`lmCmmmoiiC=ts*^HD~@dt:h`0lsTU% OdT .mmm?ܳC~8\.uu #.U@44tNNPWUY>SMMM|>?xXd7p8P(A|>ߎ{ZcJ)da'',NR)f~,;kAv];宝F*ZXp8<! rhrD]Fr> 4`Z=:VJ~9hrhCM8~A?L&U5W.(HdB5;_֬ ×O(\t EQEq[{jq}u?VoYVflNz#?a0b[B,~xW^y-`_[Qv=f0&5jp?Mex-VUUtTrG=fsZ,Gk51@$5M˗/}6 6!>lZ=/w9ˉ(^8'߬k窪cm9\*b,ض? k9Nbhhh*XeOQhQ0 kN P6'!o ?^ziS BNGkkJvvSUUut^ZO9#N9s ?@,XZ[=}:}4_}VxikfNUUΟ?O.C-߯\JPUI8qGcǎ>8/Ė_ӧ ?}ׯ_L"8fl֓,UU]EQD+Sq{odY.&rw^9v_{==l#qi٬qff67'I_"LLLɤ`0FcN @WɤG o}+ &ǏsС9r> 8g{kTUeY֫*?B$)+I/~uIMv?F.+:vGuuE\7<ե cSv pw6Ew(JQl6jkk '~Wׇ2adޱ?UUkt:vᆆ_uy%ɏbW_MHR︠Oa=A^ن6*povCte3RԄ/(neb|cF= J7ez͐zɟ!\tq芊 nv---?hhhfcX(pΐd2yy {̻.---O<:y6v|à N[a(JщPYYɡC?{{b4E&oKR﷟h:=JccF{{? -:#=k)\X_POY' {---?qĚWw$vcJpp[F*'f577f%n?!?#(F#Fq[B!ٷo@`0`0绸;v{̞.z^F,r9rܜ)륵 ' OZ, v ;u:ݗEyo IR#lD#\YN'mmmxņWWWwn* 7[l]{ᘹBIOAq)K.GI4sIDAT(\.QwW?#N]I~vZWW,˟?LU$ITUUzqx.zޗ}>߫(-piy/+ɘEYqj bш`=NZee[5> v{ӧeYl===mkc'L:L&fZe͖퉊$I)3LVub l.qfMAy^=AijY65dYs&ɲlUU (DQL`HLT!Znd֎=w1#c]=w1#c]UIENDB`3Depict-0.0.22/data/textures/tex-source/0000755000175000017500000000000013414246232017345 5ustar pcuserpcuser3Depict-0.0.22/data/textures/tex-source/keyboard-shift.svg0000644000175000017500000002264512233244370023011 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/3Depict-icon-hires.png0000644000175000017500000016260513414246232023416 0ustar pcuserpcuserPNG  IHDR\c~kgAMA a cHRMz&u0`:pQ<bKGD pHYs.y.y9tIME /EIDATxwdWyMB==9'e I$`k 6|{ֿ ^:p"h ! !ӌ&tι+W{thVW'[ީ$I$]ƗOg/oS} J۵ٶZRGs$ :r7@$Iw4}.[>mc&b ~dٙGEWFOAR$Iގ͚o}rG _V,r7Fl2$Iڀ>4{,}ޜl/̠t9/IAֽ֮2pNC.)wc ?$I؇6mr/{#n86gl&r7F*J$Cv6ﲰ?S@mS(1t|.n]2\蚆KSQGPC[YWUҦ @`L۶lHӤ2b$th2I""JY끍g:<|# %I։;<[qJSB^/!C#x] }i$JM&YřXřFFYIe2>9_YS$nT2$Irj١/!(w{v )"\nZs( L-.1B,VB(_|upr7F*.J$U{oS~ JcOc0HS0H}Os0(_\4 ,EgrqJV~̆v#^]0$I7.Ӳ~܍YTZõׅ騫U)׌na h:"N~gXSة$,6۶Dadfي 8'#2_<42/w{‘$IRd:Q旄|+^->QQĮ |~x>P <4!E(v,B4XZ^\'P]gf^Z*8ecOtO94]H$IRTrUM t7H-̎_ u(:D 5^3ir0hN 4D [Ye1r LMʔ&;&bmXyh`j܍r'@I tkS`ՎKWC=[nGSռX M( MPu}}  Ş@LN`MC0=m3 OL1emx^LYA@:P$ڀK6~_K(VvQ)@܊hhFkqXec-cM(`(KI$936Ʃq.Ζ%veha r&@I ^\~g,@s_vߵkPZ-mD jakl{tkl P;0HrztS͕<Bqgd- @I2}_|3Rnfj}%D['JWJ[(wo=95<9p 0d!'.\`|~G4#3_?wRP$Lj }zMCSM4E ]Q'sHmQ0؇L˹hC&*]<&ikCSE%GU$>#;?Ul 5ޅy+JkGKHؖ=:9xk/ner~bW)Y'ydhI^PZ3J$Z͟m~ p֖ܺfn!8<uJDfYRIg0Ϝ^{wDFxe`P~3,KO~w"2Y3& %IOC ;%QqmdT ufm;xZ"6O+e,/ 2P1gփ /.Y@$IE=[fρۊZX](QBx"a=uV*#<0̙q"w LJu7$IR|!}jjWW PL!Pϵ=yK;vm޾n 3wv*E4رhxupWqMde۟O<]>EZJ$}]m[ *kʾuww7Pn!'uT#41`{ `,╡a^/seׇ'[%2$I*z]ٲO !ROU;ڸ~?G۱u* fU@01yyp5By(X=*d(ITt5 ?b_U۹fs~w~=B}}ND*Nc_ %Ip_{ضᚪAoS7mBsg zVG(ڰD$_}PTyyphc|Y=422[ӵP$)G? mr[6s6(yb,(%;I %I ܯvtp]oFY\߂PEG*$SXmestxϞ#mJe!Cc'j$IU'Bz= ܼm+OatZfk>޶k 55k 孈@ΒQdfH<8V-bqw ۧ= } \xgzP$ gSu ?۶]Ylom-hjgV|7܊0 ^ZNĉQ׶y 76P ׆UsUmd(I҆woW˽`=PY3|4ls[$Z3=Ezx_XX(Pi۶M!/epK}ZH$}Z~R%:jy=p؍g}TjBQۻ̐.0;4SKw5 !'vkjOG e@$mH_>Պ E*Uˍ[{1^Z{:\;vlIX~ TXAw*Mu}^FXYEڝ!^_[g 7e$m87Dd_ݻm"_$US_~ X/k)仯`j0blLӶ51+'uvl6\ 1:7,I3_*Nw0;~D"} Ĝ-w~e`RJ$@IֽuP5}}ܱ{'~ pw4IRNb'{բ?'_(۶աɧJw*$i]|;vĭ(ӷ{?-}$ ;)BS65Hg P*F|`g0쉅rr@I֭u6ܤ[ kw[+n.Eݽח IR6 OԅᢾkFyo+.甂Cc_+902(IҺtog~ ȫ"(ܴ}EkJڛJ}$6X^Zٹ|@ƾgOm%?Y@fA$X!"aM ]7]ۗ~tUhV ;Q")qf6V@H?A<_g۶MM~KTT d(UOӊI PA6u+ `b=~K0`3L0 3`2EAdOcnjֶ@:wEm;"4߁ȻZ*Fzf'Y㊖ 9~Xfʆ{:8/%;I@Ry:aЃE+g \9}6}ưݶϴl4[YqkY%q,K/?_If[P#@^3-+S ?+w*|9i(%<ݛKu$'=UJ+816~ ^-lXF2EwΕO֫(3M'}nPܷkaEfng?[gJ ?o$U b!X^n"qKW!>xp7U&I~<#/A%$j'`>;̑M]b>PUn-(9aG <؅1^/'nm]+8Xd(-Zy?67\KO&>|ӬYt6!g[~s7:M]{mQגJx%ϖ5_h lI^2>A->;Q*<( *}4sth551JegL}_G(Q҆m4N}w"3} |+4wԆy˖% jowSK^O*U zĐmM}_ij"E']|x;2a9,'ҥtog.!ء\ 򖭽E/QHݍo)IR~^]L_?g'󪬕E:#)`>MSShpy\|. rRHwE @w-ݵIŗ-[L&@:6m̌I2$O.bY+)w{Zk "yzn uAmw˵~%$3O=^׵m'14W9 / L̓p6TkC~|a؏7]O U/* m'IESAa,I" 2!2!:%2!ڊ,܍ԗOs?|序zn/ tt>xMI_SS? 5ΙΞ|>%iKH^  ~|jݜQT`}PsPcb pn^N̴IdA̍]8V8 3y xe|:k\.ع ^B|rI SO'մl9uH$* ܄{\XpԶjlXTJJXX`ft&TDu9g/JWzm[_#kKSsjܥ]m$|Hf$JztyVL|i"H|+Z(VQ.?\bEn@mk-KRWxg>O͋?8iJ[ӶlbjhIDI۰ߢ#|[Y*'۶RyZnzIҕ$,XDGN!ul MlV":ҩkaP̞JROh ,„EaB"O /qѭvEBKIiBT[r֞eb}s湂m376DN_`fdGP ~ {Z~uކztun{{^_e1ȷK:ȥZ/zYi2>M & T&tmkpSVu+J/jgEefuYNX' d,ع117e܅! ~W}[ 9heKOY/l{ l-c $?3enG} 5oce>'m*ƃxY#(rn}mkcGyKGWe].6>W(qN!O|a;:ձ˃KءvArD;mh/Rll^̼ȳg U$86@+,,p'\u}Za5Pg;=uN5Wl 0[ω@X[z_biWpF4Dc"m}U55^KN4=nY ~nneCN(qk'Odɂdg.ps\8scm(ZvU{\v4޶OwtTΜbr7㢔i3R"˃cUr4,/kۜWfsq+kPrZK*Gw'_t>ʹ1ptL;bw}ke'wwt~';h$iKq'݌יxm;0K>ˑ`1}*$Mla;m-}U/y6noE99ʿfn4G9YUy&:mc[KQvmn$U}+UY jy< دq/S2,x;?}͇6 7&Qi={F򏧒;mop<,bg=tJ3 \(vqۖ^Tr._^jw*w3$M"ёr7u,s}r)>ɜW7*ʹBG(UT=in~]N0~7y<_K}3L@ |dQ*_ 8Yg!n&쭬𷴖T3{DTGO%XiY{><7M>}PU賁 F{II~Ա1 cXm3|$¬m|9Z|zwK3[_R] #gKRs r7xix4[!2$ roB^Qws#t@3rիrq?yz^9wkTٸ?Oo6߄"D,2 u ,j#<l"˺Cdu%i]S\}}`WLtQ!LZڽ=?{Ǒ%fBоm7n?<⽮RT}ĿX1L/mG9$#lrǮ(@WU޺e3ng ų>}>  PswP;:gJ=|;]wm\.0cVPs(v!ԧmKR?mpzmjS'o$Pʿ.娊0SZd07f(5nvܴy﨨b]rmE66ϥˉ/gt.ʩ'O1z&1WNr\{E^F+I3w3'݌7\@۲[64\6.$tS46 Z_Tzp=ڕv>8ס ,^ƵƵLZLXFm-uԱ8H2Vna[cY{mU9Ӌ7XT(f:Ed7T0j#|ȇÇ[ƸCɜ& EShi$bntL0+!3b쎄Qm eyn7M9.I)\egIpXIB:ϲ JD#>MSM} {C)T)(nz[yΓ˜ocˢ]Yxf3{;JՒûhMgv'\KǑkڒ?xaYNVpB_(Ger _~{><54Vc__ |GX sP?Ȑ9Ĭ=[Puu440Pځ-S RZ^J}ij)ȱHc 㣤sy=&"5V5LC82ԯr  Pk# ! LV|:'mp.qc,~}.v!`nt s2 t 'TKMcc"ɧ|8xXӛ{mCXXe|i}{{ ):v-El!|]X8.Ik>hVr{)B^65ïϿ0W oǰJ3 .llI屾NՕSCdymU 뷁2 |0 ;OwmWAw.](YRitjy hF:fq0 \qNٿT}Z|rI*Hp$v1<<ӳ+|d}(P n`*TqڲSةk$D׊݀,V&,㼞 "!j-MMXZ*w3Ue1)\u)ۻ㧁 oIu(j2t}r)I/p"}`E|>64Db)3fx64EOt֯p-pm/IUdzDf#Kҹ=ѩh_ںqOӎ#ͅ]9&.h3}Gk>fmsٳ@!nfәDvh.-E0a>']%S& $xeMQ:IB8D\IlW<l)w{]n 'I.%\q*u%pk`s-arh-@ PSP)0>F2|BE% &"ҦWS 3hg'TOsoUa-hYEB.Z{9Β$]UԊg?c/Ǿ}`Dnn#=Z[i)fHR KnF&"Q^aKWS!W2p 0w?f]Tn#Oh٣t?2|L[u`bmw?AO@^34le+] ۥ@gzʇ|8}xWbcM~7M[0w8s|m~A 5R->ʥ*:m8r1۶(85Cc;[uwoʭ[K|$pJFg4nndqr1z3$KE˱;ز,:B}֤|zy ~+WיHfoh֬Xߚi.K%$v;{7@r3!{ԫ /SZдTbi}WsG&u;V|/==%hz]k[яQ6g-Q Tlf'+'"' }GIMvz)zWq%JZV3Eo ofBgiWC; Yd|MZ3zn_0@s )%ߕʣk.Eq4 #£lK]Eqxp ﹾǏNԩu|6̒ȗ9<^KF8 F+Ncjؼw_ɎM֫/w/9vk̄pWd6@[cfnrSJ\TF>hV10~ a5%5k͜Ia.]Җٜ'$U%M^q8MÔ;"Yϱ,zQq,f>l2t>왾BOq/1vyg3:K[\|Ge?jZ&J3!$Ksi[b=_3ae.ATƕnrOmY ;׊>īkEbk!PDjhC0˅sN5nk뚮6;7J~KҺRBdfJGW v'i&;8)d\%=.IZ槧(w3JFh:Me}syPŗct]ۅ-J{wqTbQU\$j꽕33~ c[8ٜ3O6Ord 779IMjJ:/_iZ~ Iv?)t4_}34 e9&IFΒN݌p ckڦY?7979GΕ4۰9{{/נ 2'IoIEȐ#ʚt5K DoW+ ~]'v6c ڕ8~4:r\AMei! U. =T)j'ϳd dilt!'~HCy!BA3Dl:驜s >z}i.*JҥFֿ[j]# ~IŢ{m|"9[6l*TAݸjʻ"]L6Tq D'c9L qx,j --r,$J8`gS`!",(Vל=Z \7o;؆%.b.Cf$)_z'^-w3^` XNχ8ρ }}}ۻEwT*L>J2 `dfd2ynWbӞ˦`z{EGQц@TT!uEWh;r*0/[&2ÎfSggIJ` _w%ce3IMp 6eSݣr,;E(42(Iy҄FZtfMyou̜qmL7 ?uxZ I2??dn57MOSf־,mYF&(N&^X/Bg{ZJEejZ4j$U&t}Y4l 6#>VM}sط{'B(>$I*:3cr<@0f]gR'Lz|>۶m!)/};rٴnkO-֤5$H1o@5- <:z:Ab1鑵 L_TE70͡۲,w*r?Cndi_eɜ,nG]EfƊl$Ub?OOaO/O8vޝ{=SL# -!IRьNL03;[fTg™NRn]=@CE_IPrJT2(I(RPW K&c}}}ܜ2ʻ$C4hͨJUA,'NUUn(k.]g\˦[k1FufPŶM@eݔ+5M >2e: RmuAz=$3۶mJ.24৩粩7o.ǧ*l$Ub6]]GGv{-ǝV9ּȾhlTC9O2aӜ d2n4Bڴi-~p^E@ƊjA g7\_SŅN;4>r$dمr79h;N4Mw,?A˹lsWtS|2'IUoP420嬭 Ov־zFFq:pJr6>5d.hBVUںMtve2i.۶5!o?TU#74̽R]YQyei$yO`Osa,C:`sn`}F/aIcs\@P|ЕN]z)pŗ~۰x_.6m@Q(Oj8uVl3`Y&ٽ=>lXL,&r-HJ`#X_dF^u2T03,EmpAE1TM[5i*3kb˲,W&qY\nއ[|x#V*Z[ϕ {{zGB2}޼08x62[Ҙ'ńJPXL:8t\mt!E/C?Cߤ#ō Opo˒Bjk2۲,@Puכ)^ŇN7 rg^Jr$&kiEwo7ڀ?W]aOan9Duۮ P`p^gpUŦg)bk]M BiB)Y:J$)NɘV f#H|>'*/JR U^ A02ްmea`liKa?1,z)zkSjL1AWv%WD2ARioyTeMiF6g۶J\R\pV>|7~=MCBUTU׏*Ԫj!+Skt9a .~ r,^pꄛ P1ٽ nK>W$[^Mc.u@{Uׯ ˶mEi%>fF᫺`ʶ*RS!y$Ց:U,L\AO ;mLp5$Hi,F,yKĻƻ˲ ˲Y@Ca$ 2z!t^>roWe?i%%IUʬuDyW?J%#J /zya_RKer9Ρ׷ǨT1--7:er_ yԵ_ht:m\.ò, 6MɃ67+M B̺%H 3mVzTyb~s%`sC-16dwqL329Uέ(b盱,Xhiض}+,\ql,iC!Ie& vNm83̬/tb(2qeY NL2PlhU#z1_&1?iR)CUUr zef-^jSVJf%2vK83Mb0N^WO$ܜ.~hvŋ2*13&3T`Q3Z9%&ڂ9+JeTֹ :]ܽeFƮkg6S \ Riz6dxM3C|!ŧϷg.M(.̯iV~i_/L{/1;;0SŠbU0 .~6X}ھTƴ07lDf[UI[W~eUO-G"%*ؼfFU|zrx$e fCľ=4M44tImm+KlZASBsQ/?C_Wxf۰``37g3?o33c3>n39i1>n]wkhmFk6`y"SSCLM 199e/Kh݉F:Sϝ]ܻe_* Fb/`Z,Re V2Z4MвBu@K{;*Oh4.̧9_KzzZ[Ҳ.Kjn  *vFg AAg~if|bxbhfhhD"iNSS7MMd2i&&;9"3 _?_?s[YLt/ۆ'.xj,;f&h'ʘL.EF7: +%`? Z +8@q)ƺD3Q<"IN,֤CH|ҎWRUMtt줣c%c]ÄMصKWA}] ۷ o׹^FmN09qMrUUc;04 ddŖ:姷Q.kMHh˶@V[7e?i-@r ?AN`L'iTb9?^G Sokq+;ii}]UQWe>C4_-×/GpơCS?.X<|W^00R-l;=IJ28c eG3NՊib:a.ǒ9uI[C$ l۾ !T۶545!f P;Nɵ~WiGAYxvbVKw~\rnUCT~j_WֹnqgIef 7ؿ8YBFM0y4ٹM3&r:߯r-:;wo~+|M~4'N9 Z8xݻoep/8]c8でs[,1Bgm3ӦB"lN}Mk ں-[56 nU]]{) :rʅ ?EkA]w{#LNp3LLS/.Zrq>y Ơζ!N3KI6רtX{f3۶R fx6 l1޶al)w3$3Pٛ4lr 55+۵KmoӸ ^ I{y ?bn..D8_)ZpT3m<2Rϯ`"ro>Lb]+@^B\ڶ8qBQ=i}\(S,r7E*N|F 0HqMt|`ri\.AB޽*waukv-U(ÀnӸfg? wٶF^ISPy,מε ܷ8.+(kHZ+@u˲T!i@jNj]l߬0;C; I6O:R.>_mۮcb͹|ءr]]IQUx FA}Mlr-r3$٩FNy/)**L٬4MSd2*+5~?9ӛ 73v$:¶6k$"# /ضz"V5Uy{ n],VT9pK/eSLL*FO!6m1Nz(b_Ϯ>NHJ_۶۶˲]|x<z p̅j@0ݿYLMr7E6'>_`s3vװmutu{lT>o]ֽ5x4f*2i~::vq;\Q7?ݝqXyPdYl0f25JaP<- x!_PfHRYD4ϵLRaxCWF3=.nACQdo=nENi2|A-[/s쳤Ӆ%L/f~A _u@۶UU0֘Eᴡj&D|93T ~lrJ\70OUwaw\?."n77ި/%8v,TUrXN-nd9OTFAtRlVXd^R5nދu&Pj ZR?;r21# /NCGں]n{o*߸hiYReoc|c/ozٹ-tw'9^. A1g,U\ ˲bbjYdڼq# SJ R[BmE?XO|W 5{lsS[ ?if'H]s;㏱X،sӭ EW嶜TzNd²,EuV[A4"LppCt-͐҂? \aǎ[hmK^َ߹uI~}.TalbhO?U"bqW9/'lOMΐ2Mv\s~|Q!}/Թ#  Cu>PӋ״x Ix-\^MA'z)ʖ-q 7u=>n\(p * js/aaaB}`,[prhݡitEV(_#q+t]΋?2 #rt]\a]#E4MB7l2V>)T03xx7ZHF/ne޷/ݭ?^`۶D vPJU2&K v=@05׮[_+3D `˲4BQq}]%5u8*hiZL.oFWr7E6 /fhR57{0 o>IilT8|Xcpbv0w.ݨ܅Metj#l-!c]>#+3 È ,֭[| +{ ~g^Y48;TI̤mf_BoCC7v|n7.n_NN(,9Ls^{{ iKo)O _o@Vbem[ض-,˺hooW}.ٙ\|Fah%)_G?pa֮oG]rfXMKS"7RE& x!uruرN]/xZW"IcM N0 p51m9vEȲ9Ry-s׶Y̿;UAO5twDA~|KC"3REYj/6ᅴgdxX^;¯|OE4k8 eAdCi3i=r7E^ pS[1#f{*x;}>9IL*‰BVjaM禛!d$x֤IMtr-f\8'57 K4'I1t+P׳g;x>Qr̟Tdlgrft~a~yKl+]:ϋX5'JN7fop_Zr4' aY Ab0~kV*௹y+{(|y#]Y/mm#U6Us30l''k_iKfkhpq5XJ_ХuW~3~3n{ѶK"lv:j>5˲-NMbOtUHngg/B6o}@' v+pTroySOeή]w CC䵯G'm'Md)DTTLL+VZZ/p7ERuڲEcbdbXp.W C3 Ӵ/4C*Q_$FM/ru]8O%MӖ<ϢiKi^8K%LaKJE1v'ew4RAMfv}梌Xj--p?]L3I2ŸLJ{_r.M2C6` !l!m//l+bno۶z}>V\j&i3M*FZC9x_mںe=(}ƫI&w3dff̽^k).'iZ_z%tvo6 Ka, !^u*5N:-5-nN<u'.ں *۶ھҺ >Algܜz8p}ڷDr_GزgvRL1 qBX\T@UUT*j}?8}j֟)R~ٙv"NTr@@֗`P>{ZNcc/ b4f9;"̦Ҍ߼^ i3u]_r݋a,zEdz1l>_FFA@M;ҲY^٣xiwMm+O9vAhuN}T~~ul ̗lI%g?KQKQk,`˲쥥%_ݿE64zLJ,X݃}6]Sݻu5d=L]\a۶Q'8^R;qO~M3R~r^y^(iu뭷Z='y"t\HU"vzkwy4UTZ[U2x|܍ee~)}o?l9QvodiJw뺩 P\ `4 Դ}nTfMy0J۶MgfUf ]?"+砭mkL4ݑ{imB3TBTRUJ&2 vllmqaaw:o]#0 outyWɂ1Uow̟]ArcEvBgU.`72WS3qs 'mtv^G0naܛ$]΍7˱҆BO[8}DS9a R_Ƕ/CׯuEQ2_EɨLML!yС1+ȸ4 5 \G>/ ֲy,/m$v.4 YY.c&dEa˖8ya}j-֒[&QzPUUn`EQLM2e\.Wfel Qqڡ+3f!@4% R嬝jx/>C=l|+B%¹݂C\2'Io g]Uu{+N=iVo÷Ķ|Ya=3BYճ[ :F#+t|%`PR&I9\aw9i:޲۳ǐ?I.ZLyҹ\6o~ g~ɽ6e9b>" 4-(J&mbYâqdXubLkxep}3V4 7(uþ}!Ikp#.j~#6]OSrO}/ 9)$Wtt^d_`X@GvW! L ǭʒ1`Ꮾ!3y#ԴG#RdIZ;]~.`A0ZWfysC1pknV[oƎ6{[tu(ey}+I47B sssBgӦ9{;1iI7yf;ؙl` xUoZUYmg<`]JY)RVݲk_GhnPMsuvCf$)۶\y`^9~˶>o>4EKal>--IR47 VV#=%E{8T7Men*x<_!()EQҚVt]OniiyC߲9ؘb% ĪF핇M ;uLrMsQ)]&hjRwhj؋M*uv7#˶ìtf)EQRTUM)EQRKKKo.l@˙BB lQ]66v7z|M Р( $@6S0E4:ܗgkyr&}a:"n:+"t4-u]O麞ސuTBKc@TMm]Sw9aBnk\wUB}*T &+sJ}cb2ERWZw Es( ggTUMi,[-$TEVVoW,"7wݵoT.* "Ts C\Bdn`˕W %^-7'n7i8܃߬`PB Ul; %5SS>6;Z lڀ ݿ( k$Wu=(JRQwqRRg/jQ=_T2*ͭ9mi^jkwTt-3%B!?S {F',gݹ-s/ob0[/IEQ4MKBI!D*JNր$N JRp!Ӧ {WV ndP (R]LNx ~4oBeیĜ!e|/xe9 jf.y7 Jj _UcUз:L*r\I0 W|lU{P*O_#|owNBQx `I*4U*d2RU76fg2FYXRRP4x;;\"%VL*B$mN !LRrqk5Ubx{4fiit:hw7΃jԷtzT4-jbeoruv'JOf% :rPP[-\>M+>K)Iը>[ڝLL?JUj(8\Bt5ZǛ\a9>|#Mp-jH\Ӵ( !DK8iZ"i.`X$ʾƂ7sj1ڪ͢2(IŰ\-Ms<\}>ͥ\9+@]#/z<4-nŌ7[c5@`9@IiTk7@"a $A<^]Y@/:C"<>[Y{1u=jv 2㸸,#IW|79rc*hTf%2TFttY L-VΨL\VE,+a\ -Jmo[hL;7:͒iqS,IUm{sP;tS QE:+Ys%W%%By9f"yqd$]N=x3]P]Ǜi JR!-.: *ՄaY}c;/2)ʩP+d_c+En;iZnp\`pu3 TS)Imq9X *bVssi9X $YZZ_c /vm@w$aR$Kt>~DdCIDATOy ΚN P5=&v_INr7b 9IBAvjz%UUbOӴ)bSSS9/BK $4NǛ\̀~R7,I. Tjviގ C!Chlc9iŬ劮'iB䭾E?08@OΨ$U'’@jbvLL$dr$az:.q8qql5nL&R]8C(RYa] c+j y-:<h26o9i5(o]w$6idPIxr]_'4-,gL}}gUL͑Shc pq_teG0iQMӲ?ǀ#`^_GH0Y֍r܋+o$;vx IJB(]o"E5e*<1|2 39EM-ٿ/:y뭷:[G2~.}|%f[/"'Hco e-.YXHSS#PpRM 8+0j˯.K4 5J+`$; 0Ȫ.ᨪQ۶BY}e5o,@63M0| 7]_P;e(IN$7Ե8 N3ԉ{)6nDhcG=ODbA ]ze> @qrM`i!(u?R m *ZXl,U !mm'븻y rXv~89e]x˓?Ve%4-lrEw@c0\XXl\M3V##r7L@*uVO9e vtq63 #r"G\.WvGEu=J ǥQcfBNIpay[*6PfHRU0M؆VhZz%I)NNOM& #ÈVf^i1 #(J0?mV oYDicgj?6E}l,A,㑃%jFF$EQ8inuEY@I42ۻ89N笪 87&Vn6:$md'Lv7nvg'dsx9vۉ1ls:FYU$9g~= US՚0`G=K0mJ,5)emc])U/ ^`6TD2tg:<nƝ[Ena627>Cՙ73Gi Z( ΁/~)l%Zq뺵8({]6E%Z4gdQD%6msOM%ͼ5qjJ缞Ayq>~}gG28(ͿMrN68p /}F3|x}~]A)|׾ˁo8=R7տy3ݻl9O$+acs/ {R6p]W^ios8=zO]-aY??8׾۾c,L]5 }մJ)kRʚC-J߿ԙ`B'3#5 F26N}WZشŪUF0]4n/hՕd x6@4A=U±V`7c?)e+9SmUJդ5TMQ۳gOָ#k<L{<|̻06j=ւs;BFOС࣯x{;lF o[XuwHԪjr<] @| x2v 5h8x?] fs wnRkq4 )>Su;ݯ _qֺ+V BuΝ>v[~P̴S'4޼Yr $yuܑcs-gL"l[NiSp.r/\a $ tl%*35#ocFw#d{vۀ 5TB$չW/?ff=pWkVf4{WRV.ɜg2ɷQ 4҄ ȸ^j@)5kORʒwZđeʹN q.g=k~m'ψ_85uˎ㔕R9SWo%kn{L/A^!>v W_Cq$d9z'oV$g0 4.X.8?WR"$셗+$ֵu݊8$V\VR˃jM|O%  PK/RU,N8z ,l^,j6.h9r1 v^5)eqnYJYW&&&*7x?uq PxAW2 2ߠSB}瞫cǎ<@2*a-G?PrRd#_X l2.KRro?!Dy;/I؇百W&0`~[<|]S8xEK@.* @r/M Q,p|6s /Y7iQKßye󺯇aXڽ{w .l-XDLs*2DͿ ^| .A) dxT!4rjsW9'Ѳ}@v\>cgT#fs]*K)+V(}C7 [,2"hN@` &Ӊ+۷40 r9đ#j]2@k=BA3p) qdIB;.yIt)kU@߹ٲϯ`qo}h $dx!k/@?K# -hcV@28bch>r8B h˾1\x)X\-[[J`) =˙d~qcX HrҚ>v K%CؼYPGBtD;ԲϵZk0.O(=ȶ]L$uC`n9˕f164ze)_؛i7ӽ,d]D"g"2X^bڬ5 鏵ǎV>,jC2v(Dئ 3^sֺ3ࣔVecLywAF<%EdB sukej*[{b YDahqhK#=jS #bg9y[gᯧWr]J+xw t__>qdIa֑@1k3Jlܨ ?B^KmpX0A `q)X@Hyfk_N{JdS+I)˞畾 |go"^A_6!.5Zep $\@SLM4p}N(^# l?f )iKBJӥɡ/z߃@ֶgle274 pCV ^M#c15ѠpX8_\tN;${j`q޽bhx8}"~'LXi/B~3& kR)Bcn&aҗNs-,jScǁt0ucȏ^t)?~_ZSJR%ul֠ߝ?ǽ0x/^s,}鄜ű>v&al=jf G.G2wժAlwhl>\ˁ]|9X!D<+)X)խiK{ C`~7 ʴKYB[@ &)\X0=m>MզJ8&A0R+驤caO/{_ %)eiA+Y/>[};hd-lZt:ՀK3Yj5Z T[>jS&Ϳ"Bǀ;Xbg5}Njv[qH?×p;xeՙ"dh (Sjo >P*aHC|myV'A}YyfD cQ;yEu)y6?~|(y ' AR:<[Nm `|"ِA1VCNymKO1^_{ǟ isg:M'M`u)E!޽{0  ؏:~LPϲ,@JIˍ@hX ,0=-8TZI` ~+G[ 8PJBJM N+~ZbRޱcGgW.N}{}go!YT\9:Np\P\悀V7 !)eSRN N}>Jֺ866vjϞ=f_KG Lh82x~*nt:nD# `h]Ѳwx!Dr+Ƙb_mZJY}o^1᯿wL=u˼7tjd2(\iTq"(Ea>~#!{כfӂshR*+n1O+R"Sw}/j}.̴_q;W&.@@ Բaű|_=٧tx8NS)UO`:6}|ߟ^Xq y'F J4dTDCRZG FRq~("RRMqRʪl=.[Xcl/,~>x2c"@W8|_BR2]`0# P/4ڲ߫ERʖֺj(JZz={}ehq'a&Y}p)hrh2~?("(tBPB"0gBb?D m)eSk]w8N@Ik=8Ns^|og< }_Ȩ aHRiu*ih DC0Z(0FR#g4&}T%)ֺ'yh:F^Da$_ @r& QE-( >gb1pC~pی8NMk]Yzu^OٳclY/_q/{`>xZBR>8?[0%7hm\6}o"7 a!Ds9UyhL1FO`}35m!#+s Zx ,K`< rX+aL|{C槯>1ֱֶ9MyMJYm4{_״8,k}EBL@2?2X;PGrǻa~OK?|Ͻ:FEuBa$?,|u88?xh54$`_-Cxz;)!wt裊8YJ`Xc:Q(jAr\k=P&N<ƥ}cȈ ?,Pxk۳B{{Yӯy#aÑ2E1&H{)_kߧL-ٙQƳVQF?Fi5N n2&l3l^p-m>{de_Gav(pk-70EXU#K| ]f |ߒ15:k?` H!-2f"k522H0-꒞-E*k\. !d%>0sw^彏BYkGuk3 -YQA@BYwYc 2k-Ka?Or#5җ='_2k<gMFU !d~ ~ PPٓJӤKw?V(bA0F.vR>ʼo~?Z%,'c'B!î @J 9;t?MG4 sxT+hG}bjS!~X㎀ӝq%7j|O`=kXx@BcuP0!,^S2;vln⃯ ׾"ȲH!dd϶$ ޏoXy6#2ƘQgBcݼy3UƇ2m_i X=!pa6H!KDc2,缻?? ZrYL݇/޿ 3lgܡZB+0,@r Zkz}n^ S}_׈&d.T2`@T3`KaR .8MY4cp)vuc>nbЗC^7$wgN!# cc圛 1clV8@-O_!Ľ MG bs?K0!F>ܤ@ߴ xjjjr>` :;A}mH?Tի;aιRgyfÃ~j^x26 !,l#;P>97i%0mR__8 66{[ YuP$~Ei?#B$0"{%V^G6c|q}1d(mYa BEX(IK}c-*1~qxtЗBRmdBHV d͙Gaì>AX@ ^.^< 4 "Ce{9@ !,&`wH_#k0.31_-@Ne>B2vmVc(2Nn0q!pЃhvy?0BH?h]9c,BDs !"u$ɵ–opsyOܳ?bȨd 쨁Bb'<7"#+0x{gAk:'2T# "KI6B>ɿ+0>||f}~@nE)5v(}ՐCa7A0mwy#9ʩ×n OZ"+ !!jU(8ѵ^;^6W0A -X׏!׬1>| oA| Ȓh;njBHb=֭ä !By R0H)5!|wgL'!0 -vC?0Bk~_=>0RJAAYM>'py^js7 fT@BB1:ÂLLD> >ww^}qdpwegN!+@~kvl( 1&t]7` WL}E6 Ǜ dk A5!'2q9AT)e6 !X` #; `j>}8?b"8]Ϥ3dO<$:skÀsp΃dp9A2!tP(F00fq&>A.;}yd6ԁp: Z='ev[) |I 81&dB`Yg_QF x{ށZ̵xgO`NSf B!gs[H*}U98PJ_~95}>ai.1B{7@ҷ;p٠ϜB7lhC3ƂdK 8>c,Z P~Ϣ|ry kBYOι/RJ?_.0|uA,A_ Hw3!>Oc!ϓA i_@G 5o& |?`m#,8gJ^S:p,>f >{BYF ի;p]Q3*/'''G9Ujm܋ G?Ҽh BY1ģ3{ygN!̑{lЂ(A5U>s, [a Wf(][2f is뺾8#H(N>?HEC4L˝|֮#hRhB#"sEXI !:1_)aAG (GsBٵu/l18Cտ5ZA g`q;69?gj$<eR.!7zu'QJu_GJZw A_ᰠ B5 H/ y/ ^b-GwYu~_ B!{lO!l!0v;RʎwUZ\ ÍXi-gE;}t@kgN!C|677տ-ӊ ׃b@7$#= o8x lsүڒ`BȐ>PjA9_zPbD>^F?p=\ ]LNEOvfb BfYͿNcyZٴi5 R/> ÁE^S o,V~f#G"raKgfeKwn0au\mZsN׃jDK^| ,ji0'A#^2P_Ho9l&2"s}2D7])<Zk;fg8&C(B\ X<|!gK[GcǗ BUE?-#۷nMޯ8>>NͿP1܋ <$߳ +> O|?W6 BȐ8#4ؼX[ ~B8mq?}ꞅ7ůdѿA0.k5ċۍ 2eJeޚ6 !d;Xڇֺnqyy) aDM!|vx?ߖ q?FE_K6`mv>U}b[x׋g.ʸaĥե-B`p*^۶ՠOz`KJR~{<]{BYBdڃ1맠ֺnٷn9˕R YPp_%|;`oЧ A q9'KxQc38BY5giSBvvO)B8-)es*^UQnq*V fH% E}Nxr4'چ|!Tq0kp$1Ulv:\.n:Rv]nYk]v]w<+fT\)q1_ yg'ԠO go1v55&7%OQ>_3Vuz% wUe*7E B*?YkRMT3[K_sˋ +$L~۬52Lut`ՓJVPW`$_3V!@bӦ;"5ʹ(hzTJƚv 2Cp0 /LNNYwlFظX8*3D g!x& ?TSѭj8VE?`& Xkߟ{?zmTjBi}d(|6mBY) -nw(0PJ|><O{vlllwy1F^UGPؿ_/W?}ѷׂڍVN3 ~]#äoBwaVMkt]n*ۻwo @\߷YSԾs7ՃN0gvׁ'GyWV! '#^Bl^/jH)Z[zu& 6Y$'>%\x-oj^]i(ZC3υ PG6g"}Bx \uU;8qҕ?JֺJ[n>+^.C駟b1jVzv=㟹3ל으/f::;?oh8B<̼W.o? -\.w"W(}s\.wfXҪE y]Z}+ 90 Nc\cm~Շ, Q K#7ǎBHB?տ]Nb8|>?#zw"y9Wkp}' Ct:EΙy^ Ќ16ƨ_N'VXTQ=0|˴mҭc;!B Y?HHʪ(y*d2rpC8/tᆮqC^ X XƘaY&ZιI^3"ιF>}CwYL!sp,W_]LW@WRv]׭k6nj@L6= 1" 7;cxc1 n}Ng+ß`J`$#>'R~2'8] $a {qnq啥I寞8(h(TmW\Q$K* Fd=nv[yHGQ(RɤJ(ʠ4t7Ƙ@2aEQ9'p#_4qΑ?13i䜧U? XkpΣu9‘l^qG0FB9"oWQ(!'>Oày+{GC $0u+~~zjy(ƘB(Ƙd0 DE6" C&1&EO[gaB0LSiKaZh1okg|F!_Nq]K.)wNFjKCR.~T d$SDkiرcq庮 [t]Wt:iͿ<}Lz18,cZ LCliKΫRTL+Mw0:?+͟ D!=p=6BNo/i9SZ{I' dY8S'?IsNq~zPDQ$ּ^ ÐGQĥ<">!39 ð(zUBtcr΍c,!„ah}S("!Dɟ~W}ؚxq,/G! \mNZM)>Q BԩQ$Z ӊ's9r9~Wyjx>gRJh4i/V5#zg "lZ8& CݺuktacǎRkʯ?|b!d@5.qNM|UuMJ }is]+A_JCQ[BX_PowB{zYK.9caOկT頏4rʚ5kʌ1òȨHPH x>xPHnCYJ7q"\)%ʓ*_eV>w]7WݵkWoL2 !C#!/2>~}0\Ƙq]8N9 {!pv5;o9lL@|sB:x\wbzC^ʮ떕RT%m߁QB]a!oxux[^Xr)f?~}2MMLL[~F U Yv>0~ ~/ B!;!,>-[Ҍz}t7u˞2\,K>$E@BxiBF+ogX;5㵤Wv=u9XJYBT<+ݻ;1h!Wl9fCYT'9 {1h}zjxwT.rySBaqSL93֨0}( 1+ArS>?ljp'fdGqROկ+[R|>_޳gO  !+½^E`?u@ !+ ᯿%@o>|m1a/m<ҪUo8P0!+=? y`ݠ/ Ķp'qyޗm.;)uOrSϧcccSZSׯ?k׮f@ B#7i1+lPB%/Qf۶\-i-zWt]rֺ=+r΋6l޵kH}`1|Р/ٳXwW?ugG1y,[Zi`J<+}+_C YHypZX ^x+3%!-D<8k~.9Ջ={u&tTQk]o2CwkBFp[uB\uU _=[:#oZk]>>}{~P$Mkx·'Ds{ 1֮Oqf.8N'IgLZ* ! ~$ d+jؠ/!5x; \w)1#Lڞޒ8drnRfOL}V @pK}q  xNͅqe9s?XTJI+V\-+iU>N޽ B:>ӀMzy;@sRE<;v !:Iof@u)]7m<ַP$=S-1]`] YV,'|u qM'1>>JFOk 馔*rbիWoiƘtH{Oօ=6k},)Z#qc_ JkZٷ< TJJRP{[ZV. &%P/>H4R\!^w1\vY]Vc3ֺy^Ik Gu)˕Ɗv[3"@BH_nB< $+aԂq"p9=_9 I8N) =#K%)e;y:dHӾ+۹4H,Uģ{BZn8\nf51Y٣8Ό-i-k˹\;DJYVJ{iy:dHIOE<xW<1/b:ֺʽMiL2ʭVw֠5t(B=w.5A_$!s`|X|>uMaݺ !:Tz*~Zn0jժ";z(Bȿ] Yop' ^-77pg[s3ڷ>O*}eTY8ϗ (?IeQ$,(` >@oY!Ҵ1dXL!^X~~5Lc֙cu'u _YJYOP !Kh90;/-w/,[7>㗺:rJ>JzR񫦁/ *8NR"87vܹ !d>.͈'0y}oxEn>"֮}RnTR𗆾4V[r)eP(Tn25HuwXkB>KTjJR8Ό 8`5 I߿uW_}5G !d0`o.ݷ.F\܁xZ(BL \ĕAI<oa u,7i( ?[D-'{q;A ژ -liK*3&pNv4-5M)eq`79SWJ]׭k|FRHY>s>kbˠf&!\J*y\xamīlΰP Xض9=ۊTJn/  XB4\.WׅuSSS5օ,aByO}*z$@ q07k?!0:Z~׎mz:f3zDEؼ[X:^-1f _; yn/6gW@PJ5 Xu y^@ !#kZ/СV$~+6nlc6lhn-l' 647`7ga5JRaB2&''{OwJ;Ȯ`VZ`̦}BNo vOkki Lj>/ NӜhr-uK@B~6711≗Wȑ[*7}ndnlƍ-_!:IpI`[)NB_sZI(li[Z&3j2ƚU7|3K@B97}5ܟ{tKc;s$1! ֮`&6mjPRʎ9{B`;yjK)=t %h9dR\.Z7;ػwNjHH cǎ (lԧ [ZA(a aC~9灔O^$u@4{`Z֯u/82*(B"ֲ^xA9rċȱ:v (: CE6(tE*3{Z+R),jQ^7f Chc |j0"#| !#%,hm"82uYy6<rsQ)e٤\0Ƭp{CߌǤVYͿ*`@L'>|Tuc#h~GF@BYbZqcccNZu(J)]k*kP[kU PEQ>edE2" @c1FZkEEQ$pk0uGk-c߉ h`hpgc#6q/L*iSp $U@JmNc08>>t:>6KF1! J~Ɇx@Y18z* tcLA0TsiIؓaJk4ƈG>&. <"cƘ3n*YgUsn6 {YU0}L~@cL( R6dJ)?EQ>XGkݡGȫQB?:,* }BHqeR 1iI+" (1Fx(xZK1v?k94 !LO6#(DIZrC)eh _EQ0 _*|>#Q$eZ+yh4tVBAZ-aZZkAdRa "q arÐsλ }L%AhRJcR/>1=HJ Th XkCkm8N` M7I5@BY&''.q1庮VIDՒ=MiSp1K)y1Ƃ EK DQ@8aBn/2ksn04޾=i7 Fn7^{mH5Y8 !do~͛Ł$\Zs5aȣ(\5 9gA7aȴ3Rv+J)knB>J)Ro|7VI!_5u Y !d%s֚I)SO=7n܈ifsJիWۓ'O}vZ{1\q& CmZk5G [2\/5&Ylj%tEXtdate:create2016-05-11T23:47:28+01:00<%tEXtdate:modify2016-05-11T23:47:28+01:00F|tEXtSoftwarewww.inkscape.org<IENDB`3Depict-0.0.22/data/textures/tex-source/plot_zoom_reset.svg0000644000175000017500000023322012270276630023320 0ustar pcuserpcuser image/svg+xml3Depict-0.0.22/data/textures/tex-source/keyboard-tab.svg0000644000175000017500000002431012233244370022431 0ustar pcuserpcuser image/svg+xml Tab 3Depict-0.0.22/data/textures/tex-source/Icons-licence.txt0000644000175000017500000000531512233244370022564 0ustar pcuserpcuserFiles: File:Left clicked mouse.svg File:Right clicked mouse.svg Origin: Wikimedia Commons: Uploader: User:Darklama Licence: Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Or Tbjs file is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported, 2.5 Generic, 2.0 Generic and 1.0 Generic license. You are free: * to share – to copy, distribute and transmit the work * to remix – to adapt the work Under the following conditions: * attribution – You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). * share alike – If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one. ------------------- Files: File:Blue_Glass_Arrow.svg Uploader: User:Everaldo Coelho and [www.yellowicon.com YellowIcon] Licence: This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the GNU Lesser General Public License for more details. --------------------- Files: File:Preferences-desktop-keyboard-shortcuts-ctrl.svg (renamed to keyboard-alt.svg) Author: Tango Project: Freedesktop.org (http://tango.freedesktop.org/Tango_Desktop_Project) Licence: Public domain --------------------- Files: File:Green_sphere.svg File:Blue_Sphere.svg Work has been used in derivative work (program icon) Author: User:Booyabazooka; recoloured by User:Stannered Licence: This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See version 2.1 and version 3 of the GNU Lesser General Public License for more details. ---------------------- 3Depict-0.0.22/data/textures/tex-source/Right-arrow.svg0000644000175000017500000004252712233244370022304 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/keyboard-ctrl.svg0000644000175000017500000002240112233244370022626 0ustar pcuserpcuser image/svg+xml Ctrl 3Depict-0.0.22/data/textures/tex-source/Left-Right-arrow.svg0000644000175000017500000011302312233244370023162 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/keyboard-command.svg0000644000175000017500000002224312233244370023304 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/Left_clicked_mouse.svg0000644000175000017500000002230012233244370023642 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/scroll_wheel_mouse.svg0000644000175000017500000002657112233244370023772 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/plot_slide_x.svg0000644000175000017500000014351512270276630022570 0ustar pcuserpcuser image/svg+xml3Depict-0.0.22/data/textures/tex-source/enlarge.svg0000644000175000017500000013403212233244370021505 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/plot_zoom_y.svg0000644000175000017500000012317412270276630022454 0ustar pcuserpcuser image/svg+xml3Depict-0.0.22/data/textures/tex-source/Right_clicked_mouse.svg0000644000175000017500000003077412233244370024043 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/middle_clicked_mouse.svg0000644000175000017500000003536712233244370024227 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/rotateArrow.svg0000644000175000017500000017156612233244370022416 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/3Depict-icon-anim.svg0000644000175000017500000021666012270276630023250 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/plot_zoom_x.svg0000644000175000017500000016001512270276630022446 0ustar pcuserpcuser image/svg+xml3Depict-0.0.22/data/textures/tex-source/keyboard-alt.svg0000644000175000017500000002224012233244370022443 0ustar pcuserpcuser image/svg+xml Alt 3Depict-0.0.22/data/textures/tex-source/3Depict-icon.svg0000644000175000017500000006265112233244370022320 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.22/data/textures/tex-source/3Depict-icon.icns0000644000175000017500000025415412233244370022456 0ustar pcuserpcusericnsXlic09XX jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 Wk@@j*q6ttة;us,eEc?>k w!gSqgx>! >z!}tޏT)֔eu"'vw`8 b*#oqQ}dvU J,#_ '3K)zM u<&/Ӣ  8{Zid24JzbC2Bj)iyO&K?J}0E3Z4|`Oߝe} tKI%iʟ5GA jO &L:I:P&vIh;I IaPveD4a󗅂 sJ9m/JШ`z{KT^^?[hgkyD?d[XRgʶ؀Z.܇%'XoPm-lS7 M7TRH{4FiyK:ߝ:ʏAx#LG=b-6ܳ4cNkor}7Fxqa%.{42J,I:P {hDkHjWL&z@_KWB>@| |4cǹ)G1mQ͑KU1_dCO"MSqƗƸhRNB4!(#[P?R ,~mL>zKulN+b+|7B)ؐj#)J)\٨oo-iqTkbcxlvD4BH)i G+]6~C埞<w5t9t =%kv q & ҖyPtQa%bmhTYeQUv0T}-/'5KI;wc|m֗>(6KuEK!yD.DiiO# .8GJz:WƜZB8DV|J_YR!P=fVt_t'nJvҹ`-Y-5%|& )3%)&_ ͦz٩5(’ g5/q&:+qr5R3>F2ݻNn1ɱ `yq/7L=Dkwido (*8B,N7)׽_$TjboiFߜގFNC{8|; f;1MGQ𨀁-E_w\ ـqW NSG=$*(l݂DQ"4  ;ۓ-0dc=n^6WW:pB 6Œ|n@io%.Qg Kn" #PHN0>'!_y4^fg,+Z@^˅*e^bNuňȝW)wAMĖ|MߦyoW6ιT>HT wy#^!?*ƠD(>tm9(t{ rhۂs&+ddq]>#FM14?[V``wpxz7;Ow21wMs޵Є`E9!R't!|:xi𜦄_~*dWkjt[C@]£qnl>:P^ՙZHQVq 8'VDBmECm]aX? eB.UI 9oL->To!!ߊ5C:m\?䓦>o1tT{_YfZ}JORF.`hZ;x]!> k$}p@=;_ ɵlF\O*⸖!"PlC g|wV4%yN2+P6w7>|s6Nb_C3>F 4 (;:|}U11431*-Vg&mp_{ol޸GTO[?ƣ ј< UCU(|O7eFtU{!7gxw`<'oVAsaҦ_ZrؐPio#6΀‚΁HWQB~\*5db~;QUdgkk<*nutA, :o{%ѡ̩Q#S$XW;6E3259񴻡374Sx*~?m? N\]Oӻ6heqS_l>Kltk ? Ay+9[(6 p2&ˍ#N>Ⱦi >N^ʑ,P[\i1?٢~ Qe&PLA'Վx+rqurC}vRP p -DYYr7, fΩ(\Kx젞ʆao N2bSܛGCM>^Y ̠{jJrfMׯO%j`DQ&)Zkњ~BmS@c:- \'rha`^i~1ogw ȠBpɆhN#݉.˪AA^^'dBxȨ&kVKسgC8('v|E-5{ws nfwںs I B/#Nʈ('>M)`mi;3HYMENN~#ٳ_2~gIz;BaadeKY5ڕÐ.ݖT1kDU%TZw+~ej|n|8rgH5~;cui} |¤K[>r| iF9[@\[Ft*gKE\WkT\y y5y'1y})9</eZ> 1\||6fZAm)y?un2l>0 f=a,SxՇՖ)>ڪͱ%zP.[6&z"S:eGr:?,?u`3!\n˝sBk*GO M]3T tvfE_<'?W{} 76(+`3%i̲c̡gZ "IWi^`ZdžaDRQP_"kIS6b2lDY ff_8>|I,kZ+hųi8珸 h,A'B:?e0ӊb K~e>(#%՗^r(pD:`\ lH ¦H'D޿+s-)b!ޮg[s"AF^" 1r֤˪zF>Q2dd|~)"]N$—58桵{MQ q<_ "$`ZM`e~w/Ԥ~6;|ECld? *sƋH4S^3jqYA[&B v=0+["T:i@dITrykg5 kNׅt^^8}PaUnK/zCiV҇SN+f5nK2Z_w:s^rA ȗ%Xfl0XMw+ $r. ~$4R`ԥ2r*OgC*9]ڦ,S8,pq$_KXZ^+7A+Ix Aѳ~@giHa|ޞtM߆,sڸfOs½rcT8mBeB1Q&󈐎؂#o/R) ?YI6ꆘ1WLaF/q#ܶ#4_)l-*p4\\\ځ:XBE)ݑ5+XrT&--_.nR1%BDK#wyKyߍ3&YRL$rEA[,=["dUHyE.5EW"!:dc͐E̴Kιh=idf#F&' V5Xzbhe+JzΗˣ~f8SE(F sr++z6ׁbrkpЬro꽧*A=BYϔ:-SbKg{\p_{:M{qĈ{j⤗dI5-!LOiU, -J,t㜽V2AVmBZ6'w:%nt H` ykK=l6 T殂xA {F3HF嫬3ieM^# 4KTdJORvceyU5CC64c8ؼs ~5!`I\ ƸwCh7S'æ(dW9t#FyPumD"0Ng*SCnD<^irVr{9dJ%ڵ??.LYiP͵~\`5{IS)wGǺQMSt\*BIj%DĬul8tE4I! {N~Qe;f~kg`g%%^Ac1mrl1ʴ6g3 aB%̺qwAñwh[p.7&+AϨ{Lm n":@:E'O ϓovüً2GO@[=H' 'HuvEGMyO0Kʐ:]h02)-$:+$ .H7Uv=bN3fx.b5Q-kulhud-7c/C(ȱM~Q|?vH m'GROTT~hX߁55! nQU7e_gHE`Zꨫd̥pp&9"ť"B-UO 7Eɐl&1w[A>VK-_GMAH% !J JMg2?g]exv{ 3\/#qs^~݉_2Aj4]9 !~2¢ .$$J@ҽD7z&]OC擥#n}+xȄW:ѵMY kd/c*?APCg_8OB!{e&Kgmy'ƍ_xTY{ A麷GR-UP$ү"#CSK+;OVf: 4zֹ WD1>6`|> n /^FO8c!PnWͶKuin&lcU 7'3XtOEX^e ! 'äZD;t`cpv3mn9h1-_>vb;yX6P%K-QP`[MIO8~9_΍btZm!>l2"jj|j1k:9hQYix$xt|VO<2"K ꨘ+:m☬&oQ۠fT{cV htf߆*٫e;LR^4ʱNŚʫ_(fg,E=PUk ZDjEG8lg0A]}FI [F,CÏ 6*1_yZxp[QT{KͫBś"x+'ď7?ԥ[UP k2Fd]>*>: Xpn'˦f6G1|πbZωL x8m2¦F(sՑ5^x*p%gYס;Ğ _TKeC9yL"&e|`7nG( FGYh\nz(D&]9\v;Ӧe;No5cJ` 7&gxoܾ^UTqP("ԧDߋ*eCI/d_ 0QxWLy9ցGsr6~t5l +`ߥk?V2aBAu 6g /;qq?6l"ND֮.s1uo~~{g_0Nu :pu{h0|| gg j1Z74!YC2?s~p7/4 $1+#W#ILiY]1W7 e0yA<?ˬMy>(U.[ ?:<%x{#'ɦ/@T1Ćenso\6`dI<§&P}ӬT L6Vs<5VoQʨ©JqdG]Vl"rD2CEn(.~Q@v[qFrZ^t\L۴(#r±o P(e-RnQ$=!Bs2,E9/gʨJߐ[UF5J04*|ˑF~Rɦ8쓏>gO>IȕhjC])IJ Yxx " 9 ~yTcJuxdd}Uka !E2"R~@x%H֣Cے3q@▹SkX&fb{.E.))./oǠ5gOʆS_Υ+1Q4n&;A8?UbM_Xk'J@` PuxtUHPT=\%!Q0uLsJH>.´ݜ<%ޏJp_1Q@  1W^r&J>heGF!8f3SȢl G|0PcdL[ kR-Rl!)M?SalӵO7TXw3$LE%6D5MGm"У.})tE8M-*NsĿSv*K(J#rZ9Aq`]E0K3ܦArVFOc?ԕXIAa{=bI=(;bρ"Ex\DlҧZĂ=]?RI/t#ο^t:h⏙nv3{57Hon[cB?e%;k{Yg^b@hc 2A@mTZPm4yiֆMV${8qo%{#ޟ z#ođX[ t>aQ!D[UxM3^ xָsҳtXb/y$iYn B2nО6&>UyRL/\"lGR^9ME|̇^W[6usg42@GHY;1 _q4H8;dڳ}_~ퟲ)|Wyr݈\w#=~J JpP( =@2{<35j 6Dx\?=b @뗐9sa-hMG-,烔/auS}ʯQJ0b҇Xc8] ͫ,1eƠaS +鯸nT#1$uegw2goGek9N) .->&+Z17y-gy J5%qrsUfXu{q?p\2i)g>e14UA?󳪔+'EUr@*Yr^Qv4)ܛO*ۙOb_Pʢ2zM|\n+HE2$؋]d?Pyϖ>6#4yµy?[+.[TPUV,q~TU;Rf^KiUKeA}IE}Թ^~@p6WQ$Ue3@h/Mv%f )o{8?hD!.`Qǽ+NGǤȒӫ|O޲B翝5ShfF*#<^k./Ŋr]Q(u;p۪ǥ+Oz҄!Q%.zo3Gn2ɩE1d9o_uho6C?dj1qt*CSf 8\M/RPJ){s;-taX Œ}+.irjg`85.y W~C$~C9GD2dɰ=|,/h7UR\O8Fv;˷oFU> ^i~38Nf[6 u6Ce̕kBY\c~%FTeh*-ZR򜰆m3+9DUQ\L|P*Wnm8 x[gP"ΈtBY,%„HtP̫9TB8ٶFzcKo977U!e\Nwzho_Z dY ؋WjJަoiU!.{8 tNjvk{ng1[ hјM@]C朿 +>E(@k؏ԯjBw0vV#<3yFiT%_\6B#K% Ȅ?uCttqG[f$ i;OPC^;X+FEq=v!~'|dEՀ򿗂{Ay]ZG*n#GqW%EW@s<得q$M^6ls7vxhAwt8ԍӬw}kѩ9]fP2hE Ilo̊1"Uiv&yܭsFHk xa"R/A8ݨt)wP!LJ8;i1n}CuDaNA!&A{r IK5k$_Wev4^|Iʼ2vieLB"qB2NFGt=A[e/BP:T`N*2^[rkKEk Z@%{`;T=DW|/6 qF۪*Z#!.|E+ЁBuh5&kz"WqgZS֙}^JDWnfU<* [xwM[`ԡMeƿ-~1B2冟yFRwA@'~ La֙2\z$twlE8'GAnǣk]=1ep"סA-::If$& i7N揕OCtmsހ=tL8J/'= AumK:QZ OGό)$κd>UCy3E|XyWHPlJB(0U:4do :.~nn(]rzWq7mBaN${?R Ք>޽u~_4RzC땇13d~Ir@?cԘ pʯ;.$\a,nFn_,\GsNaCD8El|Z&}nSWOp һNAbl9&jnq<)a%R^ʴ` пɛخpғ@pdNFN񏜺z e@A "MX&m^%>B}9oz4C ]{Z%XdȲ@-a(k<-lB&$*2 )!а99-}M->d_Uxy J^|ߘ/ZS*m$f[+ ;$i{hs>2nIp&ނ8W I}:6rY 6LM9-*><>qU\|ӚJتX qg€&&4R[FH;^ ` kdR\iJcEZ^HD0[~:WwnX8L$3fj^)~Fޖ~ ?yͅX N$GJɀՠP"Q6㖧z^hأ(*Q] ;S1 ʺc:v?u)Wfxp1 o·%RV^K!n*tYK D4d_UrIZ7Df"詘BSNecnk8caEw#Ym]7?DW 5rW$n9 ij25!JcɎNhx;/oO^RąʣӲu7Ul/X CxfhD`hOV .8T9/jvoЕD%  @Odob t0Ϫ(F_q)ohE8ux|k'6ֵ{Φb~υUxb)BV`=nk^CNO]K({,X]PͮB f0/~9 <{;cOnehQ?6djPrz2B::W\Ot p1*MQ ljh p{WO̤2؇t/[4DWXJ~z띥(:IYmǀ6Vg"*fw .OۚͲQ-4o$;[沢<tPJE.rȵݥ 6nPj + X-] oHnΫWi+-}7t{T;yx ˝^}E0oX'6IPw-T~Cjqsy "tAs{x.{R3$&"jzbg2Xm'˃@ J6u[4%'RpD"N{xuX|9oNgfgùMELeSRq6$`A1/.x4Ƀ5TGxW0Nf"H ӑX]\ t;^Ƭ+jrgT~Z]`rZԯ| ]uVcf Vmҗ8[0/8XHqi Gέc# bSh#`A.xJE$9^3kcRLURaiqWgZp\C~HyRzLJ쉕 R^6Yjrk*i0PӨ;|Ӓp8Asw 9L , #@2st<1 [(/kh)lsbtʬ~@T:ίAÈUq)N1Enі@*3{\X{+s~[µEf-S}9СRa?ROgh~NƬ{Z[t?s礠ך<AWFQ xImJB " |]b48B )_/Mu@\2  P G:>2N2rݼTTlgNTU Ҙfn@d-%ϾGyo{DKmaz+ \hJ>=\a]RdcJKW_]M'Y6Ư"ybai#\^ĉy bxD,'"۠kX.Gi˙[#U>WSe#Ok7zaLq3:r=4{tTw]7z&k75WX__}6뀠t1ԃ[8}A W=s@V6D&K`HOqBWһ\hJ02XxӴ{60V;?\Te8sJ;i>l/yTc}V;j*6ZtAuQwOm/{쭖1X60j\Sa<#fGMDhaUoO\/SJVF_([3cv3! 7!lŔG0_G3IYF-}. ,~ tnS@RT(K}ugǫx&jH(>0p^h!O~su?&hq1nq ]$`XrޞF_&6I'F_U>ctn_=6u>78>VTPN97<7WN"1Wa864- ="w´hZT}C['K [m뻛jSuw;T>kzCW?Yös@b*uBC٦i<wdNK{ڟq}A[@:pι5TMxm8&棐@Ð7o< .-4WXq+rJg% /,A^wۿ 5H>nrCeiBZ';@ o\ዊ ^mXl+*^{)OHX kfKUyS/f36ICGmVAш㡴eR.;귖s̼F]bH|sCQt&*1|;Dy r}|>DZmfueVh5%u8cKGNΜ[KjI5* M#&=EtK6h /I9uEHghImg3/˿xtNJj3|T!"!`^whHdtmx .lT,IE {.iE܀ϕ┇XUQ>Yx6ةbA!( vd`I̝1\nA ^MC 4k0BI8z@T롌 'aQq8f3CTc惏YʛDۨABtGa Ţv3|{h-6ܧF2^tg8Wj y^H;(N Ҝ~(4g>ɩIJ"{GtW+ٕ<=)<Ч/&"1˱.B1dfp), HߖcÂ~h$Ko}ciI 'w݆ LO p-M4lH!13~;Z@pEzR3YHd: ^ܢ${`l\XSAt*f|WN4ޖ%L iئjHr 켎~gg%["fi+=qY= (,2ƠʀSGt{卤Lmgؘ1` nӻpY),jΞ7*p> 8$} yذ)4.Hu%2.ROfI-=O<7ܦ$pS}8OWHj:w%!c.5װ-!CEi$nߕ,qk'zm(ϝ+A+'_+ ddl=dI\}^w6l%Z4S M mIhJ++e>䲙 B!tjxBmFUhh]e^5G! PϒW% \KS {I3d[‰!*=-_Eʲ߇Mrx@`"q>EŒgbBYfjN|ӮfΧa$@ࠬ; ZlsDz7R*ذ׈5,<'RP))\$jz,H;C"[۸Ӡ짜*Jf aP,V#y ߇W k-%sú~m5KGxb3cXV6ʵ-&3%ã]$T(A>E>jTHAKz6+a[ݗ(Fd4\D 蓮Xa_jM& !z8yv*r>Ba_|l*Є&y7ٛl }_%/Q$Tnֻ[@fc)5im6Zv[M=<vi UG^Ko, 0x_H!7g$GIͱeC. l4O3-u^\vY!3H`@{!_\' dS4гxl`@k&f d?)#o+/^mbhDzqbBqz/Dukn _6-:979a~mbt;o^e7_\v՗ p w} QHqڌPSEm4 M!AQ)T vZ6X4}jSY!W~ت@Z?P LB^څj?tP:&M{Q\=P #Q'/O5eέCBZ.N"M㠉`5m 7֭rBn'mmA^aY/ } |vr4Qߩi{noJ3B}9T4( Nbv9'f˞oַP>! Fj5BYlcAsȻq> OpHgˊ]6ݙL6y3 )}R:Q?sPWӤZh'(-F.~~|^ſ&`Ci;E̩Oz3Gܓq}4a@F蜵 D3>o^~9\_S?9e'#-رQgǍ^sȲ3'Ԭ<@靻6 #YGʱتsQkd$Ŷ]4ؠ{lK5<*M@-2Wֳ ?Gvc͆.vHz%ܧ" eU/5KrƁԷC&_[ 鐛#. k*۵O˘̛Ӑaa K+l(h߽EŞ%R.â%Vi fcUOC y"H`kq1h݂m3 ТǃZGnNey#gmKF" J1暰K8H ~`rV?X-`y J)^{ۚ{cL[U6Ee@a~QK+lF(4ݹe7ZͰKm+KnX'HW_]ld+;!r8A8MsG;blm\oi)~cwݵeמu]4qt9NX14u[VMk> u }6W4`oI12 G=EeZoьџꐄqT*ԖڿxXFp|>b]/&&zg/05H0ei88Z^Ĵ؊EKt28=v7Ⱦ\A4lɶPs p?ܾ_8 YV4WY#nNd2K?)Z9uNcbb؏"h~E +({M|hVFޅp"v)FkcͤBgmycWv^nv]` bKHF"^YQZMƔ(D"x !&U]#u!~4!I=D+]p\aA?[2@}\2_qBL:^ Yuf!4J~>ѡȊ(E0W_ͥ|(~ۃ[Lٌ &΅WAjC[P᠀ ;2R?M,sN%K-keʃqQCT޴^Q︞ yQ;iE. |p+>DN:zxG5OW;+[&l㻬^"Ҥq8ʘZ)m$(wRih1=ˎP"qHޝLe)-s6~m͝F>w\VvJm9'Õn#$v-_{5Z#)PZ>ɤVL]~3N /›640={&·jC0u%8v;yc+siK#TUa; u5?s 6[Φ0 ozǞLp0P[,#Ѳ\/I0@a{G*ɧd.Y/r0<)*0I`XqXFx:{kd۟B$ \ԌND> V#V2=.nY=8@>yəvccaiX%J GS VrER g>:P?%a4)2; ;D\`Vw =bbs;ųm,L|m֙Qg-cD#ۋ?O<ѝL0CFOwV AƑ=bWu: Cve'mU繾j&Y0m}~ˉ0R$,p4)*kTVu.]O@b<~5;7UO)n./[X3X]DM5dJӵ**"B^3Yz#y_d"곉U}Ӗwr.GJbi$lbhQ1/m[kK%j$VWK ^֧0Pakީ1͏r7AFlTV!-C&<\, =ߦ(ĀҢaoNT&vJ[VxhӔZץ=I!-ߤ h1H`%n鴴fp vsRa~xS(k^!U*P05E܂h@p4$l0ǽ0Uu+J˯&]hڅ90Qbr (82RV Xf:-ei-P $0:oO#S+*cPӌ/p5;g!zaPv(DZuYhzgD#hH8'e޽؈zHWD}@rr`bm7YxB DFdi)3&u]qdw%je |ZP|h^g[ vj:M5)iz_"o n,~:q4PRk U,Ka*Bnm|na4h5R%(/OT"["<ʷo!oI"xIà|&I=\ɃGRQ>4m"S#C#7oaYʰwėG*A+r6$ɸye֐"xҠoPK5 ma蛂%n'/gVuuk H"k85f˧ˌԍSE?ll~J4`AH2T}KϽ4{ߕ"B'øm5vW4jC ;FӄKHj聆(Z+M COb~FH 8߱T8|\$W86tд0ԇ6",HMLGO Pfwn bH缠?[ND1Um/+W04Y>CXXS9b:fh\A6HV71e臒a, 0b? B} u#͔!SMbu(I™SéfqQx6>|V?ɁVɳMXĦr)dL10_phG`1Q5Z}]U7"/K ɆŶKLҐY2*5TPoۺ %Ug¦bߢmH')\ɧۣX?9@E:0t{3+C&ܠFCh+l|-n=6g!o`6!vAn.43sE+g8K7S%$*\`]aW^`kuS}:ݬ'uO}ncu[}o@w۴`9G$F*tVs!z'UCs&oҊS%wvOR 3eu;x%^yo/&SϏT@-3K5:*LPdpE/O|l|u) d2ӐtbQ鯊͜H\!7 ֔h1ީߘ:BW3ވ`u}f崶].y= 'x`O9Ƥz7c~<^ƣDwxJho1f[ c:;{+$l-aR:'DD2G& 0gk:V NYfM t+\t…v];D]aGCiXsSz0Lp.A6_쐧zeɖ$ÉU8t\ Pi˼ݰ'|rK"7 ~uT\2ݨe@%wE= YAŌo탑GGO ;~Xf,Dis/5{eɛS8 -F8.;75s2@I_6R[zB`=K&cn{%[##|Uxd&pSxzu%'bҴƨAZ6K%PuSC!0)sbz(Uns ::<(NtrҖf/Idg"P9aT`n1t(ڃ ]>-EgN*P~*ŀS P2fl!{bG>^ DŽ&U%yC.ǔ9"Gz&PZ8t=5T%x"Ǥ-Kd]u&pPT{p˒3/ːECodm\PIQhi)εM5lР-i=EkOk<z9ohl% i[zd =#{!-@I#"e}d2K7;IhP)`bQy12(G#_ =3 ;0!՟`xe2&|p@9G`vO_Fd,`W'tPE8V8fj"{hJJނ 9"or4MVѦ7V+eA3,dzz#2ov2.rzjbazVyH?)idcӝaٞ/8:JgICZFlB24AzFyx"sخ./NXXk"͵mN#t =FSnVR0FdsYZarl4D(fԇahٹစT\NfʄnVg6 S#yh9 ?^hO@7=zyxz !ZT%ķtB9YkO܀wBZ4*K~<]_0X4 h<3JeQ{~sg֍aRh/dٽ .0Y\v. 9,ԛqIiVaS齟׮Y!OWwѶ }ТV & Mz0aWW[QW<ӈ@Ui~7?:|]".xE?UsC T.̂#$09dͅuyZRSfeB-#m'$Y=0 Pe 0󺴪)ݦg:nٯF\XC.pǔ򘪙.014`qqɃ.ȥ^v$6}PaB)wҹy()D5Bm/boM;!5;VCw@ڥ\"3Ic$[h摦X"DC@N1Br6%ژ$2اX%zLV|>N6jPE+a"Ly40\pRYE0=,Zf]c,\9zB&M#⫀x&Mӈ;J|`ڙmM˚R ~nP)?3'%9My>_lN#|$1! !:rf-CGȑJ+<}w4^8;H2T}Ä2/4o6v`21VzC&4 /=EP9Cțcyޑxp-kGW̘jR]~ܐjjߝ@{AO75#ۙ Yܻ#o3?][IN*I UXD?7 %9_\B2-,N]W-r:F CK8 5v&ruoj: {):\ka۱#*'vE-Uk93~͒"xݐC^YU.>Gǧdwc-U'njz{h1 s04׬ǢM-#{H}?ˮlim fxI=n4q< 9d"aZrkW^mUP& Z$ Wf<+{6,\&x,3IS0+ H~4D3jm)"@p]f/D]@:eF,3"hè s'|}E۔ '\BغMmн!X^W6j}?gnѡɖ M&jln7^ m}+];Q ]*嘏QQ* =0C*W鐹n4xhwDԓyysjb RTgfy>kܲ4,,#i4toKUG+N(=شlBpjEaOU{em[Qnݶߛ'c+^xV˳3jN4vɳ)Ƴ腙4qAB{mv%՞^0V#;ɰS K3[HY)_!0GNM>?x<1y-I{, 0_G1Tth/c[1=ӥFIWO4^ztBQ˓E6M`pg-,KIbŲmϿ,|s4lGT<~ taJZӵ֢`>Z qyiw&$lp;siqUtu8=kxX0+}Tdh'ʮu7jlogBЂ\<ӟy^${\jJ#{L'@m7N8j@;DIjZXţT?4AAzu1)7̑v)n?5쐶Xo7Voϸ/I*)HHmTO*e@ ޏ# fH)sC\%[{|ږ6|R*᭐sӿ #~Ś=z-Lu‰pvLF<ɴیڴS;O[9ڳ;(y6n'x4UbJyXoh`뿙!)RN{3qP7*+ݭH>&Q@WF %Zũҿ+f f=KG,Xm4QeU()晉CV^C6hqô|v|rS/dt9h&ciVz^LVS;GLBsڹDBE lcFg;Z(l/? uD.E!EVo4-[HKnQ ˞=.LU~ʇtywц !d$ x&`'LDMLAIV#dL\hЦͶ;w(" nCfm]a1IЋB"OSJ) ĀGv[nBZ+VG,!lhț0k ex01dFµڳlM!.?Rڝ@ %.-9H] -` Ϧ@/,`#2.%FƙD`I~WT)^dGcǯ o5CT(7K&jQ)U)ܖ#o mNz$۝Ts0xMEQ\(0 4ڣkH ƋD-ϫ\)a,-Q̄ae|lK qoWIi^A}#VBȋ6giԵ@ ?5z͏y&`^\jp_==BAW 5Stp/P] u"K,@JJv лEOlGc `d>& @ O>n== !U~#iT׬]n+&Zgrљw+B`7L-ݣc#wͪ1),T`кK9Ƀ===W7Hr(WÁ0!Pt&>L(. LQ^L~"tF%*КĜ;⦐lB0|4_K9dR5Z8F+uT&$Ih`?(/ѣU$$i2PS,ťbb9 v7_r g5K؜4rl~#A zb{9sꐌeG55&jfؓ+QZsy \8^5ij!@E#DXsөely?# `F@zm$ʩF u/;Mi+g/O]ȚGlR m_ƷCylw->:-[DaUEwp=e*N{\ljDyt 31EF z[ޔ?_j/I},NwۦNGu5IGr@nn/z9(BjP2&l͎T02̓ljxӴ n]xHQڡKFX*ZW TtIufEw+-}9^Z:C8&ޜ^6 DѡMuAMo#)x?0('L^nk@dfV!>ZΖu3F_NƗ<*mS`jGK\8<#M.iNX.t£S{/k51aP _WW`BYN=%R^7UB1**y+^ʈM #{1b`gЗ oU߃Mlŷ.Izb8qR7 nHdp= ,}\m0vx'{ fJt)NV.v]p0}D {DTժ8>?A &ډ[]؛iaX9WeP 7tVlz8|ڲqVF̰)soxK\hjcvx yRG: mFn}X"0h(eY2PJ dc'|/+YW5`^Uw1T=VKO)E"з 'ϟ?+qcEW*4h&ĜqH dt愊D=SonD-7#A 2}xI{wJv^]Rֿh-\VAEwI"?;S(2*mZ˫u>vDk`Qr;;|EQ_F`j SW)^'p㽄SfCh'2W1w'/'w\Cj6U_'}ϚMg&s."@+UR83>#6r^'^nna?f5M:6NdN 3b;Ӝ<#H~F:= #&Hl#Y Pi9Oc(lq%̆fK+~e^ޗ+d444s ;0Xj"ywbU7l1 kˉr@6CVqhdABtMik . NBIFяR LqoTg3Ә#]R!O"N .4ޤkPFԣ"Mqfy0N5WG"~^p{+oYC_bkKQYqP[;a"CQ^='Ƭ =ZE:SNYI wX1?9^ؿr!{guj70}\9 o2DqG[]+ : :>yछgle[)nD]#KwEy auhyyH4h bAM%~췴1)1~c[Ώ3& WixLXq^,*Q&$ui)bɫPR%׋J$x}+Pd {Çc[%tй:hU6GjeQڴωp"HT#ׇެ60#ɯKo ]7ŎDYg폾M9\AXͺ,HĀ;{My_~X/ݱmIRy{(ji Tk\e.-Eө4xb`_APPGl0-lXof#H JG{w1gΆ*Qg(D(sZ[wl'f~P/%@Qwc8ΐX sQyi[e L9?kA^C9CwdbvgSi|q(= \ciZߣ؇NKkۺ YN^{m!uF^zr(|z Tn [~CRuT4|fXdqGu- [辈]td 6v9 sN{aGUgBr;)E;Dwo(1T^Tv+P}p_%+O$m!J)#Q.2Kv[6T@{<3ӎuJ .!nũ6oۭ&B $l$IsRT?FmdSlgI?yu@ÔjX +(Igw3r<މ TU b]޾Ub6T:5v>ױxn_ 2&Az@ jE=3%f˧%HXYVPS]p>}{%+Ad){BOQby07{'xxmNV;U3 I5dFBϘÆKm~iذ~\ؒ0)Sq:(lkRW5G)` Q m,w}jV],» a]G>A? x |+ |/O:=Bƅ~\'<-T[&,T ac(/T'c1bp=. #acǂISNq΄'7XOo$G_MKB蔑mG=Vj%G3Σym]~ #aH V*:VD f佢TRR AH=Q@'wΠn6Cӟ pS ̮fK 8sPAA[GT .䫄SPUQ51{]6_P"wfs< `330ƲSVT>] y1?jEKᒩ R`þ2j2/MǬn]`i5n4&=ۢd r8~@Ŝ6i1?Ug2ߖޓA{%$pU4E:>0SFibbbɲCj2%xPcj)+G"{Q\5-Nγ(@R & Y8@J\xjRкd*#uو F^Ŷ;Ģ;g!`bRilXEa&Y[-KEvxρ.6Hl_&6Nӧ:ǸqN9.cNP`Dr6عVU8^!G#Huk+ubGMhY`\E"Zw,*DDfT~bfUˉ ﬍OYQ'," T9UHpfZo4 q0_uZEhFxtGUH,QzB0͹JFK$qN2gVeeq+k"%_TISzRf֗N[ v-Gfzc'Ȕq5&9v)oPDMT=Ai(&"p7"l;r[?D2DeKI-d$y9;43| >#~UC1I>OMt{{>r΁;#ۀ^(, mGf1ψjMl&io:JLlI *Ǘxek9$~Q6ӇtCZëƾyw(7>U@bjZ9.ap [P^ɛ<_%U>ZE}4/aZq{U76@sR4)9)6*cGuC:%mjXy9 lkT{Fq}i>meW  v2$HOCɻF^>7WCO7ee#9@7'Ue4n)΄`^Ci %gb{dKCs)gGsOI ޓ%+BvNgw%tMxT ]ƃuߒ 8)2cl` a elq7D՟MWW g۟k7;iNܿG+MD `ai提jvFt!05DMåSV1)pFT~rs-bX"|֩ky87;сnR|Rqe bҹ)Odܸ$GeЋ|rM'E19Bi1 NKf߰͘*e/7)X䖎pKB&JL_R!H&b<޳%\{[uAV$U>)JEck^Pdp'Gzw0L-)+w(iUT[wj3Q/lچؒ)DMЊ̐:h!@:3F`ʉA&b:(6XV=/3l} Atb.Gm K5GͲHhA(.2ߍ`;5-W%VBy 5tN9ATɸc(Y6j J:Mt#s'2QCzrD\"ZIt ٝ÷滺sӴq{0, 4V`c_#ۏu*(2e<5EsDdɬt|@ SJZ ZV3tٳriW jX'#SnFPTys˰[IIo9M%k L 8 V#?g}6ltnUKܟ9ۢϿVqz75lot}]?[^%}CV+c/?E?ndnO[:鿫`c3tJ#|)8,q-߄Q!^ شa z>)t ]+y_^mٴ};H}K!HMn Bj]J?v {Vd^K ){e%&UOF*w tHIӡݞa0-ȅfU 4{eiwF060A";_! ?m+Ԛ9;m45 rsNRK&J7wqa1:Lസ€\&]8Zbt4ʗa9'ԧN P:L+:۹Gԋ;#348VXŒH#2H3J2!=T=D'H'P:.ͩs3$RX*Yx}qZ$B Z&0XmjB3u;̿MLBBX*^Kۺ陋<Fvo-S K (֌ʓj.0G4*Mmo}bucK\ւ,0(.!u$;ƍ/MdNl$H7-qqh DSb\ҽ(o[I[!@5z *qKz@$vofӰ]@Y1d\'irsٖ=.0k0 `뒕1% <N;WtYWAxPPq$oj9JUݒȞ< ΂{icDTE{#uOCf/*܉V6LQk'oz<R_MN)4 Opu2mՀ\kUW5,̏h'ߚUnwq)#-&40a_nGO&^5 u#I,Hm5G$pě4Oz^90CkTL` DG3;ެ=cݛV7EKi~pi3٥Xs!ϦN+fŐCp:_0l!R ya4vYb+AK"/`Wpe%lFƎswRs]ԧI8gU=^[TAظT%@0G1 F}vؠ $OfrUiᏀN/fZу5sǃR%Tb|!SyQĽGoU΢ػt$ojȊP{d'fbSFHb!*7P0g?UTL'\k&,z܊~C=]S`hԛՃT>6AbT6Yfυ۱x=R:` О}lj/\I ~6֐Rg?Xm\[vꎛgB]UUIݻb"{m4Y}+=?H10{VgkE0r)\.ltTĂZV Iz{PH?8ߩ9JF;ƱC.f\䏬Tꨑ,D/#ZOF?餣-yO-EqED+97ί[y+Pg4қ]6? (lXDwwGB+8νlk5\-d!W>Q/eJ 1jI᳛옧':˙sfR:aQA8-7X}Sj^g*"~X1-<8y,r=fpC~B$5V .7E oB$*;G &UGNRaTiiIYx$hJc ?7 ^Nebay7;g#3sA!h~ a֘:{.S'D7e|@[CeQ5qַ>f 0<(CqG$ēhs8S'} z1)ݬ^ \əwc%hnMQ@z vfӝ)2\+J-2Eez$v(VUɓLSX5nUiQ8渢(~w 5)-铉U5x_H ?հ_{췂FnGEkQ*04r]aSXMK NogFsfK1wy2T%B*O)H3rӍ_+h-< }jWk4ӗv ֛,pC-USf#œ/%VzGlhp׿KӐ#} uk?/ _:v3@N!ZZbbeT:o𕋌C s:ˍuZ Xkj]`NKz&<{ffls_R/>:W8ÄD﮽-+7 IF^"0.pO|Nͬ9k|逕9|Tu#z3J#Y#3t8[J2Ic^mI3GV"XAqжV />4 nМrLm j*mhk""m2{G$%OU/6:L/%tz_b.wd;toٺ~t8R j xRѧ(t5O/lڼ=F4_c쏽Yjo{YupT Z*GMM aq;0~ȝ/YlDž4i\']-uHTX8D SuyT1aPT -!2:lGEi~=*)h B1HyZ/vx}* ˵N3?P73RBoRԖK݉z ̙ GWs =)jv]mgIuP[ tBFddt{/|h A@5k>GIzg7oHFU{*.;6mw$|Ԫ#[# xlN~5*<@EE2#g7JR+uQ䝐wqMyfiEH+YJ;߿؝ZEjçl]^}3Wߦd԰<7c:eDN\&;]9*=u4K;[,-+Ҫw^0ׯ)ijjspy?2fPN񿀒zPz~ϜN+̃wDНY{dd4F@vvA%U8`*uV堃=OiP-4j&ފ\ C#OI K/k&,wF[C`4IpD,K YPrhy62!7!z`y@gLly "48(_iBmo.^VBsF"bF /=ؐg ͺZ':cpK¬:3!&x:F%PY9!\wY6!s*dӪ]r *ƠIv!Y [?7$r60IҳX`,Zxn\KUoɉ`; 6buNcld&JN3G&Xd:_j=Dx%GV/MD3_V&k瑏asƦ{fV13LuJNC^Ok4.b*mȈpg@V!ȶ)8Aߙ2M}@"R(Fz U}szuPZns՚&g1-/$ #STNP9mEXu`x~J]ij|Q7μd[!@#pd )">>ze?> V77-7⹬E|%n[2"),WBU VL@(Fk\2x[<7cVHVDR) m_m]wkB86>Bq`-mүِη_&8y>u.XG_:cl\xZmhn]? Tq3H^ O(Yio:WnP(6mTwD%(9eF\qNoW?j04DyǔWJ),нe1o@L-,++^JpXw ^ ?B+pźueI[5޿;8$~fv/aIAl8K䮟(ne!P.fq$"D=ys3Y;-!*T;䐫v=Oe4gr49 Z@Ii>t؈SJ8ZGM޳< ]0y`CG \t03Tvg1@muR-O d׶_Xέ_#uZCD%I~bUThCcDN 5v(U|VT$}4(ݫP's)nzë!uEe(ƢKt=֕ uL~ 7 w$3ElhXG`_u!)jee4J?]ӈp 7㝌qjkpnahBצAl-oxڑ(w+A)y%9R& &c௃bnd`ˉ )Y06eB{jf7:^\7p'W`%29KKdwSBƱjav 5aA>n褚J+Xl yoY/-sr31t SXU4ARMZփ,=&]K[BBcE#=43I|qhKJ˔B,=$P=a\SB^bʂ@CICм"T#lf\@@YA 63d25P ^jۤ+3*/+RoHTޛK-KYWdWCY7]QpwB֚_IuUC?Kg[25C˼ {S2ĸEn1x&&|*dSCV1f_•Y{VR".Qީ`|ߗ]w~6.l@l]X"X?igU?Iyk7=rΗu'6z0 m_}6>Zfm{$I0e~X ~DȢy}a!Ϟ.4!grZK>yN&3^qfJg0;[Dq]'3Tq*H>ڵ_0[p2 Rl0i!(;,ߡAvЛQ夆KE1 ^[X~31<0uWfLltG{F2 L7\9aJkTebOVΐJ OH1 ]g_yR[&*AnsOsC?A@C+x/u4>89PhV] tA#GХDj:趘:u;1کGţ82.'Q(NYTF<ܪ[qSp߈(XxJDRFA/7cbX_2 aV#ٶ Crj͞$$dkPA@2NwE/=t9%04YX-+(.B/LCOp0HxWWxyB(v:zߵJJV_(deGj^a|Q.jQ/|%MQoAXj ,t,Pwħmkx*|OkL2Jy4hg5Gg>}o\4}ɁLuHQ-SD9Ir,h}q[  ./]UY.b;AtID5A.: ?/W"(mTu)Eݬ?hǦ'N1(W476gMMzsNTyHY&V'u0[2+ԎP;(^"eP6,Ofeλ6wb-+#\P}( gTFH)/RocVO qbj%cGfrz֩eݍCl@ai5 Rz:flhg,w UevQ*ֶsA=AgSo|mF88$#|z;LZL=KNIK80lgAE0wTp &3*⑹Q3(oؘkX)tΕVnX煮DHW'o!uqtu)͛RQIqȩ[&0ES\u+-5,R>}S>lR*:j^= ٧[0hڥ!ZWKQOAhTUIɀFJWis +B~A2v33I8֭H!fYGYA6-%Jx$JDX9$QvqpvEAuI dyԷmNDdi ih `QmXE &yJ@L2r8Ybg rdUӻJ諰 Bb`|/C&4Ҏ n%bl$!̻\g86= fbOhɸ"pGBY*TF6?…pGLġBCE\Uw,CZb+},r?sꀑkhvj)\L0wdIqr7`7|&_9odޚI:^#5^sm0騀%Q(bI%@I$sb3u9Ν<\ހyoЮ_Qo[]|ivAƅ *v'Y8^7:ڋ]VZO릊QtH9"e4JeBPAb&.ŧ\"7*dk!: A8~N9ߨ\Wc cuF={-cO 1ߪv~ǩZ#VI݀+F1- gA"Gޕ'k*f2M"'! 9NaԀN|ߊ& !AB%Axoеa+b՛($ Jf]!(L.a:_Db{[ZnrtHf8tP$. 5ѽE`?4CFKd{=HGϜC}\XtD_=ΫN|":*L2Id~ 6^o,r4>cT8ws]ֵ|(#$?{\W:hQȸ?lr}A_sp+mZ qa -{{l"9K n?u}>;\>VދnYcE)?\b*V;@iyۗT`E;덆(hMflBUf06X ۱:9nh%IQdWƐnMͧ)9ɸC 35AW u H'pOnT ;745I xq=A{U՘]f6 f3|0%;8?.Jؙ2&2e.[r,ONdP Sb4qf}E.F^W:*yI}b`qgnnUT.‘1qg4+wa:eZHӀC# Sk /t!vڶ%cAMȋN1ypFuVLiL˨ U{HYC 6U=a0t㭄1˗L$~N`wx\H/Af/&*4(O>b}4ۗOwL\ 5?ڶH úo(ctyXLDW/|.nJ\f Pzij[ ɾݶjdh.R?}ll7c(XQ2I GN*"N){;Ŭ+va! Q?w!^L.`GЎ ΐm%GQ!(>Z6%uӷא^BLR!)(1WV_!p#:=gY^m}vSrGU5bBo ~H=tL@*:[Xcݮ-[X(h5&o38~hpHVauEReYR @陹 ެuū?9_0MZԿn3M綼^~ ?bw<98i*cZKtŪ.[~įxҵ}U.5Ӆ֍:[CGnٓHE`|vݖu7·ƽ}*/ 2'hvVucxblt~:ZgAw)S.S db!v9 fQQPLʶH(rey{o~Yђ$iU 1m/kr;͸8!#qdQGrwv$ *"6Z] M8.4$$t|6G&28s"8Ost}ShӠ!'9OrƉю@pJڢpf3suMb#a!u q 6,4ϝ"Yq5aO_u2`/&>4+Ci%.{-c!7S+~b*[_m*aLD: Ź` jKˌ^GfY'#Tu!L6L›'vP}T8rp&%̓Ś"?o TLHJ(@FE\D3ԅW `V ,xJE?=Q[ۖo698"( Mߤf>o 緸S#7zZ18%W 2b( wlRzvk$yʷHKMW{ST'Q,v;4IX !һl&#<ςAR8´L!ʎ&rB6WBvT;#4[U3Օ}Щé+QC۫>9o~x$e~0H4NW?w8,j_KXJ.f5B= gMߴO@RWL-Fy>oljuWiEvrlns3@ u@H XnM/dv( -j& 5JCcG;)BRJ`B] Z`~L׉+W\|`AaT^ |ک;E[/Tqh]prFV֊%ڵW{-oRCwnZ 5rm*xE7sM6̼hQ0U}PL?5zRp)ˮ6ZEA=XE'PCU@C گr_"j 5]m7h nN;#`y-%~'?YjJsFD W $ŽV6Pvbw&o̻-#IGu2D-rӣsd]j `U= 6q, j)rЎPkKo)] ѣ0wnjej$1&j ׬?q/gK3o'ᷪ\Ke92 8hdFP]nBƗi7[o3+F0CfYU Lں6NL_)\wZNjل%G [bH' F:>(1(5{ 7k!uPpg*4cyٱ45jrJ% [C9 di){F)xU8Jнۓ t>pAUOKd8FWŒ!5q1#nxT+E>Țy:ռm+ÑVr\Cgw[j2K˻W3H({%)} 'QJJFr/ THSLrY8@8_Jqr؁g-ikƙX*9=dqވIßY훥\ijϧ*KT7P0G :[d,P^|cI+KazKþZϐbr ͸QyxM/#<[ǝl~ݻ S4G]ﰺBd^t>prXp%H1A/≮1KY?;LQ(6sqt:o5QJ߾c㒐nLJ6wUL)P_W$I?H5">Uܬye %?,K)!u9:i*3:ە5Dy؞#QXUҠ_5 ڗ#n}nb0_12MEO8.Ѱ C_O}{ /yܗi]KV1,}@p_}IK8R14Opz(U@{Xy_MۺyvMˀ9 ]Pus-)g ۈLʝWIQG 'Gk1t!WU!U?@^ulyalOe.)+}l5=bx;-sԤ󶨰?fzw*fu}~b#? wTS0D9@I#TL`rf'0RS H#pV6=\N']RßfK>ڮZchQ''VRUujujAH|*nư{ņx̌_by)Z#53~p A(4DR[eajr%Zd :Cf*6kAjáw??Lr>&w_l?׮vkjnO! }Za}[6zkR_Voս߫mt5l:u+U+_?U}Wjޏɰ/On~ZV~>mh_])8,q-߄QJCe/hGk&ګF;iY68x7VMPNdhw$B?>ΒէnQ\488=1ް 2EN& UO{&|GNw Ïl'%)U< :n~wfc螖^seK `lǰ=' fM61Tu3 Z-3\їb3N;g67*?竭:9?%%=}ۆ%#]ұ;+d}& дGL?{ue#G 3lA09_Up+p | *(g~&q0sM,{8^ DO_?:Ԁxj/׶, sV-䫲].Y!5vóUˠ%.X;2BJoO?ra U/ިׯ/,GST|آ- ICmw-1.\(ntb:JqY9f*WS ԉ 87g7`4˃[M$h @*X+ y Qd;vGk"r:uo )uFc?MAVn7t RYᐤ06Bȧ>=AL/! T"QH a>cqw$N[O! PP+(N12с} zaNvitXa4Yd=s3D=:}&C ې;A@kbR P:&Hba3CKg%(1Wl?. qE%'.ed&%[aq|N*8NfcLzzx ȡ]~zocг 6 Yh/PQ_rU#)ae;0½6'❸Jm5 `<5 2baz*6C+npA2TOV= ^tge.FF*cVdk"c*+9#iC'D(?KAשu]:+NTεYX(E"Z5@%=ʃRd #eV̱q_Q3 yD P0vWǰ)ZdsAx=&r@=x|vUսx }6c8)lL@A!ӝĠTS]_``>A;[Ln&+%#o[Mڍߠ'KR f(B5Lg˼Xқ,B{+f,)+f abO 2xg'L+C1L M)n@ͷ&FgdT=|:cܭay):2E>i/Po(Oi'giSm(jX 5i ӂ SV#MgJ )@)RS#7N.udvhU84u??IdM\H3âq)r˃\3=A7Qcߊ4f8tdv맋^נ sJI`])|kȔc4YGQdE`gE2ah78zepQ45fh0zS?NHxW/ O "usBD0 3QdP`}[1g n]'?x?7.I{ kmw.OYD* 7I?P+v4~YbSH0V棣IUE)wuc~ oXl?7B C@qEjSn]{^0X x:pAV1I61.UcC,} U|%x᪲^]"pы70Ϸ1r5F+@UJTێӾo  sGW`=R>;#,{af_Li1S[L7$ wWχ%lsgXPTRP#;^~J9<>`%erXf#}|=~Hd77 D<*Pd<u̓t)gK/?DpS_EPW # CE@#Α]/0iʄrڜj( SXR@sK\!a~<-s?Q>.^L!̓ιϹЭ2qcD<ø]0qԋ"s|'XfP_aPrIks3F[ *"'÷\Uo߳eR;C40Cc(蒬wh*b8I\,H"w gh+[c揆T.֌U_As7{:X2Ί"ʻw)o_BVk0Yq{0X |h0Z X5L457a%NMXjdI/+w1|]LI\Hq_ϊ!:b?i>{C hx(iAqwh}V#I@4_a*5y "1f.",nImb"MsĄ,]zBLgq 7T@bl|d6ǽ6m}3~^<&<<ޛeKsDA[޳Ԣ0K+5,)淑?&x65Ż1A%$؏&]z;w'"Q4o,Zit{7Qud$Lv=n[a[P2t)LA3\Zθdw娟W?-rnZY7 , ~*Ʌ84 4{v @w[z7Wij1Œmќ㧻kx_.ԑpq?IbB)p vTڀK8> j{m~բ.uXbrTCR+#׶@x=8dը.,;B[}n,ZΓz(&z;?o@I >sW)qd?K`g,iYHeDK'",TqhRixu 5 Oam#YHӣˁ^oHdε2 msKLfs?TԤu94x6x(Q<{%a:@H' ,]r|ˠ5n1!ʍۇmCtgtX$ڋ5KsNM7@z=?8%YA!uiH´es A -pHB6}g[ 2Q5=^*v >IReHIDbW#E*oRx[!kQS ~$O=-2_a}ǒՑ~!r7<zH+vT}l"sChZG[LJq'[aU$XޡAyYd^N"2 "`$Db3Mln|t&N)黯18-1XxwIE`=P@?wT@.J_f?L_~:&]&UD `*P13{ !8O'I^JD60چB{xU#ncs6dwu /'1fQ 82A`;OJD%\$iQN.G8E[~ߴ"GB~:)xkdPCyLvFpWHFC߸LvA?[IASq[7x} U-2vE0n*}!?VZQ[55 ,|"35Ep9f`*ॣ1f¯Da Y9/u怸fe#LyN%+&fWfC*`jDs uO>:kaT[6'OP)tD8g=?IQ =HR2QMǧD_z<\S#v~қzBPZP(+ΙZ8)P-)iو71P?լ0;2=f)xiZDlA2R0ˆ}*DT*B,r`,.ԓaaa@mI#tڰlh[\` HK%mop7rD“ZhG>ͫ7q٘STх1p,k#[2 R@>bsBяiV(MB@Gb ~[⥳#yd| }{&;} y!?a߻)<Itrp؃(Ho>d,`"&1)>d/*Q=siy?W}I5 [BO,mԀ'& ۮVpHHcM4 "q+mJMp\L_SlЅ91 rKiE"| M>(E5t?K$͹dCa6/snjgax5SfS0DeX! wZ3•#m_;_eH : U1 moU@.9OR_K?cRˬpi%-4\6~ Ld͇iχS[65HSCm$ހ<:bbablIJ~?E-mC(ʒ5 U14.&3/~myd0"7 aF B`P 3/!5 Mv@:wt] Dܟw@! 2BFiW*><> $C>fhK=T(Ӄq89?9Nph*Tv.GUaH`=e?E{0Ħc |x8j"*YD%._CĎFZ{qJ[B<\*| +.GЂz^muH`)ey'*.`@: ߯O`D='gu8%9z=BT "f՜vC2GnQZ{%D}^m}:iFD8ͣh w =JAyL?aIPc3kAhzV2\(LJyR2HSoYly1*Ϭ i -cg4Tyֆ9"bd& S4DAKD1 M Yj¦f+(vNC_l؁"qW)X˝$(wԮʾ4#i栭qa&Qlml39O!Y Z#cVg=%4n;!CakA:m"6oNs\M|V5cN>JDcG(j`!bea4ptlu6F.aj:8"jWL3ə^YK5f|xǴ\TԯC_:$S01RO?iTc#,E&7."5^pW$ >fVL=5֗2ryjU)ƴ1 XKר.'Lŀ=%-uc$,J3*5-A핆/.THۏW5ԥy{ o(pUh exu-ϦQԚ꡾p l )V;~X+p^ սlkQwg/Wi0#y >sgXW-̈=BRS>b!o5,F%.5ƙ7-}<qq[ެenXh10aH|ߨҵ5?1'h!~Qrˌl E?ҘhnShn:eB$z UJwsҜ/wOA] NUPOW흛5Ve-``̮'GeOXA(̓XyMFMK5S4z'*y&{'{H>lZ*)hVKZEɼӪ\-kmuf(㞀N 7S_Wo`X'.f&D`.Yc\w,/ A[˲RT.tf YOȜ;&M!@7G{1 #Q169 $:qsj'[6FZ";X4{Pc"^X$UpOQjQ~K#ASfӥ8H-?-L力iv {{PaWWwI`vKϋzd5MuRRŶ^/DjՒ˻XK " B 1dͤC3dKCO0{`F[P..yTZ)SeCTg_[PWlen%tkne=uF*B$[2Z>$ lhGHDI1fԌ(;3Nr'oDr1IjC9ln  =lVxD7uo2]3}NOLelq]L!)Eנ< Uf$־43tІ j?N`^uYǛ3Ϥf!c}Jc>kqcV ǩx2ܓ`,BCB,'6'mE h~=iS!1m eU.KXzs/loP/4 y)Bӗ.G_潨Ð0uO11;i'{c{uD* KpJga5g^VAԥ7} eNԏl5_c4}z⍈R,I:qwyUJ9&CW_Ϙ#.4/VLx,N}D&&sZQ[,/xٶ{~x)Y#WsD{R Ǵ?̘Vzȗ$&jOW1l]@ul 2MzObC&)G]^N..c:]? hs ohu,1Vo`FzHV0N4B –^FGTUWԘWiTU]%Ѓ.L[)羍/E{HDƿУ>ҫMLOB amB-u5$49T?u-9}G`pZY*@=)wmߌ%F(胿7ҷ[L'G4&Q~BH,yR W]YO3EzC#X}m%}&x>m>80< UOl6-Ϗ%J_]sD~'2Bjy04dVwy!WՔ{V׆Ǥ/}1oV;|rca+SģVZ<>[S= Xєe=e' -n-K K0L06Z>Q⏻%X|VEnSq"u& TBKR#)C[#g^^]|;D] o04ac XgZoU yw"4Bp4G^Q[ض8V a`D@;ru6GuL5VrȆ964u__  gWx:^:IFbF28-˳+E=q!^Wś,]buw<b|=07mJݫ+fBjH㰑[Ժ'R`af;dF,ѩݟNc;?H1'oW[:#yo?7c3[Cʰs'Z*RiؓL(gg 6izS䷁irְmrc\Apw-.ÿs?]%ly;] re(j'(p_R-t]f58[7f ԍU0YN|^3!T=22JM:BlrATUAϢ&+NA↯}js$NA(anM2;l{Kj I'<(ECeh_?.BZd:9ZbɇpϘ4AM~N}uTJͻ `ʧzL9(Gۚtã{ٷoAwe~esQ`%*!/|yIӉEîd&9,wۺ}f45#Xj,ݞҔ2- MX2]JZ&jyx]YfL1QQ;]10EH6\-=G֊Rp|TO7wEzYGN5)̺2>zo>915|VTMIm}sǭ01f͎qҝ0oʏ7XeĨ}s '.>LucsSԿ}|Ms΄plWGEfDkޠ (%/h$ .wbߘ4'>>315 Ad _c/rɱ `N;tU`dBkvEj\HG_x5ҝ9@^DX#羭XSQn~}k_vkԵ_Qt#Ӿ~_?sV6[CV?&ATnpU?WWV~{m{ӍsQ*|g|)8,q-߄QJCe/hGk&ګF;iY68x7VMPNdhw$B?>ΒէnQ\488=1ް 2EN& UO{&|GNw Ïl'%)U< :tO25Ug1Ɲ*G^1\H+WP.rև"Wӏ)B-f x.)SV1By6g\t 6˽hn:Hk{nD|okV /2B]e \,s9RS-XhQUUdutI#sH#AH7>t3:mN_{r' ( L3:wQ$^Yݨ_ed豋1qLOR)[:m-SMZ-.j+ERDۖƀ!Wgg̈Aцξ7(o3V2wgWȔS"l6`F؏l>p'Khsr[sBF k_yfn8&y/xSݿiҦbq7sW_6B!9Ĕ gf-_v PAUQh !3+PTPK%߿!!IVkR! |X tiS|(]%- BpNc"tA.;{kJKp[M$h @*X+ y Qd;vGk"r:uo )uFc?MAVn7t RYᐤ06Bȧ>=AL/! T"QH a>cqw$N[O! PP+(N12с} zaNvitXa4Yd=s3D=:}&C ې;A@kbR P:&Hba3CKg%(1Wl?. qE%'.ed&%@C p$X)59' ~'ꐔlXg߯c 9hePif/&9׊8I-#cg⦋gnLJR f(B5Lg˼Xқ,B{+f,)+f abO 2xg'L+C1L M)n@ͷ&FgdT=|:cܭay):2E>i/Po(Oi'giSm(jX 5i ӂ SV#MgJ )@)RS#7N.udvhU84qjXOaI #l{-/{ rMNZl'> NXTuMh?^?FOG9. [6 V$__@/xhqht/)cCyDHUih2v !Pg '>̝.3g \b@_t;N:`܀yPQ쒊DX k]@rPk 5,0n:2louOC~P`+) )2T Nf_Q1<՝ǰ@7ׯ%KE0#sK\!a~<-s?Q>.^L!̓ιϹЭ2qcD<ø]0qԋ"s|'XfP_aPrIks3F[ *"'÷\Uo߳eR;C40Cc(蒬wh*b8I\,H"w gh+[c揆T.֌U_As7{:X2Ί"ʻw)o_BVk0Yq{0X |h0Z X5L457a%NMXjdI/+w8ѫ\ke_*t}9WiH TBo.[7I-Ho?3B6(3uď!"&Js~.y{)mL3^&TW yF5v]4_ܛ!C gzU@PW|QJ|s&ήQyƒrSB{Ԏ'HK[z8xyZBso'rG[᝚g,GPl+Q@a27cI6^{ZI wgd{5<0˪_Z7k' YK3_$Ev9RobGߡιᘄsUQ#.)!%y7ܴ:A{v<# _1LZo&@)Sy2 I?P=S݆L14Mimr*f el^/ U9BRx!9rQKUtǵѓ# ,b︟+!3ԭvr+Q1췝>ǞBFwym4b&7Ux ti0QC -vtRv\ɀ-bR ׸%klS 7:cq-B,S9ZSx]/_*|D%Gq3TJppvpT HqEg&ф@~}8[Z)ϼ#"`+R|4K hweP@kSZR#sL:&5x5 ڭ&clӴR,y4Zʹyn1G!,6,d/PT?Wӛ-e\cО Zho:ܵDAfXW+Qq$E8UyX@4L~VzNfaEtWAժ^' 'O\*Q:@Y{~ ؑ,CBZ@y9st<'ڶ^tN Bl\fz,JZcaQ}/V9_, g>a:@H' ,]r|ˠ5n1!ʍۇmCtgtX$ڋ5KsNM7@z=?8%YA!uiH´es A -pHB6}g[ 2Q5=^*v >IReHIDbW#E*oRx[!kQS ~$O=-2_a}ǒՑ~!r7<zH+vT}l"sChZG[LJq'[aU$XޡAyYd^N"2 "`$Db3Mln|t&N)黯18-1XxwIE`=P@?wT@.[f T?iÎ{Vx1g 3qǮ"r"d!&mdoo 2Xj ީ$~,VratI'գVSB UsU~OgkU@XZ#4W w:+%^+\"'Ov#*@G4; l)$*4-߁7O5$|Ylk4AWmWaV(d֒J?|iwpHN: *6Mdem^fI$gcp/K+#DGy1b(q%#'{-hsYmq9nTeXݕ!_϶4UҮb+fV& 6JM-rpVDg6B 0f8֨]N4įN )q5bi>X2lʦf^}?x.Vn|Y MDO{"P(/ L_ gi_k` #ՙB*V/Ro'MM{K-Ehd:;4Th~( s?i a*,ɳCR v]k}?>QggXwY`p#~קBLcMr=@2$rce" sQuk?/fJ ʜpG-ڿ6['dg@椠^g#r8J7R`z;Jm U hxhX/jMԶhюLL^_|UW>B5m%Jie0P7q%Ԗ1pkpooی2[kH6 `̈6bOn'ԣqeko4aŭCDryL-&`1>R6fgSA5kR 2Ȳϫ}ɮ*BF/Oլ0#w'0-*2]6A8Ct=;%34hh}pkKq( d<*,Q7J:_5aY̟퇩&6Ȣjnn!2ss&l3gxL\<l Hu,+OFwe+B |9lZ*)hVKZEɼӪ\-kmuf(㞀N 7S_Wo`X'.f&D`.Yc\w,/ A[˲RT.tf YOȜ;&M!@7G{1 #Q169 $:qsj'[6FZ";X4{(.FfE߃_ê0HrjS7vV7CQrmH>'XȽ:~)GrZ.[<]r,!f΂;v1zi,`鏖! S2_锺?-yfM e{}3hՐ/+R Yeb@bbuqu|'qŧ@7҂4Ij:ouRX i%cIHV03'HB48M~unGbMmNf֜ĜQޥfKsXqk3C@/4٩5f~k}χD9`/,Ypba`]pyتߺȸ߻>wqʦe陋)h?YWl/,UA RׁOt/v*ju1Beuڀ}@*fy07;#@hZ++{1PKgُGEC9!Lc}޲75N Hbt wO5MٴZ)[ó^υVҏ/Jzڞ磻TM [G&8R :Ӽ;"}ݱk]F{86N9wV4#r#lZN3P^=>Jc&1%"jo; Q6OJu8Vt_hbzt@ړHlǚjơx''0T.mD!f Ts@%2ksV#jrFϨ p)2Mn@u{2WϝX<$QpOSR);jjm,lX9|,+f2ykp̋7$yceLl.}Ľ]C2 >]d|D 0!e*RBb٦&=3A?d@-i|Q#K)=ׯ.*/F9~XGlxw݊U_ah)j]H;7j='o!R6r3gN7urh@B!-q]L!)Eנ< Uf$־43tІ j?N`^uYǛ3Ϥf!c}Jc>kqcV ǩx2ܓ`,BCB,'6'mE h~=iS!1m eU.KXzs/loP/4 y)Bӗ.G_潨Ð0uO11;*Ndì0k b"]d9gײ鋕Be^\%* 6U%2Wj.T1R[\{гWTwm T!< ؓL(gg 6izS䷁irְmrc\Apw-.ÿs?]%ly;] re(j'(p_R-t]f58[7f ԍU0YN|^3!T=22JM:BlrATUAϢ&+NA↯}js$NA(anM2;l{Kj I'<(ECeh_?.BZd:9ZbɇpϘ4AM~N}uTJͻ `ʧzL9(Gۚtã{ٷoAwe~eqZp9G /en0&8Tzb]VLY^lܼFfu{OWZS۞C|論 y@&Hݥ[g9.Nn[OnY^EG},v¤׋OS %ಭT88Q84LbIQF>Y/22iJXY9MbKYg!֔P?NX>HŐ+biPYH!avε et-؞_Bn1GTvāUcP*6{YnQY=9zb@Z(A?wS_k*V>?m|r|_mgE_۠t&O{Z>M-}TWNGХQ`MKձ7ɤ@ueu*)a!>4uCXâ,.)+R &قs0.#"a6/[nۘdAV`wwlb ഑##z*4H6K6bi!& 3_{ƪ7: da^K"u`wlCH'ًjrzQXݳƎ/RؿW5io=F$uɼ } X Qwa&859.}.t|Ai*lX,Ȼjt1 ILnKy|vQCpH&׶vF@1`, d1a],u e{C- =~oE]LaZ`Q^N"\|3ϧ gӺ8[ ٖ73'U&aQ9# ̭_W^Mhz2AR%KVr$^HcZ 3FpqW˻jGF,IBg%L"~gNKIL&0piΤ'u @5h <̍!~OeKʣj0H{WyTZ&inM 6~Bg8hM$] 6=.ޠIV2t'\v|0UEM%o6H5?u$G1^h ǾJfNWcC ~9e(雼p_&’jitc& F%I>O?eR=pExYmo+TnqY2vgԩ3J}1@{j 3ǀlD(c&31`Y`s}|>@56?羛|ޠfWK7ږu WSs Wc w?Mϊpˀ PW-pKny{\R3DXDArr̴G.Z63OEwh$JQxgqmTN.33Pbcu~CΟvlbvv1ޞ@GfW%vzɆuCnv+y-tq^{9_k4ΝZ'2.>1z\0njv{,Ub͛"$Us(! x*}sШ`bc=]uk~Z/7BUG|̉f(P$#?JY|.WҨ`lCXpjm.WiŽyU{S~(WZ}['A%K#?uuE6$t47tC(FmxPh ʨLQm6ŒIÓ¶wY~:˒,4x}"t,1ej\]J. F2ڰ ' gѶ<+ʮ [ǒ|}gQ2Zd<8C~:.MÏM L8kSJ~2}UY]zeRF^iBrAC)SyڅHVAW nW1- \Jx=iDGlӃ3[Ӳ#ݞ8蠘 ikQ#z&8Y\_Xk!g %p6wtpy(u7Ĥ\j}- {Wц0eIruG>f*bkvd.}b$AV>"'8W -[O!N_RY#ǡQW\ /\n-XVw0f*cyu;?mo؅@ߟo$J(-%.i䛛3$WEʏjTJ5˺2i2`{5d|Hk6lGaJA@`ZG; }unt:Wݥ],ȡc2F`Gi4% q$uv (l `GsŜ]n}"+c&Vkkd+(Q} 뚲jVxݚ=k$ 8tc-wd6: [N:-!8-0F a[0Y>Ё,ƚ7Oob:Tl[ᬧ׫j\߮Dޞ#]ι=Tt;k>eF0h*'29ݯ: h{; GiHH>fnb =O0jz/cD*(Yņ l':8Yx2IeuN7*؂B&=z(f7JC?s~G\}t{8(w`B0WuD/bGZvQ~V9SzRN:/(7EֈNZ>L gbb{mO0h<14ٽS. DHR|Uz\a{c)\߯ķÉФ8fY *Eqbxl΀ys $ `{٪_q5BE)|Ϥ J_ <8yktj sK^e,7% GWkBtL=ңa,n7GN@ -OtUntM[r_UX;) jkVE3Y4_M+h$g} if,nx*#I )}O&JUlϮxMnN|ʈ.F$., a`&^Ȟ@h3V}*Sx\su> yphHJLyn88_ւM=$(\R%-,:mx܁RSp[YluS{TVvG`e`[ٯm>'/H,;*Ƈ=Z48(J!+X;'t긽[Ж/fV-Vh=iaYXTqhOd,򲜍 Z$8l Rž[ f \ZZNAZs@$>]C6f?'_v*#wo8mK>*b"?=3h6Uz&Vv|cs52W(Ţ s+)/pQk`RyкAn= n5"k+)(d*б3e`17v =H\:,0< V$'c6k[{o!Ur0G? x3=m -djrsőJ!4"{)Lڋ}w(8]bh$Xtqcg4HoӈsyΥA^ -s>zZ{+0oGQoǗpmL#E [l XOT&F}2Ќ,!\|jo@?DY,r""bux.ÄO$Xŷ &? <֗EjK'h \r$T.9fMtOX+M8s}'ݨ)YʆE7a:-2<_vҷ{F~ьiשN6 {73m삢;O NIewIؽY+ o\mIu{@M!a'ILK!:licnV B3Depict-0.0.22/data/textures/plot_zoom_y.png0000644000175000017500000001036212270276630020335 0ustar pcuserpcuserPNG  IHDR_`{`sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<oIDATxi\u3==ӣт I,#!*FFv>8Ʀ\1\,RI\fp| MI"H#l!" gݓ_wLf~=ի~9}s=1KTE'Q&bΔ帍+N]l~Ω4S qkp5|O{?8gFUgL!OaǛkEՎw}:w{hñ 5!PTLPxl[C _^2^?֯YܰJ160jK7>[W>@GmqI<V/b3~3 amAy,F$|xMc&0i~~+ű['`Th|gXSDT9FMZŘ]j/W3?7"gBUؼ'ްv i6I*;V?DMD6v9 U첎s>9oNj10i?xS3Vڥ6 4^|}槪 b갼8v[ǃϝ*'{xQ}35W5?EdYxSKWʲ,f_O#Oa`߀W2t|ݻ o44KD>k2槉̺ͪ]r+\./R=>/1t0OGoዉukTu 2=fXń_׸JbwL`LAy;@M_.W\:Dd!0 -w RIV\|]\i^_]5Jo sK+ْ!Ob`i< b-7s^*Gwg4cXMGSWJmz̨;p`!&P Eqô?|rč6s?OS~5X"O*AQ/_;_3i"9,/*G:_ @,ѲwAE @w]0r,M(T{${֘Px"(G>vFjgμܮhXD[# k`R&|`A!uY"Ǜ ~?}5uMu'XVtЭ^O ΝU{۹}Ow#TUx3w W*ӚKG8;xy* 9?+<о=Bb*9᷿||Boy"L_iۃ;kHDkVٌEL{ ngmsĦ&]ь#s#1B#%E\CWI4ET/оx=L[|x`jQ#"+FE0fDԪzY5Vb,OXIH?5E$;h?iA" w~ hfo?CR'9Q}YUdA`g ϝgÉƳWzQ1z!8e2vdrĪj5֞H  TvrQAET>4tt*F,VV=( 5Q~;FjD*nu? mnOVbתZ^OōRVܸJ󏮌HF%VިN4SJtK{0 5# H^UdEda%'Llj-zcLT(!Lw @bݡj|Pf%L65vr*G0=M aAUgâw> |:=@#?KA־[{| z5 d:So 7WDr@Ңw"/GۣX:`Qz Y>L J}5Z4ޘ-fk宴]_jV-!eij Z}ux#pngkeAYg%"C[:\{ӝQ DY(-]6dԵ-^YQn`&Y!bso!;@5Q[wK1i,~ΙSIR"w)ΧG~ͰE_3)w^caή, ,MyY)a&VF툋;K9F.w'Eγ "7ņ  zc$xvESWfe緌jt99!ai ZaF>P]Ȣq~إ̅/:2:kO}1av_hYmoma|' k"HU DUhJ:}fgcXrtW&ӠnVAoܖ0*B~鮥!}z;ث2ʂL]OU"z4gt(j~㾛$$]l-km B e'-8-Ng6ѩd/5poipU`da t-kϗ'1WULD=nwzwHUpm?tC;3D¯=xK*.jurXl,Ͽ֦쪧lj'iB;=Sx!k[qBXzQPiEX%6nt`cq<<.+x-5j}<.+En]#*N @q"[;p8 q Og ijG~xJV; |SG_zDx8-)ERdц謒|aXĆgJm3V: <8Z3I8,<>'XbᗟnA׷|i/W  ?a`Ld-M1"i܌Ո=бiKİ—Ǫ"^[Guy*'*p=뭘FAS9>&qu\Uδ_jwg׎'T5^&th*_2<|qqg 2?حEhFY J40HD=4OgXyJTTQuTON>8vͣڱ)2w gv_Ԏ>CKDۄVS|,0jIENDB`3Depict-0.0.22/data/textures/animProgress0.png0000644000175000017500000002044512270276630020517 0ustar pcuserpcuserPNG  IHDRƽsBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org< IDATxytdW}?^*U*-%TJRv[6c f I#!'d!ф0gƓ@8`cLcr7ݽZjZ_{+Z[I*-m^z~www`B8}18 }18 ø/pÎx<~TQ)PUBQW FUUG#:lZϽqՕLzp`Bq WBeYKQ__h0Bܧꍬ2d !Zl6l6fd2I,#Y!ċ>Nٶ q@hnn>(__7Jee%t:)--faXZF$xD"A,cbbH$B$attaJ_/$YggQWACCC`~J*++xF޷766~RM4UUUXn2qݻ\|gf:tuu144?PU3===rw|& $EW~^v5njjuMMM|%ϜV ڮV{0 TU}Bpь5jwqya:::0Ν!Nvuu]Ym!_RXںJ}T6VR.Vht-Rj/Pb<)sL&O0':%2JVi_lmv9UU aELmmm>a[pFGGGw !^F|rlكY+M؁?,%DY`M~f R3R*( VLuҭt36;p0W0? < !hjj ~$[n%/^``tww?Ap^m€&Ij/+xeueXNNr.ސ))z= Q.~%~ ?i\.WЕﹱj?=_򷞞fggYOOWW+k6qu 8wC`۹|;niS'Op6uQz-ad}VIZ477c0V,5͒=4*aD冾[m_ewi~w3fmTM5}JTDrQΧ-uu~!Z7of/t>Λo3"H:~fÒ/D5ڴzuG518fb"Ja>ZQ $%>|3hRo2VU:bVu'^qKbd2vFU{鮮糟ə|&n#>oG/x? J&%%%%6hK{ѹs5"HN)..fvvEQ$oYXԑSME?B4n%,FS#GGw\կ=}Ф>h4JaavޖDr4tDSS3%_B@)@-/r^{kߝNgNR099Y߫PUP(sGfwmB`2E-b+aXm,{C-_tF#h4sq, v=se@(bdddK1DQTU333c%+jr N.o 7V$avvh4,˜9s&'a0lv,/;rʖʶadY> W}&`+a,4;̥Hs\hQ- uLQ昝evvv~t:<󌏏ىlGEEņDTUG'^ƎF^{ts:gc*9Ex/DBW=h1o-l\PPDpu DDQ$#I^eQ+!L2>>N<۶0]TU%y26 `%7Tr *"SI}4]p2TTTP]]MUUFÑYQU5C/_^fggfppadYFQFGGÇITp8}?jNj˲%/f9'xE<WH$rJfh^UUUTUUQQQԩS\x<+'XmF#. EUU7t2<Yg'Orq|I:::hii!pEQU1B :TʐL&8Dqqqsl'NxHR9r$ FFFHRtuuu7FEQ2} mI  =Ӎ߹BrIeVf6ai>ߏ$I[REyy9ԧ6믿aΝ;G:X,Fmm.Ft:m46nx{m'vXJLawhDi28v%%%yާkq!xx4tIx cccq򾸤sf2'X=MTP0qfO3&xI c$p1v{­y;Ç?azLnٳafgg9<ʫXo ٬H$E-%dc\H]Qݎu52%%% 2hvm{xwuw3Zh4rq:;;3/r5VBQ̘oXR!e${笅-g+qޞy*gՎt!~A{^ Wm݆;:Ư΍7O?~0h42<+tvvf6_^wu8M}nSZZ:dG%߂ 22"#)a@ڞ@UULg1+6SFj|.o4EQĉ$L;\.l6ۘj7F8蔅d f6sKԅWH=񥥥꛰SҫQPP@YYcccD"ƨؘ+]z۝v:}wqǬnUׂJѨi@  X,{ZZkv355,Q^^$5%lłs\@$󇮘ń4dqqޒMk|ɴgQ/_ORcrQTTt:+@+ 4"!appϗShk[ZZz`QɄшt\9VNOOoH=fffrZSq݌#2455|:frrІvII[I&?f\AAq'pW̦F;c43v@`,NUYY=[VVB<4Y2zeAAA+d%BTPP@"@QBЪ eY& Ny<.EMF,_ѼB$I9z``@ d2p6PU2e.byy3l3h)E"Prh$axxxKn 6rСevM<n\.\EEK]]]/.)GmWmb3 4l.yMbN$L۳6TU͜KtzY6EQ4-Q^^NMMӕ?>DrՖǁ?dHugoF144'-mM:FNǃ鯪zX|)*0n(f[j8"׷:%1DOp8O|W*C'9dŌMO! Ih3e.ļ?Jٹ M$ɄY,~?~@ 2jmg1o#ŗتJ[͜]x<ΥKxދ?'?P~fK !L<}}}TVVJHR\rd2K裡hі*#_h.ORh4%%%;jb P8III\0~KKwn֙>!_mWcM|_^`mCܞGeFGG> wnnqX,`0pccwK}o4pmοIt]*:;VӸ\ EQH$$MA'?HPSS-..~( ~#ș?}j*/1p6u&:.9x^X ϗ3?* OƵ>rkrɺXmW 7:BEbXTEQ69)eR2Oے"6CUmWC혪Ў,AWtɷZH}kjq@ALNԾwv ?0 j"`uv`0l8dN6ڮw@; 0Zv_p}p-v{l6/=^;D>< hc?#5g_(p:a<}ԩ 3j~ @%v6NJpN";RMM̀n26" e҆2EQ,{<NhAA宅 CmWNZo; *Z6d֬^/cnOnMoeNi/pqu27zoL4?Pv$!ټРMchWd ;4? _%%%vOU^["2vf$!i.Eտ;@z)**)**:QK@]MTT%|Y ЕවAs]rWQ V̽$拋rc)+q:j>/ăa}dD4mUQs+ U m`mU! Jd˯/6;To)"%D(g08rO;M:IE@zwܢ@סCꯩVQ?mP+[R@@QIYml罂줌^FR__|H=\/?%@k~gNaa!G?lwp8 ܏L*"^sF~>l\wuTWW?hccI<좓'p:.»A l40Ng8EEE?~Z[[[zkx_#Ϣm2iEIeY^8y$>|---o6%u;Ft:& 8,_j^Ass3555766>|7o8?W#p:7?&8ɄbՌ\z2lG9cxǒt:K/2ŲB٤m.@uu@@ hEEŹ&p:uO ɄdV0J!2,/z^xo^())yzxE$e=|<?G'&&>x8HSI2Fdaa!@ 0r.;~]TTtt:'`Y®A*2NOOCCC P2{ѨjKIDAT)Ñp:¨hj Qrz ³q@Cɤ9L#J(b$Ib$M&Sl6GVkL_rkd_11lcq@>cq@>R@i!?IENDB`3Depict-0.0.22/data/textures/scroll_wheel_mouse.png0000644000175000017500000004017712233244370021657 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< IDATxw$}ejﻧ{Ǜ3@,I@R㝎'͉'=h"I .vl{_&Ȫ,]] NgFfFef|E(h4c3hV-F ,"eyٵYh | C7MY!"_PxP)սYZ&l&W2#mh YX@RjblPJMCYΆ@ x#c+ MzZMZGEDrMqٗZ@ -B)5 ˑL7M9pb@SqvEr)GFsH.6Z4Hh@@ BhД#@7M9-B iq<[hʑ{rhД#s?"hД#̊b@SVH5p(G2-EB ٻ, eݣԔ "mYe!hD[rd/(h @S+@ KQ36yh @H#-~/_\YUD6PT_sqf{nr~_|YDm\)J4+'"a{)S-ADEOy>ұ%µЬoDWOO-ԓϕ&h"%^wRxҤC[!"x)Jo-ch, iv߷]v]v4y@S0">m˼| WJe^KSZ4y#"[_7H} Ehr"";v>u_+H,-<;\K >JpYZ4IHelS?|KEh, "`;灯SkjMܫa J77Mi.2aiTyӔ M%^:߁+/ʡ- 4?diElOSJhQ3YQ*pBm?PJSiVmlL~ 8vm%T鲤Y )y$.ϕRK+jgx: R't_h `!"m/W&WD[O{ZS9_p%2)l,8JȊDShAD&S)uk)qh#{1"R<ɑ^Axx^)uԬ&  1wdSxUJ]_4eu%,Yz :@ EDLC[?UJ 5E@ #@ff{^h C BD8)!:w\D"YCƀmXEdhXH5/[;DX~N)սhV-e|{<~iH֚rA{{;mmm477si4]]]|ӟfxx^޽ˍ7͚,VeT?SJ82%0?xEEϯ8p@ t8a466Ƚ ;wx79sLڂDLt{RɚU@ @""c`_DرcGa¥N{{;?8݌$QJD:/ MIPfqx*LS^#GpajjjrϬ~?Ǐرc\z'Nӓffv4|Nq2ާ+/"ka h¿m6>Q]zDm۶m6zzzb?2==ME ̌ǀ~yT)ufə-eiLm}~^Ki*ڵ~iΞ=tlzf4,ٻP WJeeZS21gc ͛y'-Vt^ (wga6CxXOvOϦ333)~5wcJhXD:]?MC/bgMP\f>QYH(0~~mbLSbyl>;}ypS7pZ1J8N,Bz='|s*2x7سӔ-%$6m_ǜ|>sϞ=|GZ]v}D,},Ʋ0|O Y6͌s: 5%B @icyp)wlڴMwǠf-wQ[+!6D"-+!`Q?ThJa~D?Oڊ ?>QEWKAZ67bsFGGsMUH^r|hkkO7??)سԔ-%@Dv`Ϙ#^ 7M~5S9jD^Z/:XpсKoQ/<{M/Kg)2Zxof~t}Gc} +,mmRi~P!b|||IAp}(e0S@Fj_$[laǎl bGJ6`S,Π-˟5я~4E`?[MPDD/;󮮮x0a `{[ }Oض4qg399A|/}933 -EBD6_Mw4n;4yGp\tQV--~.h7Àe9؇eY/7:9=z={rWcZS?'GzTfiuliM&?>IgJ LLL}~9?Ȓ:g)Z|x"ñKKKԫ#QD-EgE?J)"G>[=s2Lbkz9j<]TWh!P:5Cg9FGGsY`| 9t|-v2 gzGE)Ί~,KoK0߹$bYtQEooBA;2^ ]^ ,Xpʯf8Fb=[__O{{;p&(K}'?Pڃט;F(ʫ[-$ނV:U <,?8 ُȏ088?^Fo=]A,ˢ-0(CEjii7=V`YhX""32K{ {x05@0KO[uM~\iDr.+}x_]h% "riIEGya<;ˀ}+W{A)}C*@rmĉ>T{'mi|+ze߾}B!,ˢ7,nv*TL7D4yrk;4>ir!&&&Ըǩj+e@g"\Sw_A{m~`Oɳ?rHORppGQu b)feqͼ-Gx{ߋ۝:4:{ߍ@!gΝQ'4Tl-?g\@g^A{ 1hکׂPUUŃ>X) ( 3=(ȊvU//2VbYf=is\δH:vc#MhȓBjjԻ0 ⧡]?hPw4' 3LNN244bxBCPA]${ Bg8:E8 ˂fJ)_Tג8pϗo]JZ$2 *,ˢ3({T--~juQG׬?V3+*J9J4MYWp |452fog+vdgnS2qI8eZNjёY'墡jc!<SG(GvURVYmWP30m-!do]jҠ 3y͵d讪˺jbk@ imd@ @fB%0e)޳ 4T @cbwZ(8&@wf@ @Dd WCsK[ .Y7Ų`_GK#]]]TW=`jV;eJ^&5,K2O <'!t5؛gIB/ :wGB)Å"֭[yw=姁V,I'/jE˂s\+Fq >ff_j6d߹CR,r,ؽOh^Rk)`hp "|҆jr(O%#UX~q߾>pv  wLDjR-A#wsǛXboѨYBYe.c3ɩ}`ƼC~O6Wk -A|ýxUok;?[+`[- ^yBQJPXJa*XJa)J)LL;B ?w'"<3tI0=4bA+<({ͮ.x|n7Zj|̈eY(QXF\ XN.k/+)g~jK~%_lٲ^9??"RJ+}y+ƴ/;} _s?Y]T#^LܹũzyYT|>MnbcM m$h7o. Zߊ[q3C\y)x&?~P奡GMg06 #C$xmeY\yT45 V..ܹoǀK5d6^oQn`-}iDC!zmHd!4[xX'U3Tx𰷳?ɗ@4P=?Y~a]]]&~t 3X}:oZ;s/~p7mY :sL?~&gO#KLgg'{,޵-G֭[vŚwn( `ڕ~Meo澭uInx e--Tn6mڔor֠ &s\ttt*V@3X@aj"ǖ/R"<027`V&\hX|bnKz ޸tmUUGTp-;y덀E(nݺ׾5.^XZVb fY?{7Gw4g^Ǹ2o|ӴнQܸq7nC==܃a,MK㑀X3tq <,D v-OJR/,hS_exҾOM⯩-}ի\zu9iFTރ+ZlrDѴg3 /pQ9ߟ}XoxB͞# ',|r_~P\Ì E)ŹsxW{nt@֖'+k-69fak׮חRXygy9tǎ*u-Bb@m)a@:JA$ɓ꫌dLW]]֮.FZ @ Mn!O,򯪪9^ʭ[:ڠP^{'NpCА~␅рr@JH8v߷[hVR__$l۶34ML\X = +-qJ$O{ٽgW\)kEQyN<Ν;9|0۷o_|C%Zl( la|eBBy ER4g۷SUUM\7Zlrv"{=gyܳo{vڵk\|9Ijjj8x ,z6`q1_c`hp8̙3g:0 la?y @A-69?O?nݻwk.߸ Қccc<<رy|nÞ,'b@BpS `>lR/ p``nN:"nvlή;x7rI`KLC}=w{{Q0=bPtZkn[Ƹtϟ9@ ={طw/UxvʀRiXDn@j\h&(E`v>6?#e|< v;;:~n݊&~&)}iX -RT|Zp+w!A #֭[+l,%p8D zMu5w^0Yۧݯw@E% qpOb` !Vd(ٹ;wP?~r+`*bO%8?9фo%XSIDATc&;Y_BH+!--*ԛjM4d.|>{4 9@ }yN:e C֏uvN`BG&,͆] ̕>>H!;hq g݅4n8`u5`O\9O~ٶeKq2@ @9.8%xi;bZ蒋Slpv^`! Lc S9ӡ M]D1J I=+P<Jt-digMKI> ")>[ ^慞'$m8(w(/zeI8?gPj-$ Jȸ  Pj  ^OYC!+P(8DE`a,υa%%ah ^I(}P~DEcq,@qS0Hlx !Boո.gqlrƛ b%DѤ)Ӣ-j#"@dzpNmYO<:U\P gi\ I-8R|OY0PL!6pbr0=S#G=dpej.L$ 0L36/ޛ~ -I98c\6s*fc~C-Xp&Than00Vy.sIX<@.M'X)` oĸK+AA Iw_ʺpyq(~ | 6@-(aR2s;߈hD|<|i()f@M&ܾEGts7[;^=Tnڶc%ېiK0c͍4d`3ʷ "4mݞӽEi.ݝHW '_0}b@mĜi3%C MڏtTL7osaJ(ltҾ<~@1>,Ƥ,B撻>h@ "rQD"Z(W kʪ\rVf\Ly`{m'E Nnq5`dt4|N p8'2OE_z3/So2/K:ֶ{/m{B g?&Fi;n6}.W㙜$bmd{~~ae); g^ESjUy006฽]LHTȽpoY]z=+LC0K8hl<%gSŚXR V<Q&yd~R5[x+xVIؚNSHB$06di덊8.hѲ0;vqH rfq>#U$1 cṅB)a˕IC @ 9nNaY˔+mҾww/K1ߗփGu܁ ,J؆,U`a,@ ,}\.W z# Х)q]#`#lڳ}cf|QN|wr1Lp 'wQ?PQj7%p`Y4 0<2wÔk½cMMb ]Z3]_hHDE#\n7B!fff QU^NsX>߅fPv{_c^>ZgiWǛӾ~: }b~߅"~jkkSvg2_\[hH@vm /.5:6 N40 \jHp| 8lk):#g8A?QeG$NLL$wݙ²oHڏv' (6mZlMhcd@ .5E]MSXˎZOs;~PAHo 33ehC2azf&)0$ @}~۝nxd5j!"!œ1 ^=?\*])O9ι94OϝYBMsSpQGtMm;@+qyI׸4׳ /aW ͗%Ͼ;a@4LrJ\.;w('""2NrvNŠ"1x97>o!s?9їFzk-Z\ݱ%eY R.CUe%;w@Lf#UgyoOsNRxn Cpכp/T_qHҖ9}j4IM)f-FF\TVVRUe{0::axLyxrq9 =?&;כw.^> km&Kp'|fZT@ @n߽;/"Otj8sssᘀ8{v3oԃzák', jk't7yCϗݻ廴* "t$a4nZK\.ٳ)ixXW}UWNM )O9k2a&- yejjq&Zz߭s\hȀwflcwzu*++ D C\Kjo;6HGWϏcpwŽojlLȼ^gH |wB @n޾=-"s~?iy8/a۳aV ޸0ad( mt=4lCcCB^-Ν}Պl߻yvNh7tZ7kMmm6I3Q.ܞί4SJrZڅ C9@ $K;f }-Y1gt g/0l+KD*.8'g:OGJ  3>fl΃磶6)? :1b>,\ysFvƓUJqs8njl$*fřٻrtaKe1DDhMOtɯ_ysZBLXpƍU`ٽs'b[ap4Jrf)4:E(3qQUYIEEERnܼt@M/[kh7.)̀Xg|||]"ڊ%^T#K Vi-!|s7QbpsC$lKI`&AyڍlZKiw8{zzV,Cfmx;3LY<>'smNk/Ma)=QA2Kuv< q!@;Ӥ b~\S]-˽}>:6mBnƣ͠^ȫ/ serw"4ijlLSۂ k_~hȃ+׮ޔ֑ŸՈ%^n 1:ŗ?!> !eNAFVUe?rZMNW8?^p͔j*n &# q+`34D)?'KNapwE<<| r6U˲蹴~֝ގe"ZO?!Bm|1@-<_JR»W&1 HH+ ܽ:SW^f=D~'+Ijk0@D b™kk|ciޝff>9a"ΟOڣ"f.]rEDtJjaN]? 675jSAƦ"c9npDq4"WGr2:6Ƶדf}KW\)sXh($~Ά55I.^4\u-#" V@|)1e/G'sk;d6⦪*iy'iOǓ)/"kP =/_E/_tmM D'ObNK]m-ZA&̆,f`zZ,QermC$i_:&ht|UWVf{R?7g,/pz+**R8qpx}e`WN72l4~o3 T":CBOOJ4ZvP_͈tۭYBQ }"/RJ_c]]:_ ¹ "+Z ^?wM )^|uhr?[O24fr&J:'@8?`.xɤ}.?u]8BwjjxcVLӤ[S-po&]?7gQ*n*Arܹ}uua?_+/Xh(gΟ_wR~?%6|OϺ08[lL³!QH-aL xy=29~C+[+ZsscCCʔ?|9&&R\s uuapun&n \%̔qJ)~L:M6 0Sg)Z|^Dn'Va֖}o]*cUaD3Qf#^nWrRF)|7S~"}-Eٳ#"I:-~J9-.u"\m0 a)ŝ9 C8?TWW' +Wv}>Z|ٳk52B @y̙А2okx7W*k% ƲWn0 08$u KbKggJl@{"sZ=eou0iF p ؎Ĉ93IM aKg'']jpi 00 bm&x<~^nO2 01- 'h{kkJ`PASg)2ZJӧ{E"2Xy<fn4󝔙oUapirsa4O>`.P_)HgE'OMw?PB9u5 Dct%F|^"r[n^ߏbnno) Z[ӅF>ΩSO0h(1o:mD gSx򩧸E"6KLķ ss7ɀc`[ n>u۫36 ZV}O njl=)m4-ίF àjjk~)&VloOPhX!:yi654)~sI# "ڍ׿ՅiL?yZloH\h/U'w7&yvROOQXyϧXe0[Sf_\iltNTSHs կrwm8C RS]͎[3 wމB7,MO\vc4qao R eYXM;V9_z~:Ldzͷ"ijlc&ξK'^?&Q >HF}.oʣ=ā{rDܹ ›oq㊊ :;3| ׻‰k-eƃG|ylff7o2e*߿ݻv{N*% @8\x3ePt\t۫go<MiP;rKt}.j8"¦6EǦMTWWSSUDLLL066  qE.]=;SF9&|s}LPoJ)F`| z< =-MM456\WOy-e +"]Y"jUWUDmMM{ WOm2F ᡣG[YL&jYLLL01933Kx4;𛯼]hXc<{FQ&&'d~~p8L8!$. ˅rv )30__yk-k|ERF̦|.^ |_^E4u#ǎmǎi`wowxKvҔ-GŶ#@ֆ{7Wb۫/Z?͚D :=@P%.l$ 'w8⫯fЬih4=!Fl`ak[SQSIENDB`3Depict-0.0.22/data/textures/animProgress2.png0000644000175000017500000002111212270276630020511 0ustar pcuserpcuserPNG  IHDRƽsBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org< IDATxyp}?=' 0`p.R4MD^c+YqV78˕JƻqJ^'{lَؖKrye("ERA$c=G9zu~~UU9 8C0?8$C0?8$ð x8LZA<^ʀ9`PUuB UU'TUX,^ݏ ͣh4>#6K?L&i8$hjjj$AQUnV2Ab`ZZL&4DD"A2dw𲪪O˲]{ _mmm'Ek_,bP]]MUU6 Nyy9Vٌb`0NI&R)333b1bL&WDQӞ_Ƴ %I~jqTUUQ^^n#jPP( 3332778,,,߮ mY?߿xH2,RU@EJSS mg,c``a,haPE-#—2̧w.8$?~UU4`mzcZX,tvvR[[! ,2 ( Dn턘 ~!@CCh4~x\vioonPWWGgg'&iFx"PH$Bww7333}#V(Iʑ#G(++`0p *++m}}}twwʕ+$ yQJֻ9c(--رc96u][GFFrJNi.]~}}}6[% |EMMM ~?7FnN~67nk:2::ߒRU׮]f7 M⪹ Ջ[.ş  #hF]kk+^w='Ob;_ڵ>1F3 <hFuW૛G/Hgg'c=555=ztyʙ3gD"Ka^u2 @Rz{{_HJ~ 0@#a4)_$aٰX,$ bX< S Ztx|}(<;-B!~]###LLL ·S xG9y0TUU$~;PUi'N322իW_2ldd+AKKˊCUU^zϮ]F8k׮}vM~ x73n7wu^Q|aX]+!ߟ~]~sc,366*Z,ڐ$iź:::^,).ߕ 2===*a,4 >NM'`qի'NhRIqqct: .puQ-PͶjǏWF/X,F__Jm@ ` <C㴵!" L]]ݮ,L&Cww7Ӏf} _@UUNJ|>uB4W^]󞑑0 @Wooo{6= hӪżt( Eee%,omA۵g||{UU۽n{$I"]uX0EqgqD"TUA,oe 6E~ x @0LȲ tuurtþ~z{{m1 Į%;D"FN'￯{6L~ 8hc! ~?!=< IIYYFEDтt,_\.0 ߲rcCO&Q9~8>o)++vGǒ8%%%ݼm#myAp0??,'Z[[]?_@ P(8qK`0Xpv}CR0;;[/T܆8[RR!`c& _ɐ-(c闿%fNQsjj WЪ͛b /"FL&C&-O{͸kjjZಲP333\~i6*!:&&& 311gZd2d>O=eX@ a{III +JBłsnMO7GGGq\)x6}]DяV!?80L9J/p\p(nZJCCC466F UUےD$$IBeBлuOh൶b0VBhnYl6ox1::|3Ǧ`6,,,4|ck}'n#?xіeq885{$I####9M&Ӷ\˃477#IEb@4*H 6Xbh9&&&<&x<͛7J%ٵ{}%f_V$R\) ŤRF^|ф@nu[Aw A(blllk$6L&ej?t !gX%6JD gFu_;s27WJ&5#O!D&&D._6`2eR[hܜvPU5o'9 .\0. x< Xm7n'pM@HkuPx$[DʪXvRBI|h4B"@<YRPtZHQ mm)|t:4drVEuaPUD"Q1==]#?FȏFG& E 2?ԅ+IF<&jjڨnvvZXZZB,V‚J$24-۫hf( 5RQoQQq{'PH$rn'h4Z/r6-p3gKYctt:guR[ر,lX,dG~I2\B#M 9F0==Meemg2s(ZDQb2Yx1z{pTUat䤃#Gp>t٬N俟8X199Ybdƍ1vnw<[$h4'1NFoKLNJ\Ԅ?FM쮵C EY36j#0>>nEEE  4-yq <[Au8##2;x>^hJ[#E @ N&9[h"^"R  fu\ZYN4&2-!𑏘W hm(/o._~T*h;hv. sXm###X,/ֈ/**=Xǎy!}—u-EEem P1εp VιuM&"b&Fm$,x<=2|1&'s߁$rp&S7 "#G%}}/0;;H ~YFcдe%,tԗ"Tl TfO$刺?,gx5]~Ţ"G&ro0eUUIlg5\ Fm46unwI ._?,\٬iiM8Vb6U{TU]71#kpI]&yS_\vfg`a訓]Nlۇw @ pvwEsydlAWwE[,JA:,up8 dQS$mf*** h<3+͛ZE@QV'd{fⰕE NZZ׼_G6{vU: LΟCV^G<.d2}N:L5~ nI>lvW %x\%%=?A orBu%P@_#G^eYł/++{# y=?W_զC Fc2n1? L&tA~Moff&Wouu5UVVՇQUY &/##Bnm8`v6EUUKLzdԑNP*[mnEEEv_x{{rߋ|& ! Hb45Y6=/KR cc e A0iׯMz{ @.o"X3[~@UahHcOȲrjFeFGTT^18 \$N16&(m~d2tp8<Ϲޗ3@`E"4 p8AX{JpΞ|h;gE0,B9}EmQ*ꞯ?%DPR(;ptu(%V:&&ܟ04#}Qg}ЎSqÂuk\~z.vvkjjnN|UUD"\umhyoSTTT8B[ρY8~܈dmY+..s ^+ՠ"ZbW8.4nrK#*Bn/¤RH8H&s)Yf3>lhh#<2R `0({ aE9;`EٲY8160044hq TTTt755}W!4; BG('5fUFFR%nI( (--niiN{{7֪!3[K]r-wp0-a6b *,w:6  HHc)++[looӧO\`0> d2̾%hTW&xU06R\RR®jEp"^EzfsSKK?}\ᅲ/4RQQ=RИ _hqmbw(@2)L۰׃HL\o<裗W 39df7Z!ܒQ+AQ   Y IZj>Y^)hx\Ew%VХ`'x<س#5v Bv(xMAj@U9}j0@eYf`` ~轃P]Рg D"񜬋X?-7n݋bK-6,-kjUEQ6~xhfQ^^͝f%|%+lUh0"===C/|DQv5) 6ȲիWeQ"?fh.\Ze? hW\ɝȷ3 65Ԍ$I(.`_-I${@~~Ur+fb&iӻ87(ZNyW8z.\͋p+p"&i{T |`0~ fxN+* B*)FBcih6 *@uZC4mW2qtuy806+򽇂N~UU5iVJ:!L2<<0[,V+%d"JL&I&$ ,F)0\woLjj\nm16 amgϞfh4h4ڮ;,9A:mh=jC`Q#ww~~Vjuu={sڵߋb7N3=͚E-FEA; Wz? <]]{}wU{{׶2gϞ%NhS<b1w(qdʘ挰{`0$@J_XLqk8N6jy{F9vK'No>Vkݷ5֥=WEfFEQ hJ`H l,Wjk{=*윧}tnxGcR:mݨO /wEhؓ6nEmyd^Ǜb}tQ9~ϿwD r,{noǛ|U\7A@ւ<~ $vd N3lRoRTsOhE^[+A4mma|Dᙆ#%ߴ$3(gm]uuyᝐz( o@ p? oezsAFp8y,>/-"q'ʁ_[VF >iٲ:5IKKK_}ݷY< ,h.`5jØB'|>8ue|hL>]I k^74,p /uuu}L'BAxCh RsDqG oөSvߥxK O |qp8 8Yhc hIm7{:5hٝ4V[|Ax 3/wS {4pvǥkj&uue644;noqugЖX.vg+#hSЫhR:Α#TVkkk|?mhhnQQQx/BAx$|^~bZ:B+rVBe gu8z4μIDATǣ.x_|߫+u(un6KP"Z`)ZPɲbB^,G 1[GU$MM 473x^zz_Fq !OleߛId3 'Auul7n劊_z<(*{-88{,?ѠF?85`8'+*BDQjXd4Dsa,aۇNg_iinWv}n_ gϞ%}huppBlͬ;:VU-.Vv;)Sb`0$L&Sblq&8$ 䇖iS:Rl6kS (&DQLƸdY,Zhd/!o!6C0?8$C0?8$V2?#IENDB`3Depict-0.0.22/data/textures/keyboard-alt.png0000644000175000017500000001244612233244370020341 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<IDATx]{t}ޫ[W2X8Z# `%:6`ahzh===UDզ9=i(%MiZ-ڄ7Sl_ekkCrH;;;;;oogWR oafrxp9<\.G#rxp9<\.G#rxp9<\.G#]ݝCNp#dIRPA=~`/7lko똔a'EypSM0xmLtuw>`<_MK y?PUUTנ>G$h2P8!;׋ "uuߑ]ݝ@}~,X---bD<DZpŬano8'O'`kxb1ϟ믻S [jUΕ[/LLDN&h AAaaA@Xa߾:v; kDqQ1/^6$ !2A$2u|zg{U9eX GO|#-" E 6 /C$C:sS )WۃSÜFTW+P]Upeep6c0f|.mDͷk!JyuV!FV5yRH&8{JȫΨ. +@I(xd,z'#^}T*F1Tru)iXi BS #=u%ccw +#UKgp^ޕQB? D?  f6GĄP- 1ӀroRPW 1' vN @w:ګ Gǚ{M0ѣXoKJÃafF 9 r~=p^16d|1_|b084.q lIqdN5=Q3#Զܑ<oiO QmP0Qr-+гu;IH!!.&L+xW1287 k۶şZ'6~rJq'w #rg%#Di$ϷO*ػ4>op@(4ŎQ__oTOe8Wڬ퇠3PI !ґazw(/_1>WNj";mx+χƹ3kG[[* r ᝙GBA!L<;_68/ -=r;ʪ/ľmx˯].L>TH6ˈFcH4ov5'JY1E`,;D1GWMf}xH0p]]-;V#vv܅5kBX&|F-e0A7݆!B?[={6^{%PB,!aH<"ys[:}' غep;|"Ae Xv2=O`ӆ-O#r JX,iiWg J5'E_V$R,SO=#uj' ^ӊof7lķ[bS6X p+1:Ig/+pUW;uuAc,[ /9E ``% h_Ic|^}SXr ?|ppYK kƖ AGPqV7?iz&)`0Erȫ7ȟ ^Y]O@exVĖ2|q ֛-p]DI;_/ Ug/WsG}J/lp/; o(;ud󗖖<" lڸX J 걈Q +(>?ӨyP4 O@o(`-nQ)s뚻# `sk. h@3nc*Pr* r\"gWDn]mt~)W^u%G1#|ߞk/@I / ah(wZ8Ʈ/`2j޷J&ǹS)%zq*\ a_ZE60 C:~'4>̳\~oK>jOIL#u+'ɲoQG.F'6oܒfm=^ nY ªiwXTNnsZ]O5}<?G~8Ҵ·3_:Bzn}P7%!}LΉ$F-LΗ@('o`ִ4wPt2G@P,k.`&1[r\(LHuuk}gQeogpøbP(ݳ$k ] h X {Xzx'k_Pׁ?czKVDM9EK@~C>VoOo^x܍@A_v~on ئm]ӊ¢Bk]M [ suߓ't'@MqDD#ULjUGæMbw7VJ((yLBP[S+DO? Epvh>EEE8xBϋJn%2RɿBآKu,* #}M3:Ŧ DvM|t?hRJq#=A. ApRfA sm҃D–ӊ zQH3o|M1gk׮c/.g7ߟ_~0?#+u; !|WJrgժLjn+O@B{"}Q+8Z\.J(y)'?CC|PXut5z)MӞ=oBֻGԜoVͽ_W}t-Gt=إ.AnrGǟ{9=Gǥi?ԙCd'DS 6v_;q]|zEf|&S‘9@gZ7 oOƿa;8(RFKbcO)C){w@)1?Ci{b҆ڳ.B:̞=5&O1P(@Sc3c!c1{d Tw떗L~_s.@WIoZiKФ %cK(+)CA}/#0AVCQC>?{R?ا}?T<@"c{_fLLLяQUYp;zJp)TVTCL&0( (,(B},2UdEZûR`ddz$PGA D"f d P^nM$I gZ)`\ PTXP:52&&3S7a<2!RY.eB'Ӈd2| P2jkQ匔a||EB^iIٔUx P\\kT8ByyŔfduk&χZe'ӎDD;!L2lO ʱgGˋ@(g4F uO7g^{?/l _^{?SB$ D{AZ\p}:JK0>>1$i1Og 㠔"L;QPJpW!)ZxJqwq(-5D2`MZiA<7)e3$]ݝ] 45^N!8}vͻ:nӕMu T}ϟǒ%KPTTb73h,Q1t ð ]ݝx  P__`0 |_!$FFG10Џ>rxc) ]ݝ1=\lmLU(-s %)-wcKWpRNu,ͣf~R :&eI@FWwglFBav%jlC 03+NW}RJZ+9(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb$;] l:*)t uzd gjn˦BW@@JS@___nmdgyp؝xfphټJ+xms.89s\'."5 /38ЕsT'.t-Opcn&=R(02CG3PQ7s[6<."#384,ocy߰ÈX""38$HN+-tN3yER*ml1a>g۲@),l( 2CW;*o&oIxbYYZ„""38cx\tvrMKĮ6Vq0-J(Paa@u,QR_MB|}3z/agg838t=Q і~>swg5QxKpfp蛙^CNB@gS!?''}6o 338`5TԠE$Kyggxgp7`K!D x Ѓ/SEt&@*9³2|g6mfޟ$7EE097@Ǯ;O.9-Ds􂶌="o3CgPB@'!H! m~ Ź{su.D2C/lG "NBYDeY:򡷞ֹ¶A xtfpv' RPQBp33% \"38k}/39p,mP[: xSfph+vG-vIh"m p7/^sc|>i1#haHk?6sQ&%EhaNajܖMꬠxC[WU=tg,47$9)r}z#0 #ȿ=fIE7oyx x_go>t.}=tH &$]Yno#Fفoy's_"b< K+{*>|dH '29kS#ʩy, )6_3E_}dpaPW?v-⴬fR>nH6[):F6Cg$_>S5+EPA,Ggw8"|C)Q; )f.n?9M~ƪHF}BH}ԡX돞ֻIW,9 4C I#%~(OF;$ 9|RvtEĊlG~% L*Hlb;"˩wyn ߯c+Xm@Z2JB A8]Oҫˊ!g/fq*xXm:Ϋ8smϾ}#$[>PaJ|j; 7W5 $"_VjC@7HB֧olp`3# 4b/w _k=1Z9!69o={kթElX/~)Wa"$?/텭9tUZNu*57ʈWu ۛ>=g7G$$f$mGy:!{%ʦ|١ 7PEX;_܊wUakq=k(qZ Yn_e?_!E`?cD D Enyp=GDݺcϐٟ@-|"u'zH iBQj2Tm |~?|jD*4,,1{Ewp[x'Cݑ0{թG]XV'dF5sB(95~^!9U ZHnB@5MŖg3 sy!:s׫4_΢>|doc;CG(ȡUn:9TV> l\BKmhBZd>"vi9Z΋Ϯ3)DC1ʉRoe4ڗ X%#\hx{qj߳ur7׬rQ>8^L[-qAC}XҰ5} l۝O01k(;/n$H`\>|r )Sdx S#%F4 4m gr OOscKVhGNO5V˹EM8SW`;7?ӯ_ƕ%-=4R7C at +RA![0I6?;SK^%q,OL5?&O8%;o!~SR']"!@@cR" z YnA pv+qӃ;^ⱭWDC89|mx 3.rN5&nmTn0wJ ZwiH`jޠm{SY3ܶ4/_ٺ![UD|CCrI ≛,"v;(w>6}O`Z2\Uԏ_7SfQ>;|%}$݊bɐCpJTj^ȒU0/%S:?<ή#c3Z{ 1nyy;j U3ǎ5m{ֺh~5NSJB-B$I 힑w{ 07s7cTQ-~s$j4.Dp=Bl]֮Y{P$H{I(+ -y=SoQԺ_սj,'"XփU4lm IЁE䗟g14CۧM 2(B+4K^mw0>^QI~ @s {ާnDs4tlEsP_[A$qGinu`{(SIXt.='Ғ;hzi%9iZY{eVmVmsL>d T"B,A!,mg{ "VHh$z})\zsEk| xǫWNk= =H^%!xbʷ?O+X\-vY<5Zy5-DFYǭZ )ý)AM!S \ ")j 睇ZY}%˸`cvKP^,nᘓ2P/Q>QW,- 9 z6`iDhq_h trz3 6zw\*'}=tU~y_>mSBBwf]Ъ/Lp[JsF @KA:-}xk<ޠ?R [WqdL"-[N03P{HE ie- o]rh=Lp[JQ&@cH&HE KQ籇%99eTYEP7o/9c;xx^5F(@ƫ$Orы)Az.IXދHDXB}3 滃;WKHǬUG=ijdZ1?Fj$$auOP"#b󁕈=Qgg+lɝo,ܴ¿?*ߤIcջd/* j'!2ڶNճO;Lsmu @O# l  oȋpܱ"߾g`WsN,Ur ?6^5'0\W-U-ϱYquzi," ћ^. ߺgݢ拠T]5?ꇩD^ާVG( #d(jC;9tJXփL'ŪikCރeѣSv_8;}߁\x07h+PG^Jh?c$j*m)dnPzmp|jN#.(5hUCNB3x6z189_B!@/d`eK`}(([n6r؝hlDhN᜵i.ژư`&o`\;bo=b/*g{kc(rG#R?=ID*5[g- =%L̑T~ /9H/c %@ړfM=4Åi@p:&N)]smfl!P"!^ 4Aby" =0جYa]_9ϯ EҼ>4!t L Kۛຫ7[ACCoi^r>.ZFbϪ[;-.0$&9}m'zHh+@ V" XC:Cd05߻ZTyӼe^4'G>m+mO.+?@4[e. 87PKU7Cwxk'O SCOhǛ/uQ=nJVPVmr86V3l T'5($GüRr{,N#07E1NP:6i{B~rLZugxåYϞ@й}8ESm@wE]b?_iɺϱyI<2ps\<ەkekzSޤ/%IFvJ*7l䠤dQ'7 쵵:Bp@7\+?ժ+&} wg,Y)6'`%<y4[Mժ6_ nCq:=d!҂" ت)'\#oH_H4o@?1~l o)tY?Wc;etk^޶ 퐃KdȯS *!/$rȬddVgQw(*Ɋ> $y9i_?KX: UFIUgtFVJ[z_Eش3r;Zr)-IVw(N|Ǣx]\L!䱣:YۯsҼ4(wPmh/9~MqZ\{:zG?C0znYU <>'7GEٟبgP*;̉@&@ ȪK|(j%9$|m,~}t襕vb(0VsVO*~oX` 3Ӌ)ujv߶{yfΞ}Fjo W}S~"=߬|MLrG 16?1]2٪9n>N:;x /[k 9}tJ)t@ϖ0L!e}-Xγ`[mms۲hswS:'2ؕwI"U웁aZgٟ5aq/W_0{ѳ:zѨոlږ'ߍ"T"v *,,r<09~wߎ{L9lÃ'YL_n+A:V ڹF0%('A+r# :Z^ r\<~#S&X~y?F pA8#x9p*KFuÍh0,؟5fpcBSԈm5j# CNj79\%)ZrxC^^[ 00wkx}WYeGm遽%M,qI2ք`I<C'l^22tW}a=YyWs&<7{mh^sM?cȢIkZi]rD f#0Z,] IDATtۧ{[s,YYvZGrF 1Fs'nj@Vb ^%0P[ZMl Em߿| 8-cz`J#d ={g뉨CFbQ74<ÓG @V{m݋tmy kq~>; \:-4XM='a T%ur׾&섩!cOg6}uWP;1pd޵!5im-u^nR a4*b uF"i=r `ox}ۂ;H'\TɊ6zyBbVN;IPpf|yJŚq h8î<<.Y׮K;{0Um:PK!a,<7ka+\K~8ƄUW#z&0Vmv!$WP31 2zZdҳ. @u`늾y ZǪM<=]`;6X]eGM l˜B{Z_(p`y䌁D0& Di§8%4r]Wyn8d9\ ǫNjb_3!M⡙PV9Q{Lkkd#ZdMH*-6oWO-~yKiUiهJVjn!Rvte>{ł("uiyŲKMNcTA- R+H4tYC 1 ;w}5 {q[^ $pZ;1!ai`Id~p$S>@rR'5zYT%C2x!DirPoC/{ZE >+SY;7\ߩ#%[rLg5 Dvζ. cBկ7"-#%35ibk?DZaE)5)Xl0X &0ø&p aluKl0[n/ŏwl}yؓu= Y9Q"=^"5#b)88=qH FM{Qh- T `Jxqw3<+W5k+}ZQ|Yv`e,%`<6Fό & #WPhhZcʀ'aJ< W׬|`B%m,4NB;$bJG)6,lK`R}$! e AǨv,q,P,1 ۧa8W=i-lU:-wt#Ex.jJLbDd?OH='- l) pNSԺ0'XVtYOإi \R:icT݂ؓ\p*aQzbk `!bei.*Z&iE2N\$Qb9G}PQSr\;!ۺy- &ÁBua@gܻK__/M/b:'kR;s@L[xz{+pjx*wBA!oF܀?0<]iœ,Q|llŗYȏ>v=wY T {,$C栳 J'WV #]km37=ři5ty˲OG: 8\b'yJ'3X4;rmcniEl(Ԏ ԄU$OQaNW=T'gY(xGRp\oF;*A'b$m~or/ӥKKR:Ejm/&?y/n `KH*qX+V}B:!$vjPӎ}U>0MVq"M 3&)ҍKݢgc ڴp':Ú86?4v(Y.aPi|IO WtZbok0%@v`Wv{+p*re'Q+tW,=E81 R3)ڟE5QR׏x7} ؂,^RM^:!z5;Q[D_7X;v\!FsV/lZKjF&p- KK8{T)옆ѐ,J;LJ>ucq ox(/ x9PE4hI =pFZ e ά-^ގ*p2[/LU Q|*I8PŊ}|$N)E8L\FfDj>(RI J 3Yj1 (GA` b1>`p9\r/3Lȝ7N`I`Oꔇ<_j4$JfJh $(5?Ѓw|vK-aKWFW hp!aNONl\$ AgB<n__k Bvlp#ŐBj`e^ W>GG5njoI8evQ_bo,gIL$~6COZFk]KX~H8k{Ic)T2`!l{>[H5 sJ7SkV/-˓xzUiaDZ70 9id2`&71*Z &(.*]V% Hfι=w}#.L_I)z ᚕp;v* jߗ`_ K=P-!IM#l)AdX'M3u7ѭ}Eaa0zYD2@ېJͯ%Qu[io 8XY )p 9P-(ij\p rz}U>8'cR,>Ep<ڄN"k4*5vx 7WOկղ[FP#[}zQ}3??|P9[ًFډ6H%׬^>]8Oq{n-}'Վ8}^Ͼ X,CK g }/[rjL9}sBkz~R>i?X8eMYa82S%6! @/:<1͇ Wh[QkM 09drӛI*h7֭WUU0[Dq:x&6p&)DZ7ieM;gzhR?}CЖï7j߷,.QW& w]V֬^UMõkuz|H ܶ$rԒzpDP 3gȚh~P @j*Mzr߹јҼG^ E Kzt8럸2}%֬]G"@TZĽX&. oW,p~!nYτ־ `?T"T5rF@lj,pjۣ-0]"\P[{{_s&."P1$Їs݉†!q")DO&ҽɴ&ҽKh}IѓIe)?)R= ӗބH&D7)$H"NL%D"TDRT-dDBZ2A"ZB#LMlk"i M.B6i6iC|3 Hd07_=zE/ె@پ7XR1m;Tpvقb-M/ʛ~ֲf 9|S2Vލ'{~9'8IM@n_>4Ph+/^?~w +m/Z[g酄}/m5_Vi {>a"tIb@+47Ea&;r>cAka߅KA{#()F;¦"Za*f84麍Yj[>8l[0"+5XQH trJY QHf DӚ/?ŗ~39F۰F*.4/?0(9)w:".DU,S,3r-2]<@d/=ఄǾ_O X%IpaKE"kTw@an>ar-~r{Q]i^rpXCTkabLkP]%i{LG-zZ~PZfǿ(ငǾ_LO4&ENḎ@P Y?~ۧ/ю= +/ʾ_"<؍KƼǓŚ0N#NswI!4CꕮI{p@X~0%a.I,A54n;X8j'*h-&ă԰J7'&~ ?}o}EPPMA4ͶjWt<*ktl)@?\|!@BA1c-o}+3uIHpr|ّ"юz-~ V]x [Q:f%b|GT4aHz߄=NXp[ʃk',C?l;cmƳLr4X8t=?Ō=fu?o%_^{x+x{U*m'gD%v.fOSp $/β< ~)J=`%:33f_?z?Վ6jj.(wR!8xj>i7 6)a ܉Pre0ПN'-uncCțaS.Lf'f}ɟ[cj덳b@z5$$z?_p'}^>i @Gb' ,3$NduI C"s{|K~-I+hng}[^Р*o͢6@S{ߐ*̛_!M5yDLD= s7wybqZZ嵂1h\ Q,1q2P?F"Ud䏘XS-z-Uܳcs~IQB^_1vL-³4[b%0_Q@M[&>#WyF|e?m;+ kQ->  OOP/ϸzz }YTL34EAq"`ڝsIF!wFI(kwBwQeO#_DqS] G X `w1TQ4!-E~f9~'6k~;pdʇXrVC`<`h*0pM$2J &ӘbJj &=R`d%ك&c&{扂ѐSG&>a*ĚFf"t@B(oiBXH&@i\6)L;G<=\(Vk K244eDRF ˬ(U( &(fϑJ#;{o0F J-E}K#i=]N%Y[dZDBaقRz#|[;fJc%6Mb.{53/=h=b!=y B־I)uǽ#޻ oñ (h `yfNC"l9>%=`?!1--~#1|N>sϟR[q )oZG 4uTm.M S&<JcYCyʼnS?]4k`jzWE @TQf@% ,wn€҄Q찅8$P2u-W1{MC[ҘG?7b߫~y~;gMET|d|\_~lcqCy*?P]iH`NmjYIX% iR'e=&sx8;*7PD"̀V 8*¨'-A`'Lgx-(޿7SivJZGBO%T \2{P iYlUnW ߽>ʾWy"U4p={ꂴ!w$fѾp{ҴBg33['n?i ?ůsYK <@@{l9;nÞW{q 0r}A JVCpcM3>sNHOP:"Cb 2 _%B.J0{ #tzZG+iL?!]' fPMoձW/cO4z;+Mi`y* @BdBi:XOl /ɝώ|=GwPsN_˱'k:(7(h$L]hIG`6R oN܁`CJ՝_2}?f3;f{wGC\4Чl{0~'[|;oS^\^y *eԅܱ Ǿ'?s{Lu眰?j͸ꜳȡu\nlVz]_y/>K|~31F<C@{QŶSZt gc?<~0?|V&hģ_^WBpyDy}j9qxs_Y%%ANRݿg[܃k(U_UE E#޵_aIۮ/+q2Kz׮1r lZ-~31|(h\S&el9շ&3aSfU _yC,?#Q垸mhsҚ9_9Ky@0f<>XKSUdOǾ os/qI# }@?v~g\>&מu!`{=!R8w߸gދ_([P@IDAT᭽%PB@&'>gIŚˮ93\!K4P-~j+A;UWuQA@6 Kیr ЏMgs^YÄ?l'J,q R֝DeqII*7'By 5yyÄ?Aebp˳9ZMU}*(hQ껎_w[yw r}Y|*(h 4oKO <q9 MC@sBlPx|w5T}@@ '&0p'=|Z`WhZC 7Dk +G a~¢Z f*œ@@c{ J"~h`@A<&ʣ0gP$BIE@5*Aj᮵wו+4E#L A|Q*+9Tg3E-\;J+ڀp~_aΠM!z>a|)J$0D =(W(h3$߅zy".Fpfz.".".".".".".".".".".".".".".".".".".*qJyIENDB`3Depict-0.0.22/data/textures/keyboard-tab.png0000644000175000017500000001322312233244370020321 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//E(-tEXtSoftwarewww.inkscape.org<IDATx]{tUNwҝtIHH2yqtX@Wttc1٬3 8]wE] z<+Q&@ ytw:W֭~{V8& ˕n+ I$a0 `p08L& I$a0 `p08L& I$a0 `p08Lx37% kx0 6'|X o[`9ynR #쫩?ڌ"@}C]6&&;H G$@}C01m31Ac%IE>,:._,dݰZj8D׋ӇT˯K4_NZ:`z E(BS7h>Ռh4*FpCMuVXM?w { b`fe%n71zy45@}C])_ŋ"`hCCC4L\T).q8z0ζIQJjk+,Ν+ C}9 qp #?TX-VXJw# ,P@(N'\.tyY> y{6&Ƅ 7JdtIRSSv{rrsA ~χp( g3WnwCE,IFNN |t\lǷ]"䠧[2&L @0D07'QZR+0)/ (&H^{{04Rl :.]@ )OOwE*WXf`pM' QZ2 y_)HKsbR^>~h=ۂXGr-͸qgŸ`\Hwq#;;G8>!9(†4aSj+Āc6LR1y#_JJ ]Ym~ŌG/$)R8)q'O^0#x;X29}RcjEIqRIy * Xp9ӥޮqH'D* /O˥uhC.KhD;)Pt\IDBaHDpS ƌ5@jj*s"ʡˈ=^NAjpDaq`9G8aIk!E's9\ Ofi*&P%`Z(J|$`rٖx1 !/uvrOnp 8Nbl$*ǩMDw^ǂ~ 'kMڒ: '^񦔭W[!@kD`" {TĨsBwDB]'N$ VPH0" NI|~mV4W &e?ߋb;oO/#LnJrid5lM w5`b5p1(tzƛ  ')P0ӕG<ɐ?'́S9_#B W &8 :-xU8 [GũJ4e&8% ( &ǡfL$Jc>Gpa aNh0RfAB4}eXA|TqԹ& ISzWAh3GxsY7K@RBO8ϋ&`LB!|-щˆ)x w_ġCp:;;qr/~Բf,YtlZDs}xLڵǾ>.\.`X~k< 8OIa@e﵄KZ:P 1 |~x<|)^_xӇƇj4~mzزy+y]:=|i{nәv R[jOi |}nܽnDǶ #Q 6[sEB!kX}]HI4J@g#4U<]%椲lL0F#VJWM`0߫KoY9sRԛ.+5Z?M+êU?d-Uym|ɻgy8w#x$RS[:uI -5?y~rޤ.Tdgg3>P8hXJ*Cm=g6iAٴ2Ȏ &/_‘'0V陸iA+d!aBQ`O5bww7>?x>;`ɾ?o2`Μ, {ʉa[^Q.;ie*u&kDpˉ\P*N 1qΝ?fjjƩgrgN˱ޤ" m\@klv*W9'39v8HiiDq a`6%!+*8/\ JAx<>1B2 h_o"%tKkVtMr>+/h ;>On:V\>;/QrX) b(z9cIQ(@2{?p'P Pq~&َF׈5wTk1gl|;9s&fͪD5{6(#RŒh[p\+m҆}~&:H0<)")Z@2-"H(588yg*߱zn]q+̟/ [ AV0=gf庺zP< &#?!Zz!qH tʼrKn\pAJmаk׭%1HTJN/RKifR_7cL&?$M6Fg*U}{ٗd~KvZn@1D U7‘;j}Q=7A;Ey}8q⤔fa֬Y5c/> VrZ2 Uj߶3U "S x&oĽ7[zoMe˫'8aH,b,BK3[ZZpsrBصkW]5U~y@ ;Wߍ߼`J|@n*|Rzݎg{z.uLgH`5ViZC<ս[֮[;ߖ>1_9stj)RRlpǏc7Kqͧ*Xux Qi }fJj͊m۷+pQ>AW&|DAhENm߂opTQ(Bcc#5Ǝ_ǿsG{X"y'D[$xXS Y@#M"C@lS3Eigć{ Ͽ tp8Xr%ow"%Ŏ%ƞ]eEjK/m۷PiiiwnL$A{W%PYYұӅE B?ߠ+S6D|1?VIX-@ C!mz)Sh"868G|㨰Əފא8FC8s4{ɓ`:r:0U]8X>RMN6iڢbHoVr3hѣO1RR H9vWGvFx\S\!q0b`EXdL&J\0H88zE|GG+ kNT["kI;)(};_ةIՎsS$55m .^ [(($`ax 6VU `GW ZxTܼ+&@4P~]|vf.ƍ^B/ŴA&FtGF8.VZ˚1cƸ| Ρ|L+-.sSa@/-5B f# d}`1/Hő/ (ǤT׭[m6қBs\/I琟_L~tpĸpitbaEKiH>h;"u`\t"ӑ# 5D# c;>~b3͉,]H6󡧷}#21^™٬l q,ڂ,&NDrw$4 xM;V\ppp(F[-VLӿ qjd|'& 0"QrZjrtr#.dzߣ1!8z!ӓ5v6 #(2c^JI(?JRO8=dZ E4$ảG(BHtB`X>>A4GiTww73cm~xTW Ǥbxxp8t3i`}LSÁp8 h \hB G~^\z3 hlx'OjƧ~b<IԄe*, rs SF"GOO0yš:cn&V\@Mu퇱8e$P `gf" r$4X`ՁGT!1F}CP\se1 6.AMza0 `p08L& I$a0 `p08L& I$a0 `p08L& Im|CIENDB`3Depict-0.0.22/data/textures/Left_clicked_mouse.png0000644000175000017500000003645312233244370021547 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< IDATxyUOm/Y:!$BH @* 蠢:(rgѫumwq{]n#.(^d4Iwg}Vu[UUZ>|ꓪNU=<9爪b0&'B`0 acIDd|SD>$" mDEL %D6N@lo}YU?]&.F BDp٤ ROC&0xF)jgLT8>Jpq̙0xc6/VL co 0xxb1kK$e #O]1n@0`"cuˋ#/Oɋ#/rj+b$ P+&F ^@0`"c d #/b< 0xc)/VLX9/VL<Q@0`w30_ؖ'[&/""S_s(:{-\" 艨۞߿Lb!"-iɱI#Y&PgSy k4.MNdEvv/s mc!"V4>?@76U=[&'FVT.o-@Dfȷ Ui~LFLY㊮Wh|4`xwW߲IsE\ > UIl^@yW\""AADŚ~4ï~.e[Zݕb4@4("E!qkkwgj!)Fr?qmN-^YhOfec%ˬh#9">XﳵX|}l2ED/`82 |PUdFCzeÊ, T(  mg&<*p)F?ί}XP3ѐFrRUbI KEX.5YT Uݐ3Fr݊>$+0ƎlT*"/71<TY>80cQd)BhGDESX- Q ?W#U5k$x@m*Ve|LoUBD.Wn~,b<<\- 8CU\HbQO2O"U]_1߻ Oc xsvE[A fq|{aŬmc<<yI24^oDd68g_UmkS #yBm:ܙO{DdG^'O7 Tz<<1-}j=$.on\[Dx\ժze@C0GP8W#^gUi=|k5Uܙe7&gںu+v}9ktV&zȕ=b<ԿnX8. sc%S'E&,g@ʻ+Y`=`dCQ@`6OD4x0ʏmr ~EP_{Wj-5?`tvIzF&?(.P؞Uov-Zh[By#VzE(_7E"iR\A@`O(-V鉋XIEᐢ.Vh{bOg='lWdӂw JwV3U|O`M~\U `*E|{zZVSӫl,SkF9ZPݾbGrX2s)|K*p䔲O6߀;ִ?#"~X;  ,PT18O(E[Sk_sN.mUߏ5 o+ S 7DdZ0MGT&[Pc5 aM kڇE|zI]P?: *v]"Rd(v(?jDu~fduV?6a-ioXRwEtADFS&)|@U[C^)z8ӷħiEopy0 E?>|Ֆ<#"`fpҠufT̛Šv>ۑhSSv'N:tV>w^Ĵe|>uuuqypA^z%6oޜaD~_;7ժ=?P&ęZ[{NijW@Ϝ;gW*nDd&0XYY@MýW'P&hhhW^'O:ʨ*p2z_1 ""_10`z_B_-LRE{O+ڷ8"k%*Omm-OHLui]9{lf޴4~1uֱvZˋ/Ȏ;ez|YD\cv2b[W)ET+k ^Tmݍ jp XQ~G///$,]˗o\fk[n[nҙsD顢j_,MD\d? NeA?_{`0aWZןHŔ)Sx׻H$a[Ρ!G1}pAu瀻TisU~wBD;0gj9?|SN D"Ik:0@g igܰyâ| ߣ(--xGB<`*sk"F|4{1y*%+{]8\{c)<8cC0%Dd6z }>ǘw(w]Bmya{stL>ع6d#?plj^敬WD7/ 7)4\, "Is7G_ fУnJKK1x[ƉqKWM"o亪 a֨*h4+3Tc`tZ}˩)2x^k&&soXsM}6վFDD7|>ڴ4/KNDUuEsLAj|t? ʥ] Eo'Zo Q߿TT}XPY٦ۓ]7 _qEަqV\ /#G)^u !99D6EG0Uw:{سDDnI aVZx˖kIzZSqMZ΂ 糖֑y~ @Ex/ة%X44vI"ְL΄3~F{|1vM |UAenxXQtVP$} ~zog!l. w^EO=8^{m&v-ź& ɋjJ6wW#ho!ÞBDsgx4Ski>zָZ@2fΜʕyNo r~߇D_NOT%PTjż}O{`Ϝj'7x9hꫯ&L{t)ֵ1d@^3Zi{5U<E֟x?W4o끨% >-3mݍvayXN#Jy\Q{(.@uu5\rI&1^@doj( zPc]a?? m9@mُvn,KR \ve6IkdHeUՎU[_]m> <[&p#dhc6_=o-(I?gj9)phPRRi2#'J|KSv|Z"=ZUms#w~f_לoFoS7|7- UVQZZnXʐKLsfz鮟(![ȯs抹=+C'vw6h9㙉sO:>u3'ZDX)+Vd4ֵ2xP4T}"|Vc#"^Şs+Xvn̂=ZoORDXzu&ů3  ̙GzT|ve@-8{{dM$ WiОup7i\ ?Ql]5+agTHsINQ;۾8X^z-}uigTx~I;G3guuu;v,ݏB \ +vL=pZUųT}^?!n@J&X { -Kz:M1wZ6l-,]KC?iP\?w%K2i_ɆԤ5tI4έɵ-Y=8' @DdVXLhjj&m]F瞓K;rk¢9k Hu,9zOID#Y MKfؚ0Q)ص50y^^\API @ee%uuiM^CsI!i?%W <[NsL?Gs׍кyM[^ҚZʧMgj|͙d^ -.80`CDj6膃|]tw twчhh鲫(:-fy%< H\c7kn*Qo:?32R__nq?560\ĀOba=5x ưa jUL:-!>eOa5eR1c&%US2[JSTIZpἩTzK;{|᧯20>nþw8c~TV! DbjD>; FFdpO.:rh8\TÇ3ϰm6$0Hinag3{o6,5QVAW3, qkv%+gVtF# twQVu{ga޽:Sմ'LTX"̜9H$V>vB>||o[JUš;,wJѤ;+ 2|by6 /IuV}Y:\yy99=ùٲX1`1Leܹtwwo>9~kfvfQ^v v @TR 8>}Q6ü\yXp!-~2&*F,Ƽ]TA,YŋʶۓOls[WsfL=Q ćػ?G=pB}{7nᆕ}E3_WP=+  1VAeӿu?NKK ڨ0ŋP_I]KB+/`H? 3}tf̘ڋ/fϞ=l۱IH_n8/7`~]%w]ny+GwiK &og7 wE488Ȏ;hiiuԲ,] R^Q1ܿOs2^\߳|2V{.Gc˶mڽ;՞c||7jQo_ +nD➜4 s4`rG}b"0 NIcǎl۶={$vildeml*YVz;cklL84n`rϙ9Yؾs'lI+Dyl[mMApnAi%bUӂ"`ړ}}.AKO>ͮ]ضm]///gҥ,_a,S2Ph<7ϗI%%%ZիVqa6nĎ]z~I;ɧ9ե\p:@<pG}b"Ҫ2斏2=cTAk⏸w8 ev55,Y+VP[S3gOF׫vv2Fb8eee\f k/Nv;i;p i`,:6Ȃc^m:GeW~\#̙,]%Q7}zN\zy':F`:;b.]>ɶ;J,]6쪋2{aՄ\Cm~<8Q !gf,Y1|Vz;\9ة`\tᅈGpvO oᣱWP"!wB]Ǽsi WlDNj1ODY]_ϡ 2jGZx >;>$'X<E *0R9MAn F2@uRweEę{+"[(10Q " 7;upwQw<. فĆ>.Ϩ$y"#ɽ8#6H^ u ;tlhod(/J2|?"l':Fp_8#6$;mx]ag֠~LU~e}^. uVhz )^D$aZ p{/I_̰Ho=d 0I(@t& %HKP+? E ^%.V`]Kce qx^[ KedQOD~ő?[`r{^#`RFk M1^ćbI>2q[|@݀#| OIsЉΤDoWkup!/127`eWr/HKTA@#6$x]-r q߾чsaP=p)ڀp.9VuV~!5,'.>?%`eƉ)ϤIC!0s}.cUZDaYZ+1۸ (& {=oN)?- AE i7 Ə7`е f @.˵8.@bsYpW~?݀Dnnz` x]܋k -FV/ë$?8F=,I 0浟9u$!h˝l1*}jp[}c ~17;pp` U=g߹$x.@7,){r$zֿ{@Á@tX^"N  cw8n=CMpXk.h49^o+[/$v H l;KWM? =QW{΍)w70boUףَ݀>xF?B؏2@yzD"}:Z ZOVIDlKN:iXu ZmP^' c[]3clk-S&bLg#Y9I%"Fl!YD'O:C*N8xJ3#GMmvY4رcQ5(-)Iŕܐ$ADHD*--u8<{9ucGIII4ճHNAĺFpСy8a80ֺ (v.+-M?|!nT@BWɆ݀vt!8uïh*@ k=G0µ)ƁnD%$)E8#"peeyCCC>\{F<ط<c10:Lv#G`a`D"rݪT8h_%Oȯ dfQ`` Wl3U6  UffmfȲ Z 'mmk(&j%F`_kvy2ku9s$UeݎcOkm^ S# O+cǎ4i?pC\Sp HX08kwCرӹ{[ee%v_zH= |d*+)Ix9ct-1:U{ʿŇt6"aw%Pc?na(/'<F20&mp,Fٱ;M:;;9xXmMMǻ5C2ib D1/`ݎL5غmuiI eeeZ,E صg;TS]mCcphM[ۿqlʔ)~kϞ=81!(>:ܹ1]pvlxǢP(U_Xb Cv޽)l[EQ6j--~>aעuӦݻԢY 6Qnk+]CUyyDZ Lg#g]!rNX deq{ϞMXgեj۾k׾Z8KA͜>Q̐p8+SMUU%fN%v<$"uG+**׿"CC&1-]^~zmT"B]]]gyh3 lt3fpŖY\H:uloD? d8غ}{X^];v$dazaS*p2wB``lپY51}zDytFa}K ]]c f?ز}2u` ;wC0kDy~|V<|-[:M:dObs816ov\D>nraF\ SO9B̜1#USm;^ s'FĦ[/x KV'LzpR>^7}zº{ㅗ^ʗi<c@ys8%1DK"klh=ɦ͙C(J?!"_*#9M1qGӜ9iIH?z hìY {.8;,c GiaADY(F"~%|3/.{!zGH$ƒ~OR*+=kVT߈^ٸ;i0c6l[DqOd6m= &}엿k봪JC|d}ٰqo d@kI6uxF] H_= &#Md~SS Tψ-vv /HGG7T#:Ͻ|dAs3>_Ҷ翀>H+Dnz2O Y̾VqpqX略ͩZ +=ibv15W 'Ǡk@uW^|#6 k}GTF#]uwC?t%Yu9Nǧ_ڰY8 1P@.Z۸bC0Kix׳xB3gxGxmӦ{~?Q[]^ܰY91P`.7?9ªJہthqV,_[p8S=c?@e,??ae};׿} gp^[~ɓ8tp0d\n fMz{{Y=ruu4Ξ?yopiB1.J߁HqXa\q饬:<@NgyiÆWTT4gN~{lxK֬y-`^5ʦ5՜bK/fɢETUV w~[GP 464X$p /L·! k׬i~\cǏs!RqD,]ٳښjkj(--%ӧ9əN?;ٵ{.hmϿY c(.|~_U9u4GY/ :lP(93f0`߁e{E3׃8.@E2}}}9zcǏ涞TWsΌLMr@U{E0FK/xRcwde"(tvuqq%BTWSSUEMݏ&>ő81Pd\z%KwUD"tvuCCC ÄaA`JkG^ג)e/m`HK*<+;"5\ڕ|zK k`,mor kNkQ;0<{<'O3%F&8W[fӀƊ=N? l|FO05F IY`0&19TpIENDB`3Depict-0.0.22/config.rpath0000644000175000017500000000000012103473656014754 0ustar pcuserpcuser3Depict-0.0.22/test/0000755000175000017500000000000013451744172013441 5ustar pcuserpcuser3Depict-0.0.22/test/manifest.txt0000644000175000017500000000170112270276631016005 0ustar pcuserpcuser#"Manifest" file. Contains the list of files that should be find-able with # 3depict. Used in unit tests. #Syntax is # [all|lin|win|mac] # path-to-file should be such that locateDataFile(...) [src/wx/wxcommon.cpp] can find it #Textures all 3Depict.xpm all atomic-mass-table.dtd all textures/animProgress0.png all textures/animProgress1.png all textures/animProgress2.png all textures/enlarge.png all textures/keyboard-alt.png all textures/keyboard-command.png all textures/keyboard-ctrl.png all textures/keyboard-shift.png all textures/keyboard-tab.png all textures/Left_clicked_mouse.png all textures/Left-Right-arrow.png all textures/middle_clicked_mouse.png all textures/plot_zoom_reset.png all textures/plot_zoom_x.png all textures/plot_zoom_y.png all textures/Right-arrow.png all textures/Right_clicked_mouse.png all textures/rotateArrow.png all textures/scroll_wheel_mouse.png #Startup tips all naturalAbundance.xml all startup-tips.txt 3Depict-0.0.22/test/ref-images/0000755000175000017500000000000012274544011015450 5ustar pcuserpcuser3Depict-0.0.22/test/ref-images/plot-ref.png0000644000175000017500000005235512274543770017733 0ustar pcuserpcuserPNG  IHDR IDATxwtU}?,`DcA)b7( bK%"6 (رPPP@@ALb-{Wzk33眙{=UUvY                               Nn`m< dNZx/R$Q.dBZkwIry[m_ 2ɯ_(N@?7A$7lRIq:_oEWZ;>K $wNrL+W>!ٰk$$J$ WZS_gG2lq䄪$G$٢.p$?IT}Di,Vk#ILBZ}E4,Ww_D-%yO=!SlOJ XmbD-tUKkm,PCSYFy^xV[`z `}@VO*Y7Kr!]-XnI6ߠ{ pF_wz0!jȺ L ƿ l$Wfx%S`*,`0S-Zk V۴~(I֪\ e*uk'$y9vs$Itn]<0oW<399od +ϯ3k[MKY6d5~@&?[@@V6d ;&8&K{dI?dj:)m0q+zZL[a`$0u}$Lv]N=8 LX]oU`[Xu]@&zX֗L-\/ɞ&'ͺm;?zOU}CU\`*ukg%ӰMIUOV~rdz0>6I.Id$Mr[&?,`u3յ$Ik~* L~*Yڠ{  mKV0+ m$W0?-L|L%}.L'l`TwNqMYu/[Yq+z` zL,L6iX|#`5[_06TWd$7NבbgWe + \7NI:-Y[= k ĪzckU7IЭz\km9>YY:tuUջf;Kn]c?ck-,CsU=pLKQ?n@YkuCV54rn5u\dX@7!IOZ{&I6x,z UIJy$qQoY?;eI~=`WU qAWՓf9IWjV LV5=t  Z{R͓|m+ ˿$ZKKjK&@JmU]0]kMugkx+bpEUPն*r\VUk}4d|\L =Xa&yvkUnөIn䕯Kn$zv#u(z+ik'i`־odJLrF-R} Vd٫'yo$9?_U2bUrXJ V׵5F*{6]1oڭ/ X`w5W䰮1nWII~d$Mi$]ϐ%s \XX@Uӓ9bM0 "SU{'9<kU{yYXUնUՒ'I1INIGoUu|ƙ z`]-Ɏ&g$;n2έc/ 0ZU&Rvnpȗj9L2=DI"|W6 A2ɕ%?tSA^? @ &~_GX[C[k5z-XI C[kw;,'YXJYzkc9%W `-gw`%\!ZkNr$&9SIdӪu[yޛ?XU@l7gm/%9 ^A%yV2,4G,zy#`Z_@`ӎjsft*@ט~?ɛ|9ɻ2þOlkf˱uǏ$wmQUϪVjmIvIrbS.B{,C`yyuϩ%:5ɩ|:ɭ/T՗WA>! XN '&3#v9=ɇY9)SuNPUJr 4ɏc]<"ɓ\U) ?[,F/WIvg?$٠[CO%y{oNˆWU8n~=}^~5d[Z{DkE]!qt 6\e$g{pJE7?ϑc6;sxOL$$þZϧ֕ B&\UoYyzj y1I[}@UwԮ8Ff$#^ XU W_ _Ůӆ\hI L<ֽj$V/?aIX>7ɇQc%~`SU:d}~yZEyA%!F4ٞF ېs/},ɿ5S׷L܅ȃd}XkzoS#鮸oUuz=CU=u3gyO$%IU!{qCkU>.b=ώ,p,@os1v?Nؒc\UW%UΛҺ t3O[1^;dpGsU>r} ?YUG^>9b?iEv"~?aC,pez+c4Jߓkj$u di ڿ1}G4grPxE. Ws`U}zĦp׆tU2K}P?1Ψ^;KEUUg.bGl(ɟ, 9ߙ@z=yԻFl:w6r ~?u,cB\6[~:<_F@oږ3eR/ ˪ օ0 od&]?iIrXk3h_RUQ`TխZkdnA;d{ '݁ݶ^Uz w񽽮!ޙ֋wu!]ϱO0 T+olyegrP==j${C[pXf |sGej}s[k$5{KٝZ{GU=ex"K7 O>dݖ>m  $[Zk;礝t$&9rA$Nיo< ɮ7I~3 å;ݽÖ"QViKVO靟Z{rGVՇk~Ⱥ#&y2R1d݁k;w&yRn@ot? $iFR^da\ӽn'q6M~EI_O^koyWՑ˭:nj}(Ah݆<ҹrU1>q |nHcnƁ,|$o>& njtZ;'Sc zskԪ:wNk;I[S<9%3Uu:~)`$&j4; _!TՁӍ~4Dw''9`]_Z; ^8f#j=0slI\U⬼^ߪQd$yTUԠ3$EVqEgun˼'VRGLb諸*GXIw~sE~7?jNwt'/9QI z3bMJ˨}dȺE}hkmbX#@ |o8nd\{$-s>:>]᭵h:Lu$nX/m}jȺ.Qu)A% -S>xzUuI64XľC}qwHU/ΟNI2lZ]ZkY<~͓ wV kEx]osLaC=e#oyԥw̒O .Pg'1 ,a_5tn;~WUU8gzcZ:ȋq^$=dӝI>=dӞsLj!i/IԪ:bĦֶC f6w#jl9~iRq ,#6ꟍ|ۨ|;'wc YE*WxuGpȺoTY~=I:ߧ!I^ۍ`0d;U5^54vLrF|`Ȧ=[koZ;nO#!{TF_K?C6r$^5$̰@|wh-[k$y{[dX.n Fq ,_֞ZۻKg ֞ZڃzUu QW^]q̷17Puª2,exH=lW?dj9!a3ޮա"RxP.c^6q'yG&D|1Ckk5ˆo=pF]Zk['h=nD;7j}U؅ ,ݷKk#^Saq9KaTo~ސ=k%o||`)=dڇ+w5Ooӈ[koIrDkynkӒ||Z;ѳw־Z{tk]|kb֜A!Iޝ{Wk3uy>xŧ4^ZkȐ[OZ;7sg95ΪUU2ZUɅRt8S#,$oȵM_li  X㭒\4nlǜ5cOtU],6䵜맪,&rJU* IDAT=&ǿDc7f+IH:cڹINq#7Iί/Բ/ ں9Ih%I08 v$WX󙋧Neھ2n$?LҒ|r')zIO.T2#^] ^Isy[kϮ/SWoW]=U%.< EfjӒre}.Y>?izsjWKr$8 'qT{|RYmXN1)JU:bRcIS{xdT}RV;c,#UF5VU$]=Cu8@'5 @` .t<.Gfj@[kr D>_UNm6䤮W[Wi 0Zk[&%Kf] uYWCI.O>sxWY^f,7I$$&yҽ('Va 4˫0L7-dUu*/>;%Y?9䷳g5dz,Kd$&|7VWq:շIaSfj0mM=Um YINc{֦ /Ibd=V㒼N׎tW $GUWdŌ\GXNrJkZkȎ+?'٦Z7;#.p3v#+] `!| +jߵ<7'I6;dj |WJ,ee5xaVsL 8̹U6|xzza[\Um]0xmeUz,57VL2rV/k4g; ՃK\$:iRII;ɛfZ\$LzA;}U}[/NW:&"}f}8vm?*SWՇYoLC<]n6U]%NI^IC9UD]w൮:$YW2dn$7iUoUKzTέr<~ νc&mxڐ?QC?y_VovTUXӾ<>^H5'!u VwtU)Zߒl&VI{]U_U'tݪz[U%ɑC}ua[UXNc%VyZ{^vMrToScމ3\}oƠϰHoÇF7ػ|Н+PU3zު'87F!i?ɞqDZېU)bgz'}-/p+ݻ3Q;U3,$ /:wX ouB61þ_-$h{6þ)v<[ ޼W-x܀dב:nH/͙>WO%(0!/-?Z":WU4}f9qs cSz? 9qi<DzmdzCD3l Moғg6{pO>O$~c3iL??g;X/T+c7;|W|~(VVf M[Ս]_qmE_e#~ߝz'-`}EAw๷Q|~_?DzӐ4.cTK僻؇Ŗβߘ3pf97oӔfA$٨v}('yG Y7:i\v͆pvz[kƪ s1wߴYo;T,;]~}8ctٿw{V دo]ߌV*okfӐg .S^DV<`7LH녊壙 P~„R|6:$w &ydo]՛-ݦ|<yY5?1Lv-?1ů’;[kߨ|}IowcY6m9ӳwt=#u`ۿ 1h>ebE8?N/Ӆ HU} FruOܨ/  :HUn"ܥWϜeq[l^6;%yW_3Ee.a#l"kvlZِmc(WUeG.IuWU_㩿''8߬E!S Z _X+UJnbä헜UUVձ2ds<1_B6/gwϩ/@zOCi~&yKFֿ~|RXAg Ӭlԡoc< a! ~3R?gG?̫!3s[d(,']ߕe1Cd`NW /<wϐuϵGLEz節IJ-rrM4GZFb{f kzvV7b`CqLd19y[~k }yU~#͵~Z!߭fvhkFl,>z``ܫi]5d`v>sK!/v7"0Gc6 Yy{.qGu>Q/)=UU/` Yqwf8׌1`Y68t>'F7,c:y؟C-k7'xO5S-=^3ǩ9ˏ>붼?'1T),+W~hz@~&c"X&EzmU=4ɋFުE=7sQSnA"=vjUkyB5Yn8>{yn0N/e9Kx|^O ɾʹ==xW^^UcҸwd'y n# }xio#|~s|On1zPodwȚey~`{O[yH InTOH<_$v{yO|z{ޮvX6pOm ɨ?G i0ơKjyӟ:>\>v-"YrO/ky:#ILr*9SU}+INֻ*ɥF}zrڷbzVc8d$͵ow~b%d6K7!2h[.eI?Oh?[{Zi]}ېP,̡vtoߋKԇW3$NJٷ@8+"7u; K~ym!$ۭ|d (gf$X~xoMvWΐߒ+L}c5#3_4ǧ{Xo\%ߓOC=9w357FU?b{.S*k>͐A`od͞ $xD}ߐ:*@WN[WL'm'$o`1~g ߖY=H9+,/c|zί=S'kZky#WdӍ!?l[E>cgHfggo3o$wys^9-}Po.3,FƮ?my}<̓{(Vz=޽!mD) V_v$51z_;$uį6_ x y/;Zkowlkwʾu=#Y"|5 5| xGU}C}Xe^o=l.~=ՈԪ,CKf9dǁ?0d{y|:6ᖭefnhI7x9[?VБ#wٓEUu_fV U 91V^GVdZ?ROrQk+$9Yjg{hO;xoz=w^I~(i>˧w ɻ-Yp>~~ v4~YU?@k9_v+kߵy0 :rwbǮnqCEsԇf궹}u[y{Ankz}/#zV/ ^Z/ufw20{k/F]}TCoDmIzI6\'!/IHs3H2xډZkg`]ʿ6Y'jZ{@ky>ׄՇ;k#fIWM{:]}$kyZkZ;ې+>ªzNa^Zfk݈/~jT>t]N=9}uڰ;X >'dxpZ;`z%5%ؒܪ68ėg:77%UoZ۽ڏ:c@zLETo&WI~fU5)Pjw25_[]`dkqaTW[kw5W̵>&_UZ"׌}\{ʭe[LO嚹 z,i]ҥ$Hr$rBAX^ZnFa-]UHo7LO!PU]^kz?r>Nj: p^cԙ[kYv˵fUM"$6KG)ӝ|,=}n;\JR+$-b祻)~ *7UmBLr2WTە3w258[vi.SF,g5VL]xQW~{&l$tbb1$Zt7>\4o=nIҪ\$e*Sk5">gd}ְ~kJp w~Um'k7_9ITU,sdا}1I~?F`$Lrz>ɶI>鮴LES8ݕ`$ iH{'9i$LEn_I=dLoNw%H%9?Ʌ J$LE\Ir$TBv7'|?#ɿh=+IK AYXmUk ߩvt?Ѳ@%RU'&yto֞Zokm1;Z{c\3`|Fn̍X +[kJr;t y{T4bLEH4X^A{%s{~UzXZkh]s_W^A/t9~l'ٲ^ֲhh9g1UeZԼțdj9l`k1j鮦T̒ZkTKSU)y3l{Ӑc4%{X=2ޜdngwIҺY bW!U~sS-[ l;ZZk5?:þkU^0%4H_>leU]jeXnH rU>V[@o;ɣm͒omkt6F $Svj]*}kmԨ͔pkm}(X"]| Zkok=vDkeġ]/tiJeg1$ wY :/ :v$/cwU Cg~9r@xikI2ni,/X>AֶL򘮌I^<á?Mr JfI6Ho'UuLVUrɪԭ}4C[?VUs$ItF$)|'YTI~QU $V-e1O:=dP,jXXi.}H YwѤ'' %Y;9W&Ҕ*qCIjfGw9$G$UIn?0Ǻ$wMUP0޸𠪮tߡ{@ =UuyUޒadJ`q\.ɱS%$kjсݽɧPpS/ߕaS|ﮂ%-ɥIz' n3OwD$?Nr~1_ܔNtCWIHrm~J$_Kr`QPIpv/[/${  `Uӆ6_ݏưj>k[cVILѪگ7H`u3 _75y, YdOsKTՃ `y w%`A13uc=op_Uثad{]|3?𸪎_d6߲ oT^ .+jcUzp;edK]UOYߵ>X}65>F Yu&Y;zFw?u* :$k\"f˨OZdډ(iLU%yЮu, ;IKyCoyyLҕ#۟$-qTՉ1>$$9I 9,ߞ~WU항?4#ϟQUg,$Sl wN`rM~hSFl$g/lww-wأ7yg 7mAm>wGEU=] focq%P0?7j)tk(t6@ʳKA<UC Yw2!I~2tUE Dw?4I^__ԗJ@wc- ǝN(.6v)]INi~:9(2Ap=gdTi, E[8U$'@w-EsOs (`6TVU.3Iv$}hTտmݲ_GOQUy~CklkMw?cI:\, VolP plǏltd$MR;x_cop?NrU&C\Ig}x;%Ecߜ#6tU1`nc-p#}yw/.O˽{ ?*Y7b' 94ɳ{Øǝ䷳[] yx$OrĄ<"Uufw?j\p@=\;"^ˬ^ݯtwsKrPG%\T1P|G&y`+I,uw}A!6sGNIMݏND `54&z$P08Xok7Iv0f]ݒ-P0y,k$|-I6{KLŃW=&=yUb *ӷ^PUN`tUu.^%[ LUuL~'d}%xk;'v$'}pbSݛ+0I}fU+FK} tN`%d Sݟ0)d$N`#9N`%$'gG%~,;\% `eW$"U^In$&awAZ X8S>`fTWꬪxU' f$y8&7@(5G&M1)6@+I&nc XYI$%$2@+W(3{8\P @7o%̷%%ɮP0.M%fQ(o-(P @ @(ٵF̡]eu̳n)0_KCݏ0|ytI=<6 XyLrmw&q (P @ @($7/vI(̯KlIY [@ @(YF̡],>Ue[Kbd$s_lV˒I61G"\gIݛ"Pt̷{'up@r%, I~*(,% 'I>!"X5"`R$4I2wfS@K`69I;,G9>I-VՅzt'5wU RX:0 1IL($%yPߐ28iyygOa'"cINƘ$_w^w̋n)0_IY!䆑}0%IsI6B#=) `Eq@P P06@((~nLNu`(P @ @(PP @((P @ @(PP @(P @(P @(@(P P @(PP @(P @((P @(@(P P @(eے=IENDB`IENDB`3Depict-0.0.22/test/ionMapExample.xml0000644000175000017500000000043113414250067016712 0ustar pcuserpcuser 3Depict-0.0.22/test/dogtail/0000755000175000017500000000000013416427306015062 5ustar pcuserpcuser3Depict-0.0.22/test/dogtail/test.py0000755000175000017500000003152513416427306016424 0ustar pcuserpcuser#!/usr/bin/python # # test.py - Automated UI testing for 3depict # Copyright (C) 2014, D Haley # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # #Ensure PYTHONUTF8=1 environment variable is set in parent shell, # or imagemagick will complain. I've not yet worked # out exactly how to fix this in the code. Decode doesn't seem to work. import os from os import environ import traceback import subprocess import time import tempfile import struct import array import random #Dogtail imports import dogtail from dogtail.config import config from dogtail import dump from dogtail import rawinput from dogtail import sessions from dogtail.procedural import * from dogtail.utils import screenshot from dogtail.predicate import GenericPredicate #Python magick - wrapper for imagemagick (no docs, afaik) import PythonMagick as Magick #HELPER FUNCTIONS #--- #Create a predicate from name/role def element(name,role,description=""): return predicate.GenericPredicate(name,role,description) #launch the colour dialog from the main window def loadColDlg(app3depict): viewMenu=app3depict.menu('View'); viewMenu.click(); backItem = viewMenu.menuItem("Background Colour...") backItem.click() colDlg = app3depict.findChild(element("Choose colour","color chooser")) return colDlg def sameImage(fileA,fileB): imA=Magick.Image(str(fileA)); imB=Magick.Image(str(fileB)); return imA == imB def appShot(application,ycrop=0): time.sleep(0.3) # Wait a fraction of second, in case image is not very static shot=str(screenshot()) mainFrame=application.findChild(element("","frame")) xyStart=mainFrame.position; xySize=mainFrame.size print('App shot, trying to generate imagery') im=Magick.Image(shot); im.crop(Magick.Geometry(xySize[0],xySize[1]-ycrop,xyStart[0],xyStart[1])) im.write(shot) print('Shot written sucessfully?') return shot def find(target, someList): for item in someList: if target == item: return True return False #--- #Close the program def closeProgram(app3depict): fileMenu=app3depict.menu('File') fileMenu.click(); exitMenu=app3depict.menuItem('Exit'); exitMenu.click() try: reqDialog=app3depict.findChild(element("","alert"),retry=False) #For some reason, pressing the dialog contents using .button(...) does nothing # manually use keycombo to quit if reqDialog.name == "Error" : dogtail.rawinput.keyCombo("o") except: reqDialog=None #Try executing/aborting the file->open menu def openTest(app3depict): global overrideImage print( '====== OPEN TEST RUNNING========') shotBefore=appShot(app3depict) fileMenu=app3depict.menu('File') fileMenu.click(); openMenu=fileMenu.menuItem('Open...') openMenu.click(); saveas = app3depict.dialog('Select Data or State File...') tmp=tempfile.NamedTemporaryFile(delete=False) tmp.close() filename=tmp.name+'.pos' writeRandomPos(filename,100) #Force gnome's annoying dialog to actually display a # place to type hddButton=saveas.findChild(element("File System","table cell")); hddButton.click() fileText=saveas.findChild(element("","text")); fileText.typeText(filename) saveas.button('Open').click() shotAfter=appShot(app3depict) #Point data should have loaded if(sameImage(shotBefore,shotAfter) and ( not overrideImage)): return False #FIXME: 3Depict bug! shouldn't need to tap space # after loading file - should auto-snap to bounds #Press space to tap dogtail.rawinput.pressKey("space") print( '====== OPEN TEST COMPLETE========') return True def filterTests(app3depict): global overrideImage print( '====== FILTER TEST RUNNING========') #Fudge the bounding box of the # cropping region to exclude stuff like statusbar # - autosave, progress etc can affect this CROP_FUDGE=60 #Locate the data tab dataTab=app3depict.findChild(element("Data","page tab")) #locate listbox with filters inside filterText=dataTab.findChild(element("","text","List of available filters")) filterBox=filterText.findAncestor(element("","combo box")) xy=filterBox.position #move 5px beyond the box so we can click the down arrow xPlus=xy[0]+filterBox.size[0] -3 yPlus=xy[1] + filterBox.size[1]/2 #locate filter tree filterTree=dataTab.findChild(element("","panel","Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items.")); #We can't interact with the tree using dogtail's # accessibility stuff - the tree doens't appear. # So just use the dropdown with undo dropdownBox=filterBox.menu("") dropItems=dropdownBox.findChildren(element("","menu item")) editMenu=app3depict.menu("Edit"); undoMenuItem=editMenu.menuItem("Undo"); #Single item on each for i in dropItems: #Range filter pops up a dialog, # needs special processing if i.name == "Range File": continue #Node is named "pos data", press "p" to activate it filterTree.click() dogtail.rawinput.pressKey("p") dogtail.rawinput.pressKey("space") dogtail.rawinput.click(xPlus,yPlus) shotBefore=appShot(app3depict,CROP_FUDGE) i.click() filterTree.click() dogtail.rawinput.pressKey("space") shotAfter=appShot(app3depict,CROP_FUDGE) if(sameImage(shotBefore,shotAfter) and not (overrideImage) ): print("Image didn't change before/after filter") return False #Tap the refresh shortcut, then refocus dialog to # kill tooltip dogtail.rawinput.pressKey("F5") time.sleep(2) #Wait for refresh to complete dogtail.rawinput.pressKey("space") #Tap "neutral key" to kill tooltip shotAfterRefresh=appShot(app3depict,CROP_FUDGE); if not sameImage(shotAfterRefresh,shotAfter) and not (overrideImage): print("Image Changed when refresh from cache") return False editMenu.click() undoMenuItem.click() SHOT_BLACKLIST=["Annotation" ] #Select the pos data item again filterTree.click() dogtail.rawinput.pressKey("p") for i in dropItems: shotBefore=appShot(app3depict,CROP_FUDGE) #Range filter pops up a dialog, # needs special processing if i.name == "Range File": continue dogtail.rawinput.click(xPlus,yPlus) i.click() shotAfter=appShot(app3depict,CROP_FUDGE) #For most filters, there should be a visible change if not find(i.name,SHOT_BLACKLIST) : if(sameImage(shotBefore, shotAfter) and not overrideImage): return False #Tap the refresh shortcut dogtail.rawinput.pressKey("F5") time.sleep(5) #Wait for refresh to complete dogtail.rawinput.pressKey("space") #Tap "neutral key" to kill tooltip shotAfterRefresh=appShot(app3depict,CROP_FUDGE); #Pressing refresh should do nothing if not sameImage(shotAfter,shotAfter) and not overrideImage: return False filterTree.click() dogtail.rawinput.pressKey("p") dogtail.rawinput.pressKey("del") print( '====== FILTER TEST COMPLETE========') return True #Try opening and closing panels with the menu, # check for change in GUI def panelTests(app3depict): global overrideImage print( '====== PANEL TEST RUNNING========') viewMenu=app3depict.menu('View'); PANEL_TOGGLES=["Control Pane", "Raw Data Pane"] for i in PANEL_TOGGLES: shotBefore=appShot(app3depict); viewMenu.click(); viewMenu.menuItem(i).click(); shotAfter=appShot(app3depict); viewMenu.click(); viewMenu.menuItem(i).click(); if sameImage(shotBefore,shotAfter) and not overrideImage: print ('UI did not change, but should have:') return False print( '====== PANEL TEST COMPLETE========') return True #Try opening preferences menu, and activating a few items def prefTests(app3depict): print( '====== PANEL TEST RUNNING========') prefMenu=app3depict.menu("Edit"); prefMenu.click(); editMenu=prefMenu.menuItem("Preferences"); editMenu.click(); prefDialog=app3depict.findChild(element("Preferences","frame")); #Get defaults tab tabFilterDefaults=prefDialog.findChild(element("Filt. Default","page tab",)); #Walk through all the filter entries in the list, clicking each one listFilters=tabFilterDefaults.findChild(element("","table")) listFilterEntries=tabFilterDefaults.findChildren(element("","table cell")) tmpDelay=dogtail.config.actionDelay; dogtail.config.actionDelay=0.05; for i in listFilterEntries: i.click() tmpDelay=tmpDelay; prefDialog.button("Cancel").click() print( '====== PANEL TEST COMPLETE========') return True #Try changing some of the view options def viewTests(app3depict): global overrideImage print( '====== VIEW TEST RUNNING========') #Show colour dialog colDlg = loadColDlg(app3depict) #Set the colour to black, remembering orig #-------- #The first text field is the colour hex code field hexText=colDlg.findChild(element("","text")) origHex=hexText.text hexText.typeText("#000000") colDlg.button("OK").click() #-------- #Take screenshot shotBefore= appShot(app3depict) #Show dialog colDlg = loadColDlg(app3depict) #Set colour to green #------ hexText=colDlg.findChild(element("","text")) hexText.typeText("#22aa22") colDlg.button("OK").click() shotAfter = appShot(app3depict) #Colour should have changed if sameImage(shotAfter, shotBefore ) and not overrideImage: return False #Set the colour back to orig colDlg=loadColDlg(app3depict) hexText=colDlg.findChild(element("","text")) hexText.typeText(origHex) colDlg.button("OK").click() #Toggle axis shotBefore=appShot(app3depict) viewMenu=app3depict.menu('View'); viewMenu.click() axisItem=viewMenu.menuItem("Axis") axisItem.click() shotAfter=appShot(app3depict) #Screenshot should have changed if sameImage(shotBefore, shotAfter) and not overrideImage: return False #Restore axis viewMenu.click() axisItem.click() #Play with fullscreen shotBefore=appShot(app3depict) viewMenu.click() fullscrItem=viewMenu.menuItem("Fullscreen mode") fullscrItem.click() shotAfter=appShot(app3depict) if(sameImage(shotBefore,shotAfter)) and not overrideImage: return False #Leave fullscreen dogtail.rawinput.pressKey("F11") shotAfter=appShot(app3depict) if(sameImage(shotAfter,shotBefore)) and not overrideImage: return False print( '====== VIEW TEST RUNNING========') return True #Try saving an image, and see if the file turns up def imageTest(app3depict): print( '====== IMAGE TEST RUNNING========') dogtail.rawinput.keyCombo('i') saveas = app3depict.dialog('Save Image...') saveLocText=saveas.findChild(element("","text")) tmp=tempfile.NamedTemporaryFile(delete=False) tmp.close() strDogSave=tmp.name + "-shot.png" saveLocText.typeText(strDogSave) saveas.button("Save").click() ressel= app3depict.findChild(element('Resolution Selection','frame')) ressel.button("OK").click() if not os.path.isfile(strDogSave) : return False print( '====== IMAGE TEST COMPLETE========') return True def writeRandomPos(filename,numpoints): f=open(filename,'wb') #Inefficiently generate a whole bunch of random # floats in -100:100 randomData=[] for i in range(numpoints*4): randomData.append(random.uniform(-100,100)) s=struct.pack('>'+'f'*len(randomData),*randomData) f.write(s) def runDogtailTests(): environ['LANG']='en' # Start program run('3Depict') app3depict = tree.root.application('3Depict') #Tap escape twice, once for startuptips, # once to remove any autosave dialog questions dogtail.rawinput.pressKey("esc") dogtail.rawinput.pressKey("esc") #Run various tests #-------- if not panelTests(app3depict): return False; prefTests(app3depict) if not viewTests(app3depict): return False if not imageTest(app3depict): return False #This test does not return 3depict to # normal state, leaves file open if not openTest(app3depict): return False if not filterTests(app3depict): return False ##-------- closeProgram(app3depict) return True if __name__=='__main__': import sys global overrideImage overrideImage=True #Check for existing 3depict instances data=subprocess.Popen(['pidof', '3Depict'],stdout=subprocess.PIPE).communicate()[0] pids=data.split(' '); if not (len(pids) == 1 and len(pids[0]) == 0) : print("Cannot start - multiple program instances cannot be run with dogtail") exit(1) #Setup some rate parameters dogtail.config.defaultDelay=0.15; dogtail.config.actionDelay=0.15; dogtail.config.typingDelay=0.15; dogtail.config.searchCutoffCount=5 #HACK: Skip warning at start dogtail.rawinput.pressKey("enter") #Just complain if anything goes wrong try: testsOK =runDogtailTests() except : traceback.print_exc(limit=2) print('Test failed with exception.') exit(1); if not testsOK: print('Test failed.') exit(1) exit(0) 3Depict-0.0.22/test/rangefiles/0000755000175000017500000000000013262772702015560 5ustar pcuserpcuser3Depict-0.0.22/test/rangefiles/test1.rrng0000644000175000017500000000012313255724637017514 0ustar pcuserpcuser[Ions] Number=1 Ion1=A [Ranges] Number=1 Range1=21.00 22.000 Vol:0.01094 Name:A 3Depict-0.0.22/test/rangefiles/test1.rng0000644000175000017500000000051312103473656017326 0ustar pcuserpcuser10 6 Aa Aa 1 0 0 Bb Bb 0 1 0 Cc Cc 1 1 0 Dd Dd 0 0 1 Ee Ee 1 0 1 Ff Ff 0 1 1 Gg Gg 1 1 1 Hh Hh 0 0 0 Ii Ii 1 0 0 Jj Jj 0 1 0 ------- 23.00 24.00 1 0 0 0 0 0 0 0 0 0 5.50 6.50 0 1 0 0 0 0 0 0 0 0 15.50 17.50 0 1 0 0 0 0 0 0 0 0 26.50 27.50 0 1 0 0 0 0 0 0 0 0 6.50 7.50 0 0 1 0 0 0 0 0 0 0 8.50 9.50 0 0 1 0 0 0 0 0 0 0 3Depict-0.0.22/test/rangefiles/test3.rrng0000644000175000017500000000453012103473656017515 0ustar pcuserpcuser[Ions] Number=3 Ion1=A Ion2=B Ion3=C [Ranges] Number=42 Range1=31.8372 32.2963 Vol:0.01521 A:1 Color:999999 Range2=63.7905 64.2793 Vol:0.01521 A:1 Color:999999 Range3=65.8300 66.4600 Vol:0.01521 A:1 Color:999999 Range4=67.8400 68.4250 Vol:0.01521 A:1 Color:999999 Range5=69.8100 70.2550 Vol:0.01521 A:1 Color:999999 Range6=66.8500 67.1800 Vol:0.01521 A:1 Color:999999 Range7=32.9200 33.1850 Vol:0.01521 A:1 Color:999999 Range8=33.4250 33.5500 Vol:0.01521 A:1 Color:999999 Range9=33.9250 34.2550 Vol:0.01521 A:1 Color:999999 Range10=34.9250 35.0750 Vol:0.01521 A:1 Color:999999 Range11=40.1692 40.6397 Vol:0.03021 B:1 Color:3300CC Range12=60.3107 60.7970 Vol:0.03021 B:1 Color:3300CC Range13=61.3600 61.6050 Vol:0.03021 B:1 Color:3300CC Range14=40.8200 41.0750 Vol:0.03021 B:1 Color:3300CC Range15=120.7344 121.2780 Vol:0.06041 B:2 Color:FF0000 Range16=122.7150 123.5700 Vol:0.06041 B:2 Color:FF0000 Range17=121.7650 122.0400 Vol:0.06041 B:2 Color:FF0000 Range18=68.8150 69.1600 Vol:0.01960 C:1 Color:FFFF00 Range19=70.8250 71.1100 Vol:0.01960 C:1 Color:FFFF00 Range20=181.1350 181.6250 Vol:0.09062 B:3 Color:00FF00 Range21=182.1500 182.6150 Vol:0.09062 B:3 Color:00FF00 Range22=183.1700 183.6250 Vol:0.09062 B:3 Color:00FF00 Range23=184.2050 184.5450 Vol:0.09062 B:3 Color:00FF00 Range24=241.5300 242.2100 Vol:0.12083 B:4 Color:0000FF Range25=242.6100 243.0600 Vol:0.12083 B:4 Color:0000FF Range26=243.5450 244.2200 Vol:0.12083 B:4 Color:0000FF Range27=245.6050 246.1550 Vol:0.12083 B:4 Color:0000FF Range28=362.2900 363.4400 Vol:0.09062 B:3 Color:00FF00 Range29=364.1400 365.5600 Vol:0.09062 B:3 Color:00FF00 Range30=366.3000 367.3300 Vol:0.09062 B:3 Color:00FF00 Range31=368.4600 369.2200 Vol:0.09062 B:3 Color:00FF00 Range32=184.6400 185.2400 Vol:0.04542 A:1 C:1 Color:00FFFF Range33=186.5500 187.3500 Vol:0.04542 A:1 C:1 Color:00FFFF Range34=188.5900 189.3100 Vol:0.04542 A:1 C:1 Color:00FFFF Range35=190.5900 191.3400 Vol:0.04542 A:1 C:1 Color:00FFFF Range36=92.3300 92.5900 Vol:0.04542 A:1 C:1 Color:00FFFF Range37=93.2700 93.6100 Vol:0.04542 A:1 C:1 Color:00FFFF Range38=94.2900 94.5800 Vol:0.04542 A:1 C:1 Color:00FFFF Range39=95.3100 95.5800 Vol:0.04542 A:1 C:1 Color:00FFFF Range40=64.7700 65.1100 Vol:0.03042 A:2 Color:FF00FF Range41=65.3500 65.5200 Vol:0.03042 A:2 Color:FF00FF Range42=67.3400 67.5000 Vol:0.03042 A:2 Color:FF00FF 3Depict-0.0.22/test/rangefiles/test5.rrng0000644000175000017500000000017212103473656017515 0ustar pcuserpcuser# RRNG Created: 25/12/0001 00:00:00 [Ions] Number=1 Ion1=Ab [Ranges] Number=1 Range1= 1.62 1.93 Vol:0.01234 Name:Ab Ab:1 3Depict-0.0.22/test/rangefiles/test3.rng0000644000175000017500000001235512103473656017337 0ustar pcuserpcuser19 59 Q Q 1.00 0.00 1.00 L L 0.40 0.00 0.20 N N 0.60 0.80 0.00 P P 0.00 0.80 1.00 QiP QiP 0.00 0.40 0.40 (PQi) A A 1.00 1.00 0.60 QP QP 1.00 0.00 0.00 (QP) QP2 QP2 0.00 1.00 0.00 (QP2) AP AP 0.00 0.00 1.00 (PA) AP2 AP2 0.00 1.00 1.00 (P2A) Q2P Q2P 1.00 0.00 1.00 (Q2P) Ne Ne 1.00 0.00 1.00 QiP2 QiP2 1.00 1.00 0.00 (P2Qi) Lr Lr 1.00 0.20 0.80 W W 0.20 0.00 0.20 WN WN 1.00 0.78 0.00 (NW) QN QN 1.00 0.69 0.69 (QN) L2 L2 0.40 0.00 0.40 (L2) Qi Qi 0.00 0.20 0.20 ------------------- Q L N P QiP A QP QP2 AP AP2 Q2P Ne QiP2 Lr W WN QN L2 Qi . 1.0300 1.10962 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 2.0163 2.11575 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 3.0325 3.10725 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 4.0288 4.15775 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 5.0025 5.10762 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 6.0088 6.11788 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 7.0400 7.10938 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 8.0550 8.10008 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 9.0238 9.11133 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 10.0850 10.1050 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 11.0525 11.1012 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 12.0650 12.1575 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 13.0600 13.1963 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 14.0288 14.1688 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 15.0488 15.1113 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 16.0388 16.1088 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 17.0063 17.1550 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 18.0900 18.1950 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 29.0613 29.1275 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 20.0362 20.1325 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 21.0350 21.1225 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 22.0925 22.1938 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 23.0888 23.1900 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 24.0688 24.1963 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 25.0288 25.1700 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 26.0613 26.1100 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 27.0538 27.1475 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 28.0100 28.1500 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 39.0525 39.1312 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 30.0163 30.1388 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 31.0400 31.1275 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 32.0688 32.1738 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 33.0457 33.1363 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 34.0086 34.1225 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 35.0928 35.1812 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 36.0410 36.1150 0 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 37.0373 37.1875 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 38.0868 38.1175 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 49.0840 49.1850 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 40.0900 40.1625 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 . 41.0941 41.1375 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 . 42.0791 42.1500 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 43.0935 43.1450 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 44.0928 44.1513 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 45.0442 45.1300 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 46.0887 46.1100 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 47.0585 47.1813 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 48.0908 48.1488 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 59.0206 59.1813 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 50.0921 50.1788 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 51.0367 51.1513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 52.0866 52.1288 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 53.0863 53.1263 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 54.0868 54.1313 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 55.0385 55.1950 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 56.0822 56.1200 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 57.0828 57.1350 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 58.0012 58.1525 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 69.0057 69.1100 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3Depict-0.0.22/test/rangefiles/test7.rng0000644000175000017500000000007512103473656017337 0ustar pcuserpcuser2 2 M M 0 0 1 N N 1 0 0 ------- . -0.5 0.5 1 0 . 1.5 2.4 0 1 3Depict-0.0.22/test/rangefiles/test2.rrng0000644000175000017500000000041712103473656017514 0ustar pcuserpcuser[Ions] Number=3 Ion1=A Ion2=B Ion3=C [Ranges] Number=6 Range1=1.00 2.001 A:1 Color:A033FF Range2=20.00 21.00 A:1 Color:A033FF Range3=32.00 34.00 B:1 Color:33FF33 Range4=92.08 94.00 C:1 Color:FF00A0 Range5=39.00 39.98 C:1 Color:FF00A0 Range6=40.00 41.00 C:1 Color:FF00A0 3Depict-0.0.22/test/rangefiles/test6.rng0000644000175000017500000000017412103473656017336 0ustar pcuserpcuser3 1 A A 0.60 0.60 0.60 B B 0.00 0.39 1.00 C C 1.00 0.00 0.00 ------------------- A B C . 123.456 234.123 0 1 1 3Depict-0.0.22/test/rangefiles/test11.rng0000644000175000017500000000045712270276631017415 0ustar pcuserpcuser4 10 Aa Aa 0.80 0.80 0.80 Ab Ab 1.00 1.00 0.00 Ac Ac 1.00 0.80 0.20 Ad Ad 0.00 0.80 1.00 ------------------- Aa Ab Ac Ad . 1.1 1.2 1 0 0 0 . 2.1 2.2 1 0 0 0 . 3.1 3.2 1 0 0 0 . 4.1 4.2 1 0 0 0 . 5.1 5.2 1 0 0 0 . 6.1 6.2 1 0 0 0 . 7.1 7.2 0 1 0 0 . 8.1 8.2 0 1 0 0 . 9.1 9.2 0 0 1 0 . 10.1 10.2 1 0 0 1 3Depict-0.0.22/test/rangefiles/test1.env0000644000175000017500000000044412103473656017333 0ustar pcuserpcuser#This is a random comment, # -first numbers below are numbers of ions and ranges, respectively 1 1 HiggsBoson 0.0 0.0 1.0 #This is a comment, but the next section is the mass windowing data #last number is multiplicity HiggsBoson 110 135 1.0 1.0 #other useless data 1 3 5 3 lalall 3Depict-0.0.22/test/rangefiles/test12.rng0000644000175000017500000000074212270276631017413 0ustar pcuserpcuser4 10 Aa Aa 0.80 0.80 0.80 Ab Ab 1.00 1.00 0.00 Ac Ac 1.00 0.80 0.20 Ad Ad 0.00 0.80 1.00 ------------------- Aa Ab Ac Ad . 13.8794 14.2981 1 0 0 0 . 27.8655 28.2919 1 0 0 0 . 14.4333 14.6733 1 0 0 0 . 14.9400 15.2000 1 0 0 0 . 28.9467 29.1733 1 0 0 0 . 29.8867 30.1133 1 0 0 0 . 68.7993 69.0600 0 1 0 0 . 70.8533 71.1000 0 1 0 0 . 196.8867 197.2867 0 0 1 0 . 43.9400 44.0267 1 0 0 1 --- polyatomic extension 1 1 AaAd AaAd 0.80 0.80 1.00 ----------------- AaAd . 43.9400 44.0267 1 3Depict-0.0.22/test/rangefiles/test5.rng0000644000175000017500000000027312103473656017335 0ustar pcuserpcuser4 2 Ab Ab 0.60 0.60 0.60 Cd Cd 1.00 0.00 0.00 Cd2 Cd2 1.00 0.00 0.00 (Cd2) AbCd2 AbCd2 1.00 0.00 0.00 (AbCd2) ---------------------- Ab Cd Cd2 AbCd2 . 1.0 2.0 0 2 0 0 . 2.1 3.0 1 2 0 0 3Depict-0.0.22/test/rangefiles/test8.rng0000644000175000017500000000007512103473656017340 0ustar pcuserpcuser2 2 M M 0 0 1 N N 1 0 0 ------- 3 -0.5 0.5 1 0 . 1.5 2.4 0 1 3Depict-0.0.22/test/rangefiles/test4.rrng0000644000175000017500000000124612103473656017517 0ustar pcuserpcuser[Ions] Number=9 Ion1=A Ion2=B Ion3=C Ion4=D Ion5=E Ion6=F Ion7=G Ion8=H Ion9=I [Ranges] Number=15 Range1=11.877 13.29 A:1 Color:CC00CC Range2=5.93 6.17 A:1 Color:00FF00 Range3=28.812 32.3 B:1 Color:FF0000 Range4=13.94 14.44 A:1 C:2 Color:99FF00 Range5=15.03 15.47 A:1 C:3 Color:00B200 Range6=15.89 18.43 D:1 Color:0000FF Range7=37.24 39.88 A:6 Color:999900 Range8=43.54 48.89 A:7 Color:CCFF00 Range9=57.43 60.95 A:8 Color:B2B200 Range10=73.44 79 A:10 D:1 Color:66FF66 Range11=27.3 27.81 E:1 Color:FF6666 Range12=25.97 26.29 F:1 Color:009999 Range13=23.87 24.29 G:1 Color:666666 Range14=27.85 28.33 H:1 Color:000000 Range15=0.98 1.13 C:1 Color:FFAFAF 3Depict-0.0.22/test/rangefiles/test4.rng0000644000175000017500000000021612103473656017331 0ustar pcuserpcuser1 4 Q Q 1.00 0.00 1.00 ------------------- Q . 56.0822 56.1200 1 . 56.1200 57.1350 1 . 58.0012 58.1525 1 . 58.0000 69.1100 1 3Depict-0.0.22/test/rangefiles/test2.rng0000644000175000017500000000103712103473656017331 0ustar pcuserpcuser7 9 Somethingium So 1.00 0.00 0.00 Eleysium Es 0.00 1.00 0.00 Element115 El 0.00 0.00 1.00 Testium Ts 1.00 1.00 0.00 Protonium Pr 0.00 1.00 1.00 Higgsium H 1.00 1.00 1.00 Fire F 1.00 1.00 0.00 ------------- So Es El Ts Pr H F . 10.00 11.00 0 0 0 1 0 0 0 . 12.00 13.00 0 1 0 0 0 0 0 . 21.00 22.00 0 0 0 1 0 0 0 . 25.00 30.00 0 0 1 0 0 0 0 . 32.00 34.00 0 0 0 0 0 1 0 . 35.00 36.00 1 0 0 0 0 0 0 . 39.00 40.00 1 0 0 0 0 0 0 . 59.00 60.00 0 0 1 0 0 0 0 . 70.00 80.00 0 0 0 0 1 0 0 3Depict-0.0.22/test/rangefiles/test10.rng0000644000175000017500000000026012270276631017404 0ustar pcuserpcuser3 3 In-P Inside-Part 1 1 1 Out-P Outside-Part 1 1 1 Bd-P Border-Part 1 1 1 ----------------------In-P Out-P Bd-P . 1.0e7 4.0e7 1 0 0 . 4.01e7 6.0e7 0 1 0 . 6.01e7 1.0e8 0 0 1 3Depict-0.0.22/test/rangefiles/test6.rrng0000644000175000017500000000050312270276631017513 0ustar pcuserpcuser # Number of elements and Number of mass ranges [IONS] Number=2 Ion1=A Ion2=B [Ranges] Number=4 Range1= 12.345 13.456 vol:12.110 Name:A A:1.000 Range2= 22.220 23.100 vol:12.110 Name:A A:1.000 Range3= 100.142 101.330 vol:12.110 Name:B B:1.000 Range4= 44.320 56.680 vol:12.110 Name:B B:1.000 3Depict-0.0.22/test/rangefiles/test9.rng0000644000175000017500000000024112270276631017333 0ustar pcuserpcuser3 3 In InsidePart 1 1 1 Out OutsidePart 1 1 1 Bd BorderPart 1 1 1 ----------------------In Out Bd . 1.0e7 4.0e7 1 0 0 . 4.01e7 6.0e7 0 1 0 . 6.01e7 1.0e8 0 0 1 3Depict-0.0.22/compile0000755000175000017500000001624513414250067014042 0ustar pcuserpcuser#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: 3Depict-0.0.22/config.h.in0000644000175000017500000000763413414365641014516 0ustar pcuserpcuser/* config.h.in. Generated from configure.ac by autoheader. */ /* Dont use pkg-config to locate ftgl */ #undef FTGL_NO_PKG_CONFIG /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the header file. */ #undef HAVE_FENV_H /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define to 1 if you have the `ftgl' library (-lftgl). */ #undef HAVE_LIBFTGL /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define if you have the GNOME XML library */ #undef HAVE_LIBXML /* Define to 1 if you have the header file. */ #undef HAVE_MACH_MACH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* PNG compilation OK */ #undef HAVE_PNG /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* qhull compilation OK */ #undef HAVE_QHULL /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `sysinfo' function. */ #undef HAVE_SYSINFO /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Have got vigra headers */ #undef HAVE_VIGRA /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `size_t', as computed by sizeof. */ #undef SIZEOF_SIZE_T /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* "Enable mgl2 support" */ #undef USE_MGL2 /* Version number of package */ #undef VERSION /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t 3Depict-0.0.22/ChangeLog.txt0000644000175000017500000010657413451744172015067 0ustar pcuserpcuser* 4 Apr 2019 : 0.0.22 Features: - Voxels can now be "masked" to allow for "open" isosurfaces when dealing with e.g. multilayers - Some filters now support "ion remapping" when reporting composition - This allows cluster ions, e.g. TiO, to be expanded to Ti and O - Expansion is specified by a "remap file", given by user. - Add Voxel Load, allowing for raw binary (floating point) or VTK structured grid files to be loaded - This allows for volume data, e.g. from images to be loaded at the same time as point data - Axial DF sweep mode - this allows for automatic crystallography detection User visible changes: - Improve error handling when loading rangefiles - Fix binomial method (property broken during previous update) Technical Bugfixes/changes: - Increase use of std::move() for mild performance improvements - Fix spherical composition profile, can now be normalised when no range present - Fix bugs with annotation properties - Fix some minor state file problems (some properties not fully restored) - Voxel properties now centralised - Update range reader - Minor UI out of sync with backend errors fixed - Fix infinite refresh loop, in some cases when using monitor mode. - Various C++11 updates, through clang-tidy - Remove SHULL from codebase. - 2D scatterplots now save to file correctly * 17 Jan 2018 : 0.0.21 Features - New ruler mode for annotation - RDF normalisation - Better feedback to user for console messages - Camera rotation controls - Voxel export dialog - Local concentration filter mode - Experimental volume rendering support (optional feature when building), this includes custom "transfer functions" i.e. colouring. - Density Filtering mode in spatial Analysis (Development : A. London) User Visible Changes: - Crop control can now use Shift key to lock crop axis - Fix vxel state not being loaded/saved correctly. - Fix cache bugs with colour bars in voxelisation - Fix camera orientations not always right when setting camera using buttons - Point density code now much faster, using KD-Tree Sphere intersection algorithm - Fix in local concentration mode, upstream filter propagation now consistent in cached vs uncached mode Technical Bugfixes/changes: - C++11 supported compiler is now required. Most compilers should support this. - Property code underwent significant re-write - Can now switch between QHULL and S-Hull (shull.org) convex hull algorithms at compile time. Shull support is experimental - Fix for downstream pos data + ion colour combinatoin resulting in black displayed ions - Various edge case fixes in range loading - Fix incorrect double-refresh when using drag/drop - Implement DF-sweeping algorithm (not fully exposed to user) * 04 Feb 2017 : 0.0.20 Features: - Add "TAPSIM" file loader - All vector input values can now be specified in ISO31-11 spherical co-ordinates, using an angle-bracket notation, like so: (in degrees), example <1,10,45 > - New "voxel slice" tool (cut voxel data as arbitrary plane) User Visible Changes: - Local Concentration has now been renamed to "Local Chemistry", and the function it computes has changed (was n/(n+d), now n/d (n-> numerator, d-> denominator)) - Filters in tree can now be moved using a "splice" operation, which moves only the filter - Ion colour now has an "auto-bounds" mode - New colour maps : "Inferno" and "Viridis" - Improve progress during ATO file loading - Binomial mode did not work in many cases, due to grid construction bugs. Now fixed. - Anisotropic scaling now fixed - input data should be able to be given by user Technical Bugfixes/changes: - Fix for crash during drag-drop operations - Fix spatial analysis set operation: Union. Was not implemented - Fix hang in local concentration when using the same elements - Fix Stem/Bar/Step mode when plotting - Fix morphology plot not showing in cluster analysis - (Source only) "openvdb-isosurf" Branch for OpenVDB based voxelisation and isosurface construction (thanks to L Gartmair) - Added french and spanish partial translations (fr_FR, es_ES) * 31 May 2016 : 0.0.19 Features: - New "Local concentration" algorithm in spatial analysis filter - Add text and VTK export to Export Pos dialog - Experimental Background fitting in spectra User Visible Changes: - Camera re-orientation buttons have been added. Previously you could get a similar effect using keyboard shortcuts, eg Ctrl+Space - Fixed breakage to monitor mode - Only show erosion clustering parameter if bulk linking is enabled - Fixes for hanging when loading some files under windows - Fix broken point em/replacement (set operation) mode in spatial analysis - Fix missing and incorrectly labelled denominator property in voxelisation - Refresh button now changes to "Abort" during calculations for all platforms (Previously windows only) - Fix loading of rangefile data in filter tree, broken in 0.0.18 - Improve progress reporting for some filters - Fix opengl rendering on OSX (Previously resizes would cause scene to be distorted or clipped) - Minor improvements to point colour and size tracking - Fix bug in point replace mode where square distance was used instead of regular distance. Technical Bugfixes/changes: - Many minor memory leaks fixed - Fixes for C++11 compilation - Many small crash bugs fixed - Fix analysis state lost if loading state failed - Fix name collision detection in package export - will now check for origin of file, not just name - Fix race bug in voxel summation, caught by unit tests. * 05 Apr 2015 : 0.0.18 Features: - User interface now uses its own CPU. Should be much more responsive during refreshes - Spectra can be normalised to allow for easier inter-spectra comparison. Several normalisation modes have been added. - Clustering ellipse fitting implemented. Can now determine best-fit ellipsoids on clusters, and plot them in 2D to identify lath/rod/sphere/disc shapes - Voxelisation filter now supports fast blurring User Visible Changes: - Axial slice in voxelisation can now be made translucent - More noticable progress feedback, now as a progress "spinner" Technical bugfixes/changes: - Significant refactoring of internals to allow for threading. - State has been made more prominent, viscontrol less. - New "TreeState" object created - New library added for voxelisation/image support : libvigra * 01 Sep 2014 : 0.0.17 Features - Upgrade to wxWidgets 3 (wx3) - Now using wx3 property grid. Property grid interaction greatly improved. - Categories collapsible - file browse buttons - One-click check buttons/dropdown - Set (Subtraction/Union/Intersection) operations on points - Can, eg load data from separate file after performing operations on primary file User Visible Changes - Fix bug in left/right panel startup size setting - Exporting images with colour bar now works correctly - Cursor now shows OS' busy status during refresh - Files no longer disappear from recent when loading - Fix range propagation behaviour when using spatial analysis - Clustering now supports cluster ID->value mode (Feature request) - Status messages are now queued, so they won't be missed - Fixed profile minimum events not working Technical bugfixes/changes: - wxWidgets < 2.9 (prior to 2010) no longer supported - Remove 2.8 conditional code - Mathgl < 2.0 (prior to 2011) no longer supported - Remove 1.x conditional code - Fix relatively frequent crashes when sampling data files under parallel mode - 2D plots (f(x,y) and scatter+size) now supported, but no filter actually currently uses this - All filter properties must have a group title - Fix crash in mac OSX if expected data files not found - Refactoring for filter caching and property setting - Fix linker failure when using distcc * 01 Mar 2014 : 0.0.16 Features: - Added experimental LAWATAP (ATO) file support - Please send sample files! User Visible Changes: - Animation state now saved/restored - Plot interaction should be much faster - Minor UI improvements - Filter tree now persistent when interacting, where possible - Mouse hover shows name on plot regions (ranges) - Show user prompt when no filters present - Nicer text fonts - Clustering filter properties simplified - Nicer looking logarithmic plots - Left plot panel now remembers size correctly - Minor 3D drawing fixes - Fixed inside-out cones on bounding box Z-axis - Fixed line-overlap-arrow with large annotation arrow linewidths - Allow loading text files with 3 columns - Fixed random_shuffle not being seeded in transform relabel - Composition profiles now have "min count" mode - Rotating camera image output was broken in version 0.0.15 - fixed - Prevent creation of "stretched" image output Technical bugfixes/changes: - Linux automated UI checking, based on dogtail - Bugfix for caching errors in 0.0.15 tarball (already fixed in binary releases, and in repo) - many filters would incorrectly emit input data after caching - Many minor memory leaks and bugs fixed, due to Coverity scan - No longer launch 3Depict from windows installer - Windows UAC bug : no API for launching unprivileged processes from privileged ones - Fix crash with some tree configurations - Unit tests now check for installed files presence - Fix crash when linked against some mathgl-2 versions - Fixed SVG saving under non-english locales - Add support for qhull2012 - Fixed caching parameter ineffective, due to fraction->percent bug - Fixed packages with anaglyph effect not loading * 01 Dec 2013 : 0.0.15 Features - Range editing dialog : Rangefiles can be modified via a dialog available from the "edit" menu - A Range filter and a spectra filter must be present first - "Overlays" can be used to generate isotopic distributions for comparison - "Binomial analysis" algorithm, (Moody et al, 2011) for data randomness testing User Visible Changes: - Middle double click to zoomout on plots - Improved user feedback in transform filter - Better console output, messages now persistent - Progress dialog for animation - Colour bar auto-changes colour on light backgrounds - Colour maps now reversible - Orthogonal camera can be selected by default - Improved RRNG and ENV support - ENV 0.3 supported User Visible Bugfixes: - Image export fixed wrong aspect ratio ion output images - Fix plot export dialog when (png/svg) extension given - Fix tree/property grid not always synchronised - Fix "jumping" of movable objects after interaction - Fix custom filter names not being saved correctly - Fix undo not recorded after tree copy - Fix axial dist aborting problem - Fix loading of .xy files from external program filter - Fix hang when disabling weak/fast randomisation - Fix intermittent problems with spatial analysis filter aborting - Fix incorrect parsing of external program commands - Fix state file loading in downsample filter, fixed count mode - Fix camera animation continually asking if you want to save, after animation completion - Fix colour interpolation in animate dialog Technical bugfixes/changes: - Fix hang when filters given directories as input (linux) - Fix bug in extern filter where data would be output even on empty command - Better out-of-memory exception handling at refresh level - Various memory leak fixes - Refactoring - filter caching - unit testing - scene opengl init - More unit testing - Remove plot pane polling for region change * 20 Jul 2013 : 0.0.14 Features: - 2D slice render mode for voxels. Can now visualise voxel data using colourised planes - show voxel values on a given slice - Animated spin-progress icon to show refresh status - Automatic, but optional, limiting of point count in 3D display - Improved responsiveness of program to user when working with large datasets. Enabled by default. - Downsampling no longer added when loading datasets - New "double-ORNL rng" rangefile support User Visible Bugfixes/Changes: - Fix "blinking"/flicker problems in 3D scene when changing properties - Improved tracking of changes to state - Current filename - Current directory - Changes to state (eg, for asking to save at exit) - Fix state load/save bugs - Orthogonal camera scaling - stash handling - Add new tree warnings - Composition biasing warning for rangefile->composition pairs - Missing required parent filter (eg clustering) - More caching in voxel filter, for better performance - Better axis handling for plot window - Better handling of cylinder objects during interaction - Improved performance in some cases when ranging - On Mac OSX, manual now stored locally - New "quick start" section in documentation - Ranged ions/volume now reported correctly by ion info filter Technical Bugfixes/Features: - Split viscontrol and analysis state into separate modules - Minor improvements to rangefile loading - Improved assertion checking for selection bindings - Remove needless templating of selection devices - Continuous Integration script for cppcheck - Minor opengl enhancement (performance & error reporting) * 12 Apr 2013 : 0.0.13 Features: - Spherical composition profile support - Added axial distribution mode to spatial analysis (directional RDF) - New build for windows 64 (no parallel build available yet) User Visible Bugfixes/Changes: - Fix crash if unable to obtain RSS feed when checking for updates from behind proxy (Windows only) - Rangefiles now correctly load when altering name property - Copy/pasting from the raw data grid now works. - Plot now updates when scrolling, rather than just during mouse motion - Fix refresh loop in Data Load filter when "monitor" active and "enabled" inactive. - Fix RDF generating error/crashes when passing < 4 points - Fix voxel filtering not preserving intensity correctly - Fix crash bug on OSX during animate - Fix animate dialog, where wrong text box updated on frame change - Animate dialog "remove" button now works correctly - Clipping algorithm now uses multiple CPUs - RDF algorithm (max dist) now uses multiple CPUs - The default camera now is stored and loaded when saving state - Ion information filter now emits warnings if sampling is enabled by a parent - Warning on export of plot's without legend fixed - Fix bug where gl window did not update after sash move on some video drivers - Not providing an extention when exporting plots now causes prompt, rather than error - Fixed filters not staying selected when loading new data files - More locking of UI elements during refresh - Improve view splitter startup behaviour Technical Bugfixes/Features: - Mathgl >= 1.11 (Nov 2010) now required as hard dependency, earlier versions will not compile - Mathgl 2.x now supported - Refactored clipping and concentration profile code into single geometry handler - Refactored often copy-pasted XML writer code back to "filter common" functions - Fixed bug whereby if user preference had been altered for pos data, with loadlimit=0, then loading would cancel if this value was not changed in the filter property, and sampling was set. - Improved wx correctness in property grid - Tentative support in "getDeps" script for CentOS6 - Refactor APTClasses & basics functions into several more manageable parts - Better RNG support (negative ranges, range lines starting with a digit) - More extensive unit testing - Fix double-free bug for certain topologies in filter tree - Fix memory leak when aborting refresh - Cross compilation script for mingw-win64 and 32 - Source code relayout to reflect overall design - Fix several minor assertion errors - Remove several redundant scene update calls in main window - Re-enable OSX checking for updates - Fix incorrect progress reporting when ranging - Improved release QA checking * Nov 2012 : 0.0.12 Features: - Animation tool for performing "sweeps" of filter properties - can change a filter properties and export images, point data, plots etc. for each step in the property - Can sweep multiple properties simultaneously - Use for exporting videos/animations of parameter changes - Each filter property now has built-in tooltip help text - New warning for possible compositional biasing in composition results User Visible Bugfixes/Changes: - Point input starting with "." no longer incorrectly rejected - Fix arrow heads being shown for some objects where they should not be - Improved RNG file reader, fixed some multiple ions being rejected when they should not be - Performance increase in transform filter, ion shuffle mode, due to better shuffle strategy, and more parallelism - Fix progress reporting in transform filter, shuffle mode - RRNG files without colour data will now have random colour assignments, instead of black. - Some performance increases in point generation and display - More property group naming - Fix spectrum plot resetting itself to default values if no valid input - Fix some malformatted RRNG files could cause crash - Fix vertical "sash"/splitter motion not causing 3D view to update - Fix crash when loading large posfiles in external program filter Technical Bugfixes/Features: - Added Event logger code, for better user feedback from assertion failures - More workarounds for mathgl library infinite loop problems, which occur due to floating point aliasing - Fix segfault in point parsing routines - Improved UI locking during scene refresh, limiting scope for callback re-entrancy, which caused some crashes. - Fixed several small memory leaks - More unit testing, and fix some non-working unit tests, eg transform shuffle, which wasn't checking shuffled state correctly, and hence did very little - Minor openMP fixes - Many cppcheck fixes - mostly stylistic, or minor performance improvements * 1 Jul, 2012 : 0.0.11 Features: - Filter tree is now scanned for common errors, with a clickable warning message for detected errors, e.g.: - Filters connected that cannot have any effect - Filters connected that may alter the outcome of density dependant analyses, due to sampling. - Spatial analysis now has "density filtering" mode. - Bounding box has new draw modes "dimension" and "box only" - User manual has been expanded, now provides more detail on filters, and specific examples for the External Program filter for multiple programming languages (Scilab/bash/python/C++). User Visible Bugfixes/Changes: - Clustering core mode in core-link algorithm has been fixed (Core dist > 0) - Previously program would crash/generate nonsense results. - Fixed voxels not showing if transparency set to zero in point cloud mode - Multiple-autosave and resolution selection dialog usability improvements - Fix Undo not working after deleting filters - Recent files that do not exist are removed from recent files menu - External Program option "Clear cache" now correctly updates after selection. - Spatial analysis colour change for plot no long requires recomputation. - Bulk distance > 0.5*Link distance now emits warning in cluster filter, previously was incorrectly set to > 1.0*Link distance. - Tree no longer completely disables user interaction during refresh. - Lines now have conical arrow heads where appropriate (eg annotation). - Package state restores now correctly restore working directory information, fixing load failures for some external resources. - Fix cluster cropping/nmin not loading correctly from state files. - Fix bug where ion downsampler might not propagate range data - Cluster filter restores ions better when dragging/dropping between different range file parents - Fix ion export not working correctly, due to change in viscontrol behaviour for 0.0.10 Technical Bugfixes/Features: - Improvements to dependency fetch script "getDeps" for Mac OSX Lion. - Several small memory leaks fixed - Speed improvements by removing initialiser on ionhit data class - More unit test cases for filters - More strict emit/use/block patterns for spatial analysis, bound box and external program * 1 Apr, 2012 : 0.0.10 Features: - Improved aborting behaviour for filters User Visible Bugfixes/Changes: - In cluster filter, datasets consisting of "core" only can now be clustered. Previously some "bulk" was required, due to programming error. - Fix drag/drop loading bugs - Fix multiple data files not being accepted at command line - Fix crash-on-exit in OSX 10.7 bug - Improved rangefile reader - more tolerant of oddly formatted rangefiles - Fix bug where downsample filter would not update ion selection if parent rangefile filter was altered. - Data loading can now use custom string for data name - defaults to "mass-to-charge" - Plot region dragging now disallowed if region not shown (ie lies outside visible data area). - Fix bug in plot panel, where I beam would not show if user did Y zoom starting below plot X axis - Fix bug in plot zooming, where a perfectly X or perfectly Y zoom (ie mouse moved exactly horizontally or vertically) would fail to zoom. - Fix bug in clip & composition cylinder where perfectly horizontal (XY plane) would result in incorrect direction for analysis. - Better drag/drop support when dropping into tree "base" - now will only allow filters that can be a data source on top level. - Most buttons/checkboxes/spinbuttons etc ("controls") now have tool tips when hovering mouse. - Several previously untranslated items added to translation database - Minor layout change to ion info properties. Technical Bugfixes/Features: - Major internal reorganisation (refactor) of viscontrol. Now split into two parts, a tree manipulator & refresher (FilterTree), and UI/backend sync (Viscontroller)- Some export dialogs now take advantage of tree cache, making exporting dialog appearance faster in complex filter trees. - More unit tests for filters, rangefiles and filter trees. - Some export dialogs now take advantage of tree cache, making exporting dialog appearance faster in complex filter trees. - Improved dependency retrieval script, making porting a bit easier. - More QA checking in release script - Compiles against GCC 4.7. - Re-enable convex hull based algorithms in OSX. - Remove unnecessary #includes. - Some code de-duplication, thanks to pmd.sourceforge.net - Hidden debug only Autosave with ctrl+insert. - Fix memory leaks in filter devices, rangefile filter - Property keys now throw assertion error if not unique. - Fix small array overrun in NN histogram generation in RDF filter - Fix MK1 KD tree stack underrun for some trees. - Properties in XML files are now escaped and unescaped, avoiding malformatted/broken state and configuration files, if using any of "<>&" in saved elements. * Dec 17, 2011 : 0.0.9 Features: - Rangefile filter now has "all ions/ranges" enable/disable option - Autosave dialog now shows timestamp on file, eg "autosave.123.xml, one day ago" - Density computation in volume estimation filter - Implement scroll-to-zoom in plots - Rangefiles can now be dropped onto program to open. User Visible Bugfixes/Changes: - Fix crash-on-load due to strict floating point checks under some wxGtk (linux) systems (Reported by users) - Fix text file loading when loadlimit is 0. - Fix hang when loading incorrectly formatted text files - Fix bug where primitives might not show from transform filter until forcing a refresh - Spectrum filter no longer resets bincount when no data passed to it. - Composition profile now matches 3D cylinder size when using fixed number of bins. (Reported by user) - Fix bug where only line plots could be selected for plot dropdowns. - Fix random crash/weirdness bug when dragging 3D items. - Fix several internal debug dialogs being shown in wx2.9 (OSX 10.7)\ - Fix non-responsive dialogs in wx2.9 (OSX 10.7) - Fix occasional corruption of volume estimate in IonInfo filter - Better colouring of ranges in plot area (now uses exact colour, not closest from fixed palette) - Better error messages when failing to load data files - Fix config file error message for new 3Depict installs - Fix double message dialog when failing to load autosave - Fix bug where dataset would appear rotated when changing view axis for certain orientations. - Fix various bugs in autosave dialog Technical Bugfixes/Features: - Implement quality assurance code : unit testing of most filters, add release build checks. - Cluster filter now can do morphology (ellipse fit), but user frontend incomplete. - Many small memory leak fixes - Fix corner case bug in cluster analysis filter where small data corruption could occur for very small datasets. - Fix duplication of final range in rangefile - Fix large memory leak in convex hull estimation. - More strict checking for source dependencies in configure script - Marginally faster data loading by removing unneeded shuffle operation - More correct and strict rangefile checking - Fix bogus error in debug mode when dragging mouse move rate slider to max in pref. dialog - Fix bogus error in debug mode when using smoothing filter on voxels - Colourbar overlay no longer affected by scene lighting. - Fix bug where editing a property, then switching cameras can cause hang in debug mode. * Sep 30, 2011 : 0.0.8 Features: - Data files can now be monitored for changes, prompting auto-reloading of filter tree if file changes. - Multiple autosave files (per running program copy) are now supported - Annotation filter, including angle measurement, text annotation, and linear measurement. User Visible Bugfixes/Changes: - Voxel smoothing option now works if smoothing kernel is larger than dataset (i.e. small bin numbers or large sigma values). - Fix bug in density scaling (this was prev. included in some builds) - Fix bug in refreshing code which would not cause tree to be loaded correctly in some filter combination cases (such as pos Load->pos Load) - Fix preferences not respected when loading data files - Fix text files not selectable by default from load menu - Minor changes to ion info filter - Fix segfault if loading text data files with too few columns Technical Bugfixes/Features: - wxWidgets 2.9 support (incl. source build now supported under OSX 10.7, in theory) - Minor correctness improvements to configure script - wxWidgets correctness fixes (assertion failures etc). - Fix build for libpng 1.4 (infopp_NULL -> NULL) - Respect user choice of system background in plot area * Jul 30, 2011 : 0.0.7 Features: - Improved isosurface computation, incl. data filtering. - Foreign language support - German translation (de_DE). - Ion Info filter : volume and composition estimation. User Visible Bugfixes/Changes: - Periodic update checks (Unmanaged systems only, ie OSX, windows). - Improved window positioning on startup. - Fix voxel state saving - now restores range selections. - Fix cropping with camera coordinates incorrect behaviour due to numeric instabilities. - Fix range file reading under locales with non-english decimal separators. - Better handling of relative paths in analysis packages. - Ion transform filter now has "value transform" mode - Faster voxel computations (caching + cache introspection) - Improved crop controls -- better reset behaviour. - Fix pointcloud representation off-by-1/2 voxel pitch. - Fix bug where zooming repeatedly in 2D plot caused hang - Manually changing composition profile Cylinder axis respects lock axis magnitude setting. - Fix off-by-one in tick computation for bounding box. - Fix value setting when changing between clip objects - OpenGL status is now checked upon startup. Technical Bugfixes/Features: - Rewrote plot code to allow for more extensible plotting. - Improved checking of filter stream outut. - Checking of block masks against emit. - Other misc. checking. - Depth sorting framework for improved transparency rendering. - Removed many small memory leaks in parsing & UI. - Improved numerical stability in some rotation operations * May 16, 2011 : 0.0.6 Features: - Text data file loading - Cameras can now be locked - Add noise mode to transform filter (gaussian/white) User Visible Bugfixes/Changes: - Clustering algorithm now gives sensible results. - Previous implementation was wrong in several respects. Now should behave correctly, even on corner cases. - Now performs bounds-in-sphere check for large queries, significantly improving the scaling characteristics of the search when using large bulk link radii - Fix crash when moving range on empty data - Workaround for wxWidgets bug where recent file list >9 items would not load - Fix bug in undo/redo where tree may not reset correctly if it contains range data after undo/redo op. Technical Bugfixes/Features: - Significantly more complex refresh system, now performs type analysis on tree to determine minimal subsections of tree to refresh. Now filters that cannot cache well will penalise the refresh system much less. - Fix corner case bug in LFSR selection routines (power of two selection from same size array results in single duplicate). - Fix opengl bug with isosurface draw which appears up under some video card/driver combinations, which lead to undefined video behaviour (bad glPopAttrib()/glEnd() ordering) - Fix incorrect "loaded file" message if uninterpretable pos file loaded. - Fix error in plot causing assertion error during mouseover - Fix plot behaviour when all data == 0. * March 27, 2011 : 0.0.5 Features: - Clustering algorithm - Modification of methods of Stephenson et al.; this includes Max. Sep algorithm. See manual for algorithm description and parameter details - Value shuffle mode in transform filter - Mouse preferences for zoom and other controls User Visible Bugfixes/Changes: - Add hint to resolution dialog to maintain aspect ratio in output plots by default - Mac binary now distributed through packagemaker. Technical Bugfixes/Features: - Major code refactor; simplify code layout to aid further code development, speed compilation - Fix "press shift to refresh" hint not working - Fix voxels not reporting cache size - Fix possible crash bug in double click plot when no plot visible. - Filters now support named sections in property sets - Disallow zero sized ion streams from rangefiles - Fix off-by-one bug in boundcube set func (can cause assertion error) - Improve progress reporting for LSFR random selections * January 23, 2011 : 0.0.4 Features: - Preferences dialog - User defined defaults for each filter - Window startup behaviour - Postprocessing effects - Interactive/fast depth buffer based cropping - Analgyphic (oldschool coloured glasses) stereo - Fullscreen now has "partial" and "really" fullscreen modes - Ion downsampling filter now aware of ranges User Visible Bugfixes/Changes: - Improved parsing of points, so more styles of 3D point entry is allowed, eg when cutting/pasting from scilab - Plot now zooms in X or Y only by double clicking below axis - Some sections that were supposed to be paralellised, but were not due to typos, now actually are. - Fix bugs in state file writing for ion clipping (non saved var) - Fix parallelism in KD tree building - RDF was not paralellised, and could not be aborted - Voxels no longer crash due to non-ion input - Fix assertion errors when working with cylinder clipping tools - Fix overlays hints being drawn "below" other points in the scene (disable depth buffer, and draw last) Technical Bugfixes/Features: - Improve compilation structure to simplify builds under all platforms, particularly when using paralell or similar - Various crash fixes due to re-entry bugs - Fix a few unititalised variables (eg spat. analysis ->cache on plot) - Implement "effects" framework to allow insertion of arbitrary openGL calls using derived effects classes. - Some internal refactoring to reduce code duplication (Filter generation) * November 29, 2010 : 0.0.3 Features: - Added range interaction on-plot - Show marker for transform in mass-centre && boundbox mode. Allow user to show or hide marker. - Add drag and drop support for files - Add on-screen colourbar for ion colour - Add axis drawing - Added better error messages to XML file read - Added RDF filter - Add mode to lock cylinder magnitude during rotation - Plot panning (hold shift key) - Filters can report stepwise progress - Improvements to manual. User Visible Bugfixes: - Better error messages for PNG/SVG plot save - Fix bug in binding which caused object to move more than it should during 3D drag - Set dialog default item focus - Fix escape key not working in dialogs - Switch ms-windows camera roll to use alt, rather than tab, because ctrl+tab advances through controls, regardless of focus - Remove buggy parallel code in rotation filter - Fix transform filter behaviour to +origin after rotate - Fix bugs in transform filter - origin behaviour - copying/stashing filter - Fix bug whereby region colours in mass spectrum had green and blue channels swapped (typo) - Fix for crash when exporting images at high resolutions, due to uncaught std::bad_alloc in conjunction with a missing return after popping up dialog box - Fix bug with loading multiple files at command line - Fix bug in voxels where axis aligned data caused crash - Fixed animation tiling - Ensure visibility reset actually resets to looking down +ve axis - Change plot axis to show log_10 rather than just log() during log mode - Fixed interaction overlay drawing transparency Technical Bugs/Features: - Really fast "random" sampling. - Fix memory leak where textures were continually reloaded at every use due to bad name handling - Fix incorrect usage of std::unique that was leading to assertion failure - Make conjugation in quaternions implicit for even faster quaternion rotations. - Fix bug in GenericLoadFloatFile, where the output vector was too small for cols<4, resulting in memory overflow - Fix bug in transform filter where data limits were required for ion data sizes < 2 - Fixes for spatial analysis filter - Catch and report errors to console, rather than crash. - Fixes to plot bound get function with multiple plots - Only returns visible plots now - Fix aspect ratio not set during scene overlay draw - Added export analysis package - Added abort to rendering sequence - Fix assertion error during refresh due to bad total filter count after ion export - Fix bug in BoundCube::setBounds where incorrect assignment for z was made - Valgrind out two crash bugs due to uninitialised memory * September 24, 2010: 0.0.2 - Files with arbitrary number of data channels can now be loaded, but only one channel at a time can be analysed. - Many functions are now openMP parallelised, and thus will take advantage of multiple CPUs, if enabled at compile time - Simple animation support (PNG sequences in an orbit) - Voxelisation support; voxel data can be generated using the new Voxelise filter. Supported visualisation methods are Isosurfaces and point clouds. - Undo/redo support : filter operations can now be undone, and redone. - Windows build: we now have a windows build. - Improved rangefile parsing. This should now work on every range file I have ever met. If you have one where it does not work, let us know. - Several filters have been improved to be easier to use (eg transform filter) - Some core functions have been optimised (eg rotation, composition profiles), and should be significantly faster. - Many bugfixes -- program should be significantly more stable, but requires testing (please help us with this if you can ) * August 11, 2010 : Released 0.0.1 - Initial release 3Depict-0.0.22/depcomp0000755000175000017500000005601613414250067014041 0ustar pcuserpcuser#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: 3Depict-0.0.22/configure0000755000175000017500000115021413414365633014375 0ustar pcuserpcuser#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for 3Depict 0.0.22. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='3Depict' PACKAGE_TARNAME='3depict' PACKAGE_VERSION='0.0.22' PACKAGE_STRING='3Depict 0.0.22' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS GXX DEBUG_FLAGS SED OPENMP_FLAGS GETTEXT_LIBS GSL_LIBS GSL_CFLAGS GSL_CONFIG MGL_LIBS MGL_CFLAGS RANLIB LN_S GL_LIBS PNG_LIBS PNG_CFLAGS QHULL_LIBS QHULL_CFLAGS CXXCPP FTGL_LIBS FTGL_CFLAGS FT_LIBS FT_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG USE_XML_FALSE USE_XML_TRUE XML_LIBS XML_CFLAGS XMLCONFIG HAVE_WINDRES_FALSE HAVE_WINDRES_TRUE WX_RESCOMP WX_VERSION WX_LIBS_STATIC WX_LIBS WX_CXXFLAGS_ONLY WX_CFLAGS_ONLY WX_CXXFLAGS WX_CFLAGS WX_CPPFLAGS WX_CONFIG_PATH host_os host_vendor host_cpu host build_os build_vendor build_cpu build EGREP GREP CPP USE_PRECOMPILED_HEADERS_FALSE USE_PRECOMPILED_HEADERS_TRUE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_ftgl_prefix with_ftgl_no_pkg enable_silent_rules enable_dependency_tracking with_wxdir with_wx_config with_wx_prefix with_wx_exec_prefix with_xml_config with_libqhull_flags with_libqhull_link with_libpng_flags with_libpng_link with_mgl_flags with_mgl_libs with_gsl_flags with_gsl_libs with_gsl_prefix with_gsl_exec_prefix enable_gsltest with_intl_libs enable_openmp_parallel enable_debug_checks enable_ubsan enable_libvd enable_gnu11 ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR FT_CFLAGS FT_LIBS FTGL_CFLAGS FTGL_LIBS CXXCPP PNG_CFLAGS PNG_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures 3Depict 0.0.22 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/3depict] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of 3Depict 0.0.22:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-gsltest Do not try to compile and run a test GSL program --enable-openmp-parallel Enable OpenMP multi-CPU usage; requires GCC > 4.2 for parallel STL support --disable-debug-checks Disable any debug checking, provides faster operation, but less information needed to debug internal problems, or to provide problem reports to developers --disable-ubsan Disable undefined behaviour sanitizer. Only takes effect on certain ubsan supporting compilers. Useful for working around ubsan aborts that you cant fix (eg 3rd party libs) --enable-libvd Enable volume render support, using the libvd library. --enable-gnu11 use gnu11 C++ mode Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-ftgl-prefix : specify prefix dir for FTGL --with-ftgl-no-pkg : don't use pkg-config to check for ftgl --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH --with-wx-config=CONFIG wx-config script to use (optional) --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional) --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional) --with-xml-config=PATH use xml-config in PATH to find libxml --with-libqhull-flags=PATH : specify compiler flags for libqhull --with-libqhull-link=PATH : specify linker flag (library) for libqhull --with-libpng-flags=PATH : specify compiler flags for libpng --with-libpng-link=PATH : specify linker flag (library) for libpng --with-mgl-flags=PATH : specify compiler flags for mathgl --with-mgl-libs=PATH : specify linker flag (library) for mathgl --with-gsl-flags=PATH : specify compiler flags for gsl --with-gsl-libs=PATH : specify linker flag (library) for gsl --with-gsl-prefix=PFX Prefix where GSL is installed (optional) --with-gsl-exec-prefix=PFX Exec prefix where GSL is installed (optional) --with-intl-libs=FLAGS: specify linker flags (library) for internationalisation libs Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path FT_CFLAGS C compiler flags for FT, overriding pkg-config FT_LIBS linker flags for FT, overriding pkg-config FTGL_CFLAGS C compiler flags for FTGL, overriding pkg-config FTGL_LIBS linker flags for FTGL, overriding pkg-config CXXCPP C++ preprocessor PNG_CFLAGS C compiler flags for PNG, overriding pkg-config PNG_LIBS linker flags for PNG, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF 3Depict configure 0.0.22 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by 3Depict $as_me 0.0.22, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='3depict' VERSION='0.0.22' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files Makefile src/Makefile" # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LICENSE # # Copyright (c) 2008 Tim Toolan # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 #Ok, lets try using gcc style precompiled headers. if 1; then USE_PRECOMPILED_HEADERS_TRUE= USE_PRECOMPILED_HEADERS_FALSE='#' else USE_PRECOMPILED_HEADERS_TRUE='#' USE_PRECOMPILED_HEADERS_FALSE= fi #Check sizeof ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 $as_echo_n "checking size of size_t... " >&6; } if ${ac_cv_sizeof_size_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : else if test "$ac_cv_type_size_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (size_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_size_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 $as_echo "$ac_cv_sizeof_size_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIZE_T $ac_cv_sizeof_size_t _ACEOF # Support {host_os} variable # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --with-wxdir was given. if test "${with_wxdir+set}" = set; then : withval=$with_wxdir; wx_config_name="$withval/wx-config" wx_config_args="--inplace" fi # Check whether --with-wx-config was given. if test "${with_wx_config+set}" = set; then : withval=$with_wx_config; wx_config_name="$withval" fi # Check whether --with-wx-prefix was given. if test "${with_wx_prefix+set}" = set; then : withval=$with_wx_prefix; wx_config_prefix="$withval" else wx_config_prefix="" fi # Check whether --with-wx-exec-prefix was given. if test "${with_wx_exec_prefix+set}" = set; then : withval=$with_wx_exec_prefix; wx_config_exec_prefix="$withval" else wx_config_exec_prefix="" fi case "${host_os}" in *mingw*) #Windows requires 3.1, as there is a bug with wxPropertyGrid modification during events # under GTK we use a hack to workaround, by keeping two grids, and flipping them in and out. #This doesn't work properly under windows. wx3.1 is not available under linux # (using repositories) at this time. if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WX_CONFIG_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=3.1.0 if test -z "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args " WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi wxWin=1 else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi ;; *) if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WX_CONFIG_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=3.0.0 if test -z "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args " WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi wxWin=1 else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi esac if test "$wxWin" != 1; then as_fn_error $? " wxWidgets must be installed on your system but wx-config script couldnt be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is above the minimum specified above. " "$LINENO" 5 fi #Append the --gl-libs flag WX_LIBS="$WX_LIBS `$WX_CONFIG_PATH --libs gl,propgrid`" WANT_WINDRES="no" case "${host_os}" in *mingw*) #wx-config is a little unreliable in cross-compile mode # Manually append -DUNICODE to cppflags/cxxflags WX_CXXFLAGS="$WX_CXXFLAGS -DUNICODE" WX_CPPFLAGS="$WX_CPPFLAGS -DUNICODE" WANT_WINDRES="yes" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Want windres... $WANT_WINDRES" >&5 $as_echo "Want windres... $WANT_WINDRES" >&6; } if test x"$WANT_WINDRES" == "xyes" ; then HAVE_WINDRES_TRUE= HAVE_WINDRES_FALSE='#' else HAVE_WINDRES_TRUE='#' HAVE_WINDRES_FALSE= fi # Check for xml-config (libxml2 configuration utility) # ------------ # Test from icecast library (GPL) # Check whether --with-xml-config was given. if test "${with_xml_config+set}" = set; then : withval=$with_xml_config; fi have_xml="no" if test "$with_xml_config" != "no" then if test -n "$with_xml_config" -a "$with_xml_config" != "yes" then XMLCONFIG="$with_xml_config" if ! test -x "$XMLCONFIG" then as_fn_error $? "$with_xml_config cannot be run" "$LINENO" 5 fi else for ac_prog in xml2-config xml-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XMLCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XMLCONFIG"; then ac_cv_prog_XMLCONFIG="$XMLCONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XMLCONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi XMLCONFIG=$ac_cv_prog_XMLCONFIG if test -n "$XMLCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLCONFIG" >&5 $as_echo "$XMLCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$XMLCONFIG" && break done fi if test -n "$XMLCONFIG" then $as_echo "#define HAVE_LIBXML 1" >>confdefs.h have_xml="yes" else as_fn_error $? "Unable to locate the configuration utility xml-config: specify with --with-xml-config, or ensure it is your PATH environment variable" "$LINENO" 5 fi XML_LIBS="`$XMLCONFIG --libs`" XML_CFLAGS="`$XMLCONFIG --cflags`" fi if test "$have_xml" = "yes"; then USE_XML_TRUE= USE_XML_FALSE='#' else USE_XML_TRUE='#' USE_XML_FALSE= fi #---------------- # Check for FT2 - use pkg-config # freetype2 >=2.9.1 will no longer ship freetype-config # we used to use a modified version fo the graphviz code # to check for freetype, but it was over-complex for our needs if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT" >&5 $as_echo_n "checking for FT... " >&6; } if test -n "$FT_CFLAGS"; then pkg_cv_FT_CFLAGS="$FT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FT_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FT_LIBS"; then pkg_cv_FT_LIBS="$FT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FT_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1` else FT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FT_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (freetype2) were not met: $FT_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables FT_CFLAGS and FT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables FT_CFLAGS and FT_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else FT_CFLAGS=$pkg_cv_FT_CFLAGS FT_LIBS=$pkg_cv_FT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi CPPFLAGS="$CPPFLAGS $FT_CFLAGS" LDFLAGS="$LDFLAGS $FT_LIBS" #Check for FTGL using custom script. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftgl" >&5 $as_echo_n "checking for ftgl... " >&6; } FTGL_CFLAGS="" FTGL_LIBS="" if test "x$ftgl_prefix" != "x" ; then #use the supplied CFLAGS. assume LIBS FTGL_CFLAGS="-I$ftgl_prefix/include/ -L$ftgl_prefix/lib/" FTGL_LIBS="-lFTGL" else HAVE_PKG=$(basename $(which pkg-config)) if test $HAVE_PKG != x"pkg-config" ; then manual_ftgl="yes" ; fi if test "x$with_ftgl_no_pkg" = "xyes" ; then $as_echo "#define FTGL_NO_PKG_CONFIG 1" >>confdefs.h #well the user doesn't want us to use pkg-config so dont. manual_ftgl=yes else if ! test x"$manual_ftgl" == x"yes" ; then # #Use PKG_CONFIG to do the heavy lifting, must be greater than 2.0.0 # pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FTGL" >&5 $as_echo_n "checking for FTGL... " >&6; } if test -n "$FTGL_CFLAGS"; then pkg_cv_FTGL_CFLAGS="$FTGL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_CFLAGS=`$PKG_CONFIG --cflags "ftgl >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FTGL_LIBS"; then pkg_cv_FTGL_LIBS="$FTGL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_LIBS=`$PKG_CONFIG --libs "ftgl >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FTGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ftgl >= 2.0.0" 2>&1` else FTGL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ftgl >= 2.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FTGL_PKG_ERRORS" >&5 libftgl="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } libftgl="no" else FTGL_CFLAGS=$pkg_cv_FTGL_CFLAGS FTGL_LIBS=$pkg_cv_FTGL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } libftgl="yes" fi #Check to see if pkg-config did the job if test "x$libftgl" = "xno" ; then #dang, looks like we have to try a manual approach manual_ftgl=yes ; fi fi fi fi if test "x$manual_ftgl" = "xyes" ; then CFLAGS_ORIG="$CFLAGS" LIBS_ORIG="$LIBS" LIBS="$LIBS $FTGL_LIBS $LDFLAGS" if test x$FTGL_LIBS == x"" ; then FTGL_LIBS="-lftgl" fi #TODO: see if we can put in some more manual tests for a few common locations for ftgl? { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftglCreateSimpleLayout in -lftgl" >&5 $as_echo_n "checking for ftglCreateSimpleLayout in -lftgl... " >&6; } if ${ac_cv_lib_ftgl_ftglCreateSimpleLayout+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lftgl -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ftglCreateSimpleLayout (); int main () { return ftglCreateSimpleLayout (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ftgl_ftglCreateSimpleLayout=yes else ac_cv_lib_ftgl_ftglCreateSimpleLayout=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ftgl_ftglCreateSimpleLayout" >&5 $as_echo "$ac_cv_lib_ftgl_ftglCreateSimpleLayout" >&6; } if test "x$ac_cv_lib_ftgl_ftglCreateSimpleLayout" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBFTGL 1 _ACEOF LIBS="-lftgl $LIBS" else as_fn_error $? "Couldnt find ftgl -- provide base dir or install pkg_config" "$LINENO" 5 fi CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" fi # # If we get this far, we assume that FTGL_CFLAGS and FTGL_LIBS is set # all that remains is to check to see if FTGL.h is in the CFLAGS dir or in # the FTGL subdir # ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu save_CPPFLAGS=$CPPFLAGS CPPFLAGS=$FTGL_CFLAGS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_nodir=yes else ftgl_nodir=no fi rm -f conftest.err conftest.i conftest.$ac_ext if test "x$ftgl_nodir" != "xyes" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_dir=yes else ftgl_dir=no fi rm -f conftest.err conftest.i conftest.$ac_ext if test "x$ftgl_dir" = "xyes" ; then save_FTGL_CFLAGS=$FTGL_CFLAGS #scrub the FTGL_CFLAGS for -I and then tack on /FTGL as needed FTGL_CFLAGS=`echo $FTGL_CFLAGS | sed -e 's/-I\([a-z\\\/]*\)/-I\1\/FTGL /'` CPPFLAGS=$FTGL_CFLAGS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_def_dir=yes else ftgl_def_dir=no fi rm -f conftest.err conftest.i conftest.$ac_ext if test "x$ftgl_def_dir" = "xno" ; then #try retrieving and modifying gcc's search dirs. - OMG Nasty hack! gcc #has no nice output for include dirs - sigh. got this from gcc-help, #then parsed with greps and tr GCC_SEARCHDIRS=`cpp -x c++ -Wp,-v /dev/null 2>&1 | grep -v ^\# | grep -v "End of search list." | grep -v "ignoring" | tr \\\n \\ ` ftgl_search_ok="no" for flag in $GCC_SEARCHDIRS do CPPFLAGS="-I$flag/FTGL/" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_def_dir=yes else ftgl_def_dir=no fi rm -f conftest.err conftest.i conftest.$ac_ext echo "Checking for FTGL.h in: $CPPFLAGS, result : $ftgl_def_dir" if test "x$ftgl_def_dir" = "xyes"; then ftgl_search_ok="yes" FTGL_CFLAGS="-I$flag/FTGL/" break fi done if test "x$ftgl_search_ok" = "xno"; then as_fn_error $? "Unfortuntately whilst this script worked out that you have ftgl, it couldn't quite work out how to set the CFLAGS" "$LINENO" 5 fi fi fi fi CPPFLAGS=$save_CPPFLAGS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes " >&5 $as_echo " yes " >&6; } #Not doing anything??? #Check for qhull, if we are not using sweep hull # Check whether --with-libqhull-flags was given. if test "${with_libqhull_flags+set}" = set; then : withval=$with_libqhull_flags; fi # Check whether --with-libqhull-link was given. if test "${with_libqhull_link+set}" = set; then : withval=$with_libqhull_link; fi if test x"$with_libqhull_flags" != x"" ; then QHULL_CFLAGS="$with_libqhull_flags" fi #Attempt to compile a test program CFLAGS_ORIG="$CFLAGS" CFLAGS="$CFLAGS $QHULL_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "qhull/qhull_a.h" "ac_cv_header_qhull_qhull_a_h" "$ac_includes_default" if test "x$ac_cv_header_qhull_qhull_a_h" = xyes; then : $as_echo "#define HAVE_QHULL /**/" >>confdefs.h else as_fn_error $? "Required libqhull headers not found (looking for qhull/qhull_a.h)" "$LINENO" 5 fi if test x"$with_libqhull_link" != x"" ; then QHULL_LIBS="$with_libqhull_link" else QHULL_LIBS="-lqhull" fi LIBS_ORIG="$LIBS" LIBS="$LIBS $QHULL_LIBS $LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qh_qhull in -lqhull" >&5 $as_echo_n "checking for qh_qhull in -lqhull... " >&6; } if ${ac_cv_lib_qhull_qh_qhull+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lqhull $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char qh_qhull (); int main () { return qh_qhull (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_qhull_qh_qhull=yes else ac_cv_lib_qhull_qh_qhull=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_qhull_qh_qhull" >&5 $as_echo "$ac_cv_lib_qhull_qh_qhull" >&6; } if test "x$ac_cv_lib_qhull_qh_qhull" = xyes; then : $as_echo "#define HAVE_QHULL /**/" >>confdefs.h else as_fn_error $? "You must have libqhull installed and be able to compile a sample program. compiler flags can be set using the with-libqhull-flags and with-libqhull-link parameters " "$LINENO" 5 fi CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" #Check for libpng # Check whether --with-libpng-flags was given. if test "${with_libpng_flags+set}" = set; then : withval=$with_libpng_flags; fi # Check whether --with-libpng-link was given. if test "${with_libpng_link+set}" = set; then : withval=$with_libpng_link; fi #set libpng's compiler flags if test x"$with_libpng_flags" != x"" ; then PNG_CFLAGS="$with_libpng_flags" fi #set libpng's link flags if test x"$with_libpng_link" != x"" ; then PNG_LIBS="$with_libpng_link" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_write_struct_2 in -lpng" >&5 $as_echo_n "checking for png_create_write_struct_2 in -lpng... " >&6; } if ${ac_cv_lib_png_png_create_write_struct_2_+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_create_write_struct_2 (); int main () { return png_create_write_struct_2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_png_png_create_write_struct_2_=yes else ac_cv_lib_png_png_create_write_struct_2_=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_write_struct_2_" >&5 $as_echo "$ac_cv_lib_png_png_create_write_struct_2_" >&6; } if test "x$ac_cv_lib_png_png_create_write_struct_2_" = xyes; then : PNG_LIBS=-lpng else PNG_USE_PKG_CFG=yes fi if test x"$PNG_USE_PKG_CFG" == x"yes" ; then : pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 1.2" 2>&1` else PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 1.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpng >= 1.2) were not met: $PNG_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi fi #Attempt to compile a test program CFLAGS_ORIG="$CFLAGS" CFLAGS="$CFLAGS $PNG_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes; then : $as_echo "#define HAVE_PNG /**/" >>confdefs.h else as_fn_error $? "Required libpng headers not found (looking for png.h" "$LINENO" 5 fi LIBS_ORIG="$LIBS" LIBS="$LIBS $PNG_LIBS $LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_sig_cmp in -lpng" >&5 $as_echo_n "checking for png_sig_cmp in -lpng... " >&6; } if ${ac_cv_lib_png_png_sig_cmp+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_sig_cmp (); int main () { return png_sig_cmp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_png_png_sig_cmp=yes else ac_cv_lib_png_png_sig_cmp=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_sig_cmp" >&5 $as_echo "$ac_cv_lib_png_png_sig_cmp" >&6; } if test "x$ac_cv_lib_png_png_sig_cmp" = xyes; then : $as_echo "#define HAVE_PNG /**/" >>confdefs.h else as_fn_error $? "You must have libpng installed and be able to compile sample program" "$LINENO" 5 fi CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" #Check for opengl #------------ #Try linking against gluSphere windows usese -lglu32; mac?? ; linux -lGLU case "${host_os}" in mingw*|windows*|winnt) #win32 opengl names GL_LIBS="-lglu32 -lopengl32" #Add GLEW dependency for opengl > 1.1 GL_LIBS="$GL_LIBS -lglew32" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ;; darwin*) #This is handled by the --with-apple-opengl-framework #option already. Nothing to do here ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluSphere in -lGLU" >&5 $as_echo_n "checking for gluSphere in -lGLU... " >&6; } if ${ac_cv_lib_GLU_gluSphere+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGLU $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gluSphere (); int main () { return gluSphere (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GLU_gluSphere=yes else ac_cv_lib_GLU_gluSphere=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluSphere" >&5 $as_echo "$ac_cv_lib_GLU_gluSphere" >&6; } if test "x$ac_cv_lib_GLU_gluSphere" = xyes; then : GL_LIBS="$GL_LIBS -lglu" else as_fn_error $? "Could not find GLU library" "$LINENO" 5 fi GL_LIBS="-lGL -lGLU" ;; esac #------------ #Check for Mathgl CFLAGS_ORIG="$CFLAGS" LDFLAGS_ORIG="$LDFLAGS" # Check whether --with-mgl-flags was given. if test "${with_mgl_flags+set}" = set; then : withval=$with_mgl_flags; fi if test x"$with_mgl_flags" != x"" ; then MGL_CFLAGS="$with_mgl_flags" fi CFLAGS="$CFLAGS $MGL_CFLAGS" # Check whether --with-mgl-libs was given. if test "${with_mgl_libs+set}" = set; then : withval=$with_mgl_libs; fi if test x"$with_mgl_libs" != x"" ; then MGL_LIBS="$with_mgl_libs" else MGL_LIBS="-lmgl" fi LDFLAGS="$LDFLAGS $MGL_LIBS" # mathgl2.x uses mgl_cf.h for c functions. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu $as_echo "#define USE_MGL2 1 " >>confdefs.h #AC_CHECK_HEADER("mgl2/mgl_cf.h",[],[AC_MSG_ERROR(["mgl2 specified, but header mgl2/mgl_cf.h not found"])],[]) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS_ORIG" LDFLAGS="$LDFLAGS_ORIG" #Check for gsl # Check whether --with-gsl-flags was given. if test "${with_gsl_flags+set}" = set; then : withval=$with_gsl_flags; fi # Check whether --with-gsl-libs was given. if test "${with_gsl_libs+set}" = set; then : withval=$with_gsl_libs; fi if test x"$with_gsl_flags" != x"" ; then GSL_CFLAGS="$with_gsl_flags" fi if test x"$with_gsl_libs" != x"" ; then GSL_LIBS="$with_gsl_libs" else # Check whether --with-gsl-prefix was given. if test "${with_gsl_prefix+set}" = set; then : withval=$with_gsl_prefix; gsl_prefix="$withval" else gsl_prefix="" fi # Check whether --with-gsl-exec-prefix was given. if test "${with_gsl_exec_prefix+set}" = set; then : withval=$with_gsl_exec_prefix; gsl_exec_prefix="$withval" else gsl_exec_prefix="" fi # Check whether --enable-gsltest was given. if test "${enable_gsltest+set}" = set; then : enableval=$enable_gsltest; else enable_gsltest=yes fi if test "x${GSL_CONFIG+set}" != xset ; then if test "x$gsl_prefix" != x ; then GSL_CONFIG="$gsl_prefix/bin/gsl-config" fi if test "x$gsl_exec_prefix" != x ; then GSL_CONFIG="$gsl_exec_prefix/bin/gsl-config" fi fi # Extract the first word of "gsl-config", so it can be a program name with args. set dummy gsl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GSL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GSL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GSL_CONFIG="$GSL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GSL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GSL_CONFIG" && ac_cv_path_GSL_CONFIG="no" ;; esac fi GSL_CONFIG=$ac_cv_path_GSL_CONFIG if test -n "$GSL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSL_CONFIG" >&5 $as_echo "$GSL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_gsl_version=1.1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSL - version >= $min_gsl_version" >&5 $as_echo_n "checking for GSL - version >= $min_gsl_version... " >&6; } no_gsl="" if test "$GSL_CONFIG" = "no" ; then no_gsl=yes else GSL_CFLAGS=`$GSL_CONFIG --cflags` GSL_LIBS=`$GSL_CONFIG --libs` gsl_major_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\).*/\1/'` if test "x${gsl_major_version}" = "x" ; then gsl_major_version=0 fi gsl_minor_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\)\.\{0,1\}\([0-9]*\).*/\2/'` if test "x${gsl_minor_version}" = "x" ; then gsl_minor_version=0 fi gsl_micro_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\)\.\{0,1\}\([0-9]*\)\.\{0,1\}\([0-9]*\).*/\3/'` if test "x${gsl_micro_version}" = "x" ; then gsl_micro_version=0 fi if test "x$enable_gsltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" rm -f conf.gsltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include char* my_strdup (const char *str); char* my_strdup (const char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (void) { int major = 0, minor = 0, micro = 0; int n; char *tmp_version; system ("touch conf.gsltest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_gsl_version"); n = sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) ; if (n != 2 && n != 3) { printf("%s, bad version string\n", "$min_gsl_version"); exit(1); } if (($gsl_major_version > major) || (($gsl_major_version == major) && ($gsl_minor_version > minor)) || (($gsl_major_version == major) && ($gsl_minor_version == minor) && ($gsl_micro_version >= micro))) { exit(0); } else { exit(1); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_gsl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gsl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$GSL_CONFIG" = "no" ; then echo "*** The gsl-config script installed by GSL could not be found" echo "*** If GSL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GSL_CONFIG environment variable to the" echo "*** full path to gsl-config." else if test -f conf.gsltest ; then : else echo "*** Could not run GSL test program, checking why..." CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GSL or finding the wrong" echo "*** version of GSL. If it is not finding GSL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GSL was incorrectly installed" echo "*** or that you have moved GSL since it was installed. In the latter case, you" echo "*** may want to edit the gsl-config script: $GSL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi # GSL_CFLAGS="" # GSL_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"Could not find GNU Scientific Library.. You should install this, as it is needed by mathgl. Otherwise, you can override it with --with-gsl-link and --with-gsl-flags. For example you might use the gsl-config program to spit out the needed libs.\"" >&5 $as_echo "$as_me: WARNING: \"Could not find GNU Scientific Library.. You should install this, as it is needed by mathgl. Otherwise, you can override it with --with-gsl-link and --with-gsl-flags. For example you might use the gsl-config program to spit out the needed libs.\"" >&2;} fi rm -f conf.gsltest fi #Check for libintl { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libintl " >&5 $as_echo_n "checking for libintl ... " >&6; }; # Check whether --with-intl-libs was given. if test "${with_intl_libs+set}" = set; then : withval=$with_intl_libs; fi if test x"$with_intl_libs" != x"" ; then GETTEXT_LIBS="$with_intl_libs" { $as_echo "$as_me:${as_lineno-$LINENO}: result: specified " >&5 $as_echo " specified " >&6; }; else case "${host_os}" in darwin*) #Darwin requires explicit libintl GETTEXT_LIBS="-lintl -liconv" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETTEXT_LIBS " >&5 $as_echo " $GETTEXT_LIBS " >&6; }; ;; mingw*|windows*|winnt) GETTEXT_LIBS="-lintl" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETTEXT_LIBS " >&5 $as_echo " $GETTEXT_LIBS " >&6; }; ;; *) #elsewhere it appears to be part of libc. or something. { $as_echo "$as_me:${as_lineno-$LINENO}: result: no " >&5 $as_echo " no " >&6; }; ;; esac fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_fn_cxx_check_header_mongrel "$LINENO" "vigra/multi_array.hxx" "ac_cv_header_vigra_multi_array_hxx" "$ac_includes_default" if test "x$ac_cv_header_vigra_multi_array_hxx" = xyes; then : $as_echo "#define HAVE_VIGRA /**/" >>confdefs.h else as_fn_error $? "Required vigra headers not found (looking for vigra/multi_array.hxx)" "$LINENO" 5 fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #Should we compile with openMP? # Check whether --enable-openmp-parallel was given. if test "${enable_openmp_parallel+set}" = set; then : enableval=$enable_openmp_parallel; fi #Should we enable or disable debug checking? # Check whether --enable-debug-checks was given. if test "${enable_debug_checks+set}" = set; then : enableval=$enable_debug_checks; enable_debug_checks="no" else enable_debug_checks="yes" fi # Check whether --enable-ubsan was given. if test "${enable_ubsan+set}" = set; then : enableval=$enable_ubsan; enable_no_ubsan="yes" else enable_no_ubsan="no" fi #Should we enable libvd (volume render library) support? # Check whether --enable-libvd was given. if test "${enable_libvd+set}" = set; then : enableval=$enable_libvd; enable_libvd="yes" else enable_libvd="no" fi if test x"$enable_openmp_parallel" != x"" ; then OPENMP_FLAGS="-fopenmp -D_GLIBCXX_PARALLEL" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler vendor" >&5 $as_echo_n "checking for C compiler vendor... " >&6; } if ${ax_cv_c_compiler_vendor+:} false; then : $as_echo_n "(cached) " >&6 else # note: don't check for gcc first since some other compilers define __GNUC__ vendors="intel: __ICC,__ECC,__INTEL_COMPILER ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale: __PATHCC__,__PATHSCALE__ clang: __clang__ cray: _CRAYC fujitsu: __FUJITSU gnu: __GNUC__ sun: __SUNPRO_C,__SUNPRO_CC hp: __HP_cc,__HP_aCC dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ comeau: __COMO__ kai: __KCC lcc: __LCC__ sgi: __sgi,sgi microsoft: _MSC_VER metrowerks: __MWERKS__ watcom: __WATCOMC__ portland: __PGI tcc: __TINYC__ unknown: UNKNOWN" for ventest in $vendors; do case $ventest in *:) vendor=$ventest; continue ;; *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if !($vencpp) thisisanerror; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done ax_cv_c_compiler_vendor=`echo $vendor | cut -d: -f1` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_vendor" >&5 $as_echo "$ax_cv_c_compiler_vendor" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 $as_echo_n "checking for C compiler version... " >&6; } if ${ax_cv_c_compiler_version+:} false; then : $as_echo_n "(cached) " >&6 else case $ax_cv_c_compiler_vendor in #( intel) : if ac_fn_c_compute_int "$LINENO" "__INTEL_COMPILER/100" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__INTEL_COMPILER%100)/10" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__INTEL_COMPILER%10)" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_INTEL unknown intel compiler version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( ibm) : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if defined(__COMPILER_VER__) choke me; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if ac_fn_c_compute_int "$LINENO" "__xlC__/100" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler major version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__xlC__%100" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__xlC_ver__/0x100" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler patch version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__xlC_ver__%0x100" "_ax_c_compiler_version_build" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler build version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch.$_ax_c_compiler_version_build" else if ac_fn_c_compute_int "$LINENO" "__xlC__%1000" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler patch version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__xlC__/10000)%10" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__xlC__/100000)%10" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_IBM unknown IBM compiler major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; #( pathscale) : if ac_fn_c_compute_int "$LINENO" "__PATHCC__" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale major See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__PATHCC_MINOR__" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale minor See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__PATHCC_PATCHLEVEL__" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_PATHSCALE unknown pathscale patch level See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( clang) : if ac_fn_c_compute_int "$LINENO" "__clang_major__" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_CLANG unknown clang major See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__clang_minor__" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_CLANG unknown clang minor See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__clang_patchlevel__" "_ax_c_compiler_version_patch" ""; then : else 0 fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( cray) : if ac_fn_c_compute_int "$LINENO" "_RELEASE" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_CRAY unknown crayc release See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "_RELEASE_MINOR" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_CRAY unknown crayc minor See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" ;; #( fujitsu) : if ac_fn_c_compute_int "$LINENO" "__FCC_VERSION" "ax_cv_c_compiler_version" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_FUJITSUunknown fujitsu release See \`config.log' for more details" "$LINENO" 5; } fi ;; #( gnu) : if ac_fn_c_compute_int "$LINENO" "__GNUC__" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc major See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__GNUC_MINOR__" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc minor See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__GNUC_PATCHLEVEL__" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_GNU unknown gcc patch level See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( sun) : if ac_fn_c_compute_int "$LINENO" "!!( #if defined(__SUNPRO_CC) __SUNPRO_CC #else __SUNPRO_C #endif < 0x1000)" "_ax_c_compiler_version_until59" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun release version See \`config.log' for more details" "$LINENO" 5; } fi if test "X$_ax_c_compiler_version_until59" = X1; then : if ac_fn_c_compute_int "$LINENO" " #if defined(__SUNPRO_CC) __SUNPRO_CC #else __SUNPRO_C #endif % 0x10" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun patch version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "( #if defined(__SUNPRO_CC) __SUNPRO_CC #else __SUNPRO_C #endif / 0x10) % 0x10" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "( #if defined(__SUNPRO_CC) __SUNPRO_CC #else __SUNPRO_C #endif / 0x100)" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun major version See \`config.log' for more details" "$LINENO" 5; } fi else if ac_fn_c_compute_int "$LINENO" " #if defined(__SUNPRO_CC) __SUNPRO_CC #else __SUNPRO_C #endif % 0x10" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun patch version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "( #if defined(__SUNPRO_CC) __SUNPRO_CC #else __SUNPRO_C #endif / 0x100) % 0x100" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "( #if defined(__SUNPRO_CC) __SUNPRO_CC #else __SUNPRO_C #endif / 0x1000)" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SUN unknown sun major version See \`config.log' for more details" "$LINENO" 5; } fi fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( hp) : if ac_fn_c_compute_int "$LINENO" "!!( #if defined(__HP_cc) __HP_cc #else __HP_aCC #endif <= 1)" "_ax_c_compiler_version_untilA0121" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp release version See \`config.log' for more details" "$LINENO" 5; } fi if test "X$_ax_c_compiler_version_untilA0121" = X1; then : ax_cv_c_compiler_version="01.21.00" else if ac_fn_c_compute_int "$LINENO" "( #if defined(__HP_cc) __HP_cc #else __HP_aCC #endif % 100)" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp release version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(( #if defined(__HP_cc) __HP_cc #else __HP_aCC #endif / 100)%100)" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(( #if defined(__HP_cc) __HP_cc #else __HP_aCC #endif / 10000)%100)" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_HP unknown hp major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" fi ;; #( dec) : if ac_fn_c_compute_int "$LINENO" "( #if defined(__DECC_VER) __DECC_VER #else __DECCXX_VER #endif % 10000)" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec release version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(( #if defined(__DECC_VER) __DECC_VER #else __DECCXX_VER #endif / 100000UL)%100)" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(( #if defined(__DECC_VER) __DECC_VER #else __DECCXX_VER #endif / 10000000UL)%100)" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_DEC unknown dec major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( borland) : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #if defined(__TURBOC__) __TURBOC__ #else choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if ac_fn_c_compute_int "$LINENO" " #if defined(__TURBOC__) __TURBOC__ #else choke me #endif " "_ax_c_compiler_version_turboc_raw" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc version See \`config.log' for more details" "$LINENO" 5; } fi if test $_ax_c_compiler_version_turboc_raw -lt 661 || test $_ax_c_compiler_version_turboc_raw -gt 1023; then : if ac_fn_c_compute_int "$LINENO" " #if defined(__TURBOC__) __TURBOC__ #else choke me #endif % 0x100" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "( #if defined(__TURBOC__) __TURBOC__ #else choke me #endif /0x100)%0x100" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown turboc major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="0turboc:$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" else case $_ax_c_compiler_version_turboc_raw in #( 661) : ax_cv_c_compiler_version="0turboc:1.00" ;; #( 662) : ax_cv_c_compiler_version="0turboc:1.01" ;; #( 663) : ax_cv_c_compiler_version="0turboc:2.00" ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: [_AX_COMPILER_VERSION_BORLAND] unknown turboc version between 0x295 and 0x400 please report bug" >&5 $as_echo "$as_me: WARNING: [_AX_COMPILER_VERSION_BORLAND] unknown turboc version between 0x295 and 0x400 please report bug" >&2;} ax_cv_c_compiler_version="" ;; esac fi else # borlandc if ac_fn_c_compute_int "$LINENO" " #if defined(__BORLANDC__) __BORLANDC__ #else __CODEGEARC__ #endif " "_ax_c_compiler_version_borlandc_raw" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_BORLAND unknown borlandc version See \`config.log' for more details" "$LINENO" 5; } fi case $_ax_c_compiler_version_borlandc_raw in #( 512 ) : ax_cv_c_compiler_version="1borlanc:2.00" ;; #( 1024) : ax_cv_c_compiler_version="1borlanc:3.00" ;; #( 1024) : ax_cv_c_compiler_version="1borlanc:3.00" ;; #( 1040) : ax_cv_c_compiler_version="1borlanc:3.1" ;; #( 1106) : ax_cv_c_compiler_version="1borlanc:4.0" ;; #( 1280) : ax_cv_c_compiler_version="1borlanc:5.0" ;; #( 1312) : ax_cv_c_compiler_version="1borlanc:5.02" ;; #( 1328) : ax_cv_c_compiler_version="2cppbuilder:3.0" ;; #( 1344) : ax_cv_c_compiler_version="2cppbuilder:4.0" ;; #( 1360) : ax_cv_c_compiler_version="3borlancpp:5.5" ;; #( 1361) : ax_cv_c_compiler_version="3borlancpp:5.51" ;; #( 1378) : ax_cv_c_compiler_version="3borlancpp:5.6.4" ;; #( 1392) : ax_cv_c_compiler_version="4cppbuilder:2006" ;; #( 1424) : ax_cv_c_compiler_version="4cppbuilder:2007" ;; #( 1555) : ax_cv_c_compiler_version="4cppbuilder:2009" ;; #( 1569) : ax_cv_c_compiler_version="4cppbuilder:2010" ;; #( 1584) : ax_cv_c_compiler_version="5xe" ;; #( 1600) : ax_cv_c_compiler_version="5xe:2" ;; #( 1616) : ax_cv_c_compiler_version="5xe:3" ;; #( 1632) : ax_cv_c_compiler_version="5xe:4" ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: [_AX_COMPILER_VERSION_BORLAND] Unknow borlanc compiler version $_ax_c_compiler_version_borlandc_raw please report bug" >&5 $as_echo "$as_me: WARNING: [_AX_COMPILER_VERSION_BORLAND] Unknow borlanc compiler version $_ax_c_compiler_version_borlandc_raw please report bug" >&2;} ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; #( comeau) : if ac_fn_c_compute_int "$LINENO" "__COMO_VERSION__%100" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_COMEAU unknown comeau compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__COMO_VERSION__/100)%10" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_COMEAU unknown comeau compiler major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" ;; #( kai) : if ac_fn_c_compute_int "$LINENO" "__KCC_VERSION%100" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler patch version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__KCC_VERSION/100)%10" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__KCC_VERSION/1000)%10" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_KAI unknown kay compiler major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( sgi) : if ac_fn_c_compute_int "$LINENO" " #if defined(_COMPILER_VERSION) _COMPILER_VERSION #else _SGI_COMPILER_VERSION #endif %10" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler patch version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "( #if defined(_COMPILER_VERSION) _COMPILER_VERSION #else _SGI_COMPILER_VERSION #endif /10)%10" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "( #if defined(_COMPILER_VERSION) _COMPILER_VERSION #else _SGI_COMPILER_VERSION #endif /100)%10" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_SGI unknown SGI compiler major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( microsoft) : if ac_fn_c_compute_int "$LINENO" "_MSC_VER%100" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(_MSC_VER/100)%100" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler major version See \`config.log' for more details" "$LINENO" 5; } fi _ax_c_compiler_version_patch=0 _ax_c_compiler_version_build=0 # special case for version 6 if test "X$_ax_c_compiler_version_major" = "X12"; then : if ac_fn_c_compute_int "$LINENO" "_MSC_FULL_VER%1000" "_ax_c_compiler_version_patch" ""; then : else _ax_c_compiler_version_patch=0 fi fi # for version 7 if test "X$_ax_c_compiler_version_major" = "X13"; then : if ac_fn_c_compute_int "$LINENO" "_MSC_FULL_VER%1000" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler patch version See \`config.log' for more details" "$LINENO" 5; } fi fi # for version > 8 if test $_ax_c_compiler_version_major -ge 14; then : if ac_fn_c_compute_int "$LINENO" "_MSC_FULL_VER%10000" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler patch version See \`config.log' for more details" "$LINENO" 5; } fi fi if test $_ax_c_compiler_version_major -ge 15; then : if ac_fn_c_compute_int "$LINENO" "_MSC_BUILD" "_ax_c_compiler_version_build" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_MICROSOFT unknown microsoft compiler build version See \`config.log' for more details" "$LINENO" 5; } fi fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch.$_ax_c_compiler_version_build" ;; #( metrowerks) : if ac_fn_c_compute_int "$LINENO" "__MWERKS__%0x100" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler patch version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__MWERKS__/0x100)%0x10" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__MWERKS__/0x1000)%0x10" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_METROWERKS unknown metrowerks compiler major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( watcom) : if ac_fn_c_compute_int "$LINENO" "__WATCOMC__%100" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_WATCOM unknown watcom compiler minor version See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "(__WATCOMC__/100)%100" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_WATCOM unknown watcom compiler major version See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor" ;; #( portland) : if ac_fn_c_compute_int "$LINENO" "__PGIC__" "_ax_c_compiler_version_major" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi major See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__PGIC_MINOR__" "_ax_c_compiler_version_minor" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi minor See \`config.log' for more details" "$LINENO" 5; } fi if ac_fn_c_compute_int "$LINENO" "__PGIC_PATCHLEVEL__" "_ax_c_compiler_version_patch" ""; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "_AX_COMPILER_VERSION_PORTLAND unknown pgi patch level See \`config.log' for more details" "$LINENO" 5; } fi ax_cv_c_compiler_version="$_ax_c_compiler_version_major.$_ax_c_compiler_version_minor.$_ax_c_compiler_version_patch" ;; #( tcc) : ax_cv_c_compiler_version=`tcc -v | $SED 's/^[ ]*tcc[ ]\+version[ ]\+\([0-9.]\+\).*/\1/g'` ;; #( *) : ax_cv_c_compiler_version="" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_compiler_version" >&5 $as_echo "$ax_cv_c_compiler_version" >&6; } GCC_VERSION=$ax_cv_c_compiler_version # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo " $GCC_VERSION " | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "6.0" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then CXXFLAGS=" $CXXFLAGS -std=gnu++11" else DUMMY=" " fi if test x"$enable_debug_checks" == x"yes" ; then DEBUG_FLAGS="-DDEBUG" if test x"$GCC" == x"yes" ; then # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo " $GCC_VERSION " | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "6.0" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then DEBUG_FLAGS=" $DEBUG_FLAGS -D_GLIBCXX_ASSERTIONS" else DUMMY=" " fi GXX="-O0" # Strip optimisation flags from debug build #-- CFLAGS=`echo "$CFLAGS" | sed -e 's/-O[0-9s]*//g'` CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O[0-9s]*//g'` CFLAGS="$CFLAGS -g" CXXFLAGS="$CXXFLAGS -g" #-- #Check for UbSan availability #-- if test x"${enable_no_ubsan}" == x"no" ; then USE_UBSAN="no" case "${host_os}" in *inux*) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo " $GCC_VERSION " | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "4.9" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then USE_UBSAN="yes" else USE_UBSAN="no" fi # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo " $GCC_VERSION " | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "6.0" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then USE_UBSAN_GCC6="yes" else USE_UBSAN_GCC6="no" fi ;; esac if test x"$USE_UBSAN" == x"yes" ; then CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return -fsanitize=integer-divide-by-zero -fsanitize=vla-bound -fsanitize=null -fsanitize=signed-integer-overflow" CXXFLAGS="$CXXFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return -fsanitize=integer-divide-by-zero -fsanitize=vla-bound -fsanitize=null -fsanitize=signed-integer-overflow" LDFLAGS="$LDFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return " { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"Enabling Gcc-UbSan\"" >&5 $as_echo "\"Enabling Gcc-UbSan\"" >&6; }; fi # Disabled until we improve our compiler detection (clang) # if test x"$USE_UBSAN_GCC6" == x"yes" ; then # CFLAGS="$CFLAGS -fsanitize=bounds-strict" # CXXFLAGS="$CXXFLAGS -fsanitize=bounds-strict" # LDFLAGS="$LDFLAGS -fsanitize=bounds-strict" # AC_MSG_RESULT(["Enabling More Gcc-UbSan (gcc6)"]); # fi fi #-- fi else echo x"$enable_debug_checks" echo x"no" if test x"$enable_debug_checks" != x"no" ; then as_fn_error $? "\"Well something isnt right, debug checks should be enabled or disabled (yes/no), was $enable_debug_checks\"" "$LINENO" 5 fi fi # Check whether --enable-gnu11 was given. if test "${enable_gnu11+set}" = set; then : enableval=$enable_gnu11; fi if test x"$enable_gnu11" == x"yes" ; then #Should work for gcc (required for older gcc + mathgl combinations) CXXFLAGS="$CXXFLAGS --std=gnu++11" fi if test x"$enable_libvd" == x"yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"Enabling libvd\"" >&5 $as_echo "\"Enabling libvd\"" >&6; }; CXXFLAGS="$CXXFLAGS -DENABLE_LIBVD" LIBS="$CXXFLAGS -lvd" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Libvd support disabled..." >&5 $as_echo "Libvd support disabled..." >&6; } fi if test x"$CXX" = xdistcc ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"Adding distcc link flags\"" >&5 $as_echo "\"Adding distcc link flags\"" >&6; }; #Add -lstdc++ to libs for distcc LIBS="$LIBS -lstdc++" fi # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac # Checks for library functions. for ac_func in atexit sqrt do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in floor getcwd gettimeofday isascii memset do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in pow setlocale strdup sysinfo do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac #check for some headers for ac_header in fenv.h libintl.h sys/time.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi #Check platform specific headers case "${host_os}" in darwin*) for ac_header in mach/mach.h do : ac_fn_c_check_header_mongrel "$LINENO" "mach/mach.h" "ac_cv_header_mach_mach_h" "$ac_includes_default" if test "x$ac_cv_header_mach_mach_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MACH_MACH_H 1 _ACEOF fi done ;; *) ;; esac cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then as_fn_error $? "conditional \"USE_PRECOMPILED_HEADERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WINDRES_TRUE}" && test -z "${HAVE_WINDRES_FALSE}"; then as_fn_error $? "conditional \"HAVE_WINDRES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_XML_TRUE}" && test -z "${USE_XML_FALSE}"; then as_fn_error $? "conditional \"USE_XML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by 3Depict $as_me 0.0.22, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ 3Depict config.status 0.0.22 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi 3Depict-0.0.22/README0000644000175000017500000000325113406030347013333 0ustar pcuserpcuserIf you want the manual, or a "how to use" for this program, See the web page for the latest documentation, at http://threedepict.sourceforge.net. Most users should obtain a "binary" version from the website. If you are trying to build from source, the webpage is recommended, but otherwise, install the required dependencies (see website for more details) and then, from the command-line run: ./configure make make install to build the default-mode (single-threaded, debug on ) program. Interesting configure flags (see "./configure --help" for more options): --enable-openmp-parallel : Enable multi-CPU mode (for multi-CPU sections of the program) via the "openMP" framework --disable-debug-checks : Disable debug checks. This makes the program much faster, but less likely to catch program bugs --disable-ubsan : Disable undefined behaviour santiser. Makes the program go faster, but undefined program behaviour (bugs) will not be as readily detected --enable-experimental-cpp11 : Enables experimental C++11 support. Some Dependencies: libxml2 qhull gsl ftgl mathgl libpng wxwidgets gettext vigra Remember, for dependencies under linux platforms you must install the -dev, or -devel packages, in order to allow compilation For those with no idea how to install the dependencies, you can *try* running the "getDeps.sh" script in the packaging/deps/ folder, but it is not guaranteed to work on your system. For those under Windows, we recommend to install a different OS (eg debian, ubuntu - maybe in a Virtual machine) then "cross-compile". This is not trivial, but you can look at the deps/mingw-debian-cross/bootstrap.sh script as a starting point. 3Depict-0.0.22/translations/0000755000175000017500000000000013451744172015203 5ustar pcuserpcuser3Depict-0.0.22/translations/3Depict_de_DE.po0000644000175000017500000047315213451741306020066 0ustar pcuserpcuser# # Copyright (C) 2017 # This file is distributed under the same license as the 3Depict package. # msgid "" msgstr "" "Project-Id-Version: 3Depict\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-06 14:48+0000\n" "PO-Revision-Date: 2017-09-19 10:23+0000\n" "Last-Translator: mycae \n" "Language-Team: German (Germany) (http://www.transifex.com/mycae/3depict/" "language/de_DE/)\n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/gl/cameras.cpp:585 msgid "Lock" msgstr "Sperren" #: ../src/gl/cameras.cpp:592 ../src/backend/filters/ionClip.cpp:516 #: ../src/backend/filters/ionClip.cpp:530 #: ../src/backend/filters/ionClip.cpp:546 #: ../src/backend/filters/ionClip.cpp:567 #: ../src/backend/filters/profile.cpp:1097 #: ../src/backend/filters/profile.cpp:1118 #: ../src/backend/filters/transform.cpp:1222 #: ../src/backend/filters/transform.cpp:1240 #: ../src/backend/filters/transform.cpp:1257 #: ../src/backend/filters/annotation.cpp:625 #: ../src/backend/filters/annotation.cpp:691 msgid "Origin" msgstr "Ursprung" #: ../src/gl/cameras.cpp:600 ../src/backend/filters/spatialAnalysis.cpp:936 msgid "Target" msgstr "Ziel" #: ../src/gl/cameras.cpp:606 msgid "Up Dir." msgstr "" #: ../src/gl/cameras.cpp:614 ../src/gl/cameras.cpp:717 msgid "Perspective" msgstr "" #: ../src/gl/cameras.cpp:616 ../src/gl/cameras.cpp:719 #: ../src/gui/mainFrame.cpp:5762 msgid "Orthogonal" msgstr "Orthogonal" #: ../src/gl/cameras.cpp:620 msgid "Projection" msgstr "Projektion" #: ../src/gl/cameras.cpp:629 msgid "Field of View (deg)" msgstr "Bildausschnitt" #: ../src/gl/cameras.cpp:635 msgid "View size" msgstr "Anzeigegröße" #: ../src/wx/wxcomponents.cpp:189 msgid "Save Data..." msgstr "Datei speichern..." #: ../src/wx/wxcomponents.cpp:190 msgid "Text File (*.txt)|*.txt|All Files (*)|*" msgstr "Text Datei (*.txt)|*.txt|Alle Dateien (*)|*" #: ../src/wx/wxcomponents.cpp:202 msgid "Error saving file. Check output dir is writable." msgstr "" "Fehler beim Schreiben der Datei. Stellen Sie sicher, dass das " "Zielverzeichnis nicht schreibgeschüzt ist." #: ../src/wx/wxcomponents.cpp:202 ../src/gui/dialogs/ExportRngDialog.cpp:187 #: ../src/gui/mainFrame.cpp:1555 ../src/gui/mainFrame.cpp:1680 #: ../src/gui/mainFrame.cpp:1729 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2410 ../src/gui/mainFrame.cpp:2483 #: ../src/gui/mainFrame.cpp:2586 ../src/gui/mainFrame.cpp:2845 msgid "Save error" msgstr "Fehler speichern" #: ../src/common/basics.cpp:183 msgid "in the future?" msgstr "in Zukunft?" #: ../src/common/basics.cpp:234 msgid "a decade ago" msgstr "vor zehn Jahren" #: ../src/common/basics.cpp:235 msgid "a year ago" msgstr "vor einem Jahr" #: ../src/common/basics.cpp:236 msgid "a month ago" msgstr "vor einem Monat" #: ../src/common/basics.cpp:237 msgid "a week ago" msgstr "vor einer Woche" #: ../src/common/basics.cpp:238 msgid "a day ago" msgstr "gestern" #: ../src/common/basics.cpp:239 msgid "an hour ago" msgstr "vor einer Stunde" #: ../src/common/basics.cpp:240 msgid "45 minutes ago" msgstr "vor 45 Minuten" #: ../src/common/basics.cpp:241 msgid "30 minutes ago" msgstr "vor 30 Minuten" #: ../src/common/basics.cpp:242 msgid "20 minutes ago" msgstr "vor 20 Minuten" #: ../src/common/basics.cpp:243 msgid "15 minutes ago" msgstr "vor 15 Minuten" #: ../src/common/basics.cpp:244 msgid "10 minutes ago" msgstr "vor 10 Minuten" #: ../src/common/basics.cpp:245 msgid "5 minutes ago" msgstr "vor 5 Minuten" #: ../src/common/basics.cpp:246 msgid "a minute ago" msgstr "vor einer Minute" #: ../src/common/basics.cpp:247 msgid "30 seconds ago" msgstr "vor 30 Sekunden" #: ../src/common/basics.cpp:248 msgid "10 seconds ago" msgstr "vor 10 Sekunden" #: ../src/common/basics.cpp:249 msgid "a second ago" msgstr "vor einer Sekunde" #: ../src/common/basics.cpp:254 msgid "a few decades ago" msgstr "vor einigen Dekaden" #: ../src/common/basics.cpp:255 msgid "a few years ago" msgstr "vor einigen Jahren" #: ../src/common/basics.cpp:256 msgid "a few months ago" msgstr "vor einigen Monaten" #: ../src/common/basics.cpp:257 msgid "a few weeks ago" msgstr "vor einigen Wochen" #: ../src/common/basics.cpp:258 msgid "a few days ago" msgstr "vor einigen Tagen" #: ../src/common/basics.cpp:259 msgid "a few hours ago" msgstr "vor einigen Stunden" #: ../src/common/basics.cpp:262 msgid "tens of minutes ago" msgstr "" #: ../src/common/basics.cpp:266 msgid "a few minutes ago" msgstr "vor einigen Minuten" #: ../src/common/basics.cpp:269 msgid "a few seconds ago" msgstr "vor einigen Sekunden" #: ../src/common/basics.cpp:296 msgid "moments ago" msgstr "kürzlich" #: ../src/common/colourmap.cpp:307 msgid "Jet" msgstr "Jet" #: ../src/common/colourmap.cpp:308 msgid "Hot" msgstr "Heiss" #: ../src/common/colourmap.cpp:309 msgid "Cold" msgstr "Kalt" #: ../src/common/colourmap.cpp:310 msgid "Grey" msgstr "Grau" #: ../src/common/colourmap.cpp:311 msgid "Cyclic" msgstr "Cyclic" #: ../src/common/colourmap.cpp:312 msgid "General" msgstr "Allgemein" #: ../src/common/colourmap.cpp:313 #: ../src/gui/dialogs/transferFuncDialog.cpp:765 msgid "Blue" msgstr "Blau" #: ../src/common/colourmap.cpp:314 msgid "Pseudo-Random" msgstr "" #: ../src/common/colourmap.cpp:315 msgid "Inferno" msgstr "" #: ../src/common/colourmap.cpp:316 msgid "Viridis" msgstr "" #: ../src/common/constants.cpp:21 msgid "" "Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG " "File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*." "rrng)|*.rrng;*.RRNG|All Files (*)|*" msgstr "" #: ../src/gui/glPane.cpp:642 msgid "Use shift/ctrl-space or double tap to alter reset axis" msgstr "" "Verwenden Sie Shift / Strg-Leertaste oder doppeltippen, um Achsen " "zurückzusetzen oder zu verändern" #: ../src/gui/glPane.cpp:939 msgid "Image progress" msgstr "Bild Fortschritt" #: ../src/gui/glPane.cpp:940 msgid "Rendering tiles..." msgstr "" #: ../src/gui/glPane.cpp:1133 msgid "Animation progress" msgstr "Animation-Fortschritt" #: ../src/gui/glPane.cpp:1134 msgid "Rendering sequence..." msgstr "Renderreihenfolge..." #: ../src/gui/glPane.cpp:1172 msgid "Saving Image " msgstr "Speichere Bild " #: ../src/gui/glPane.cpp:1172 ../src/gui/mainFrame.cpp:4829 #: ../src/gui/mainFrame.cpp:4833 ../src/gui/mainFrame.cpp:4846 #: ../src/backend/filters/dataLoad.cpp:299 msgid " of " msgstr " von " #: ../src/gui/dialogs/ExportRngDialog.cpp:40 msgid "Range Sources" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:42 msgid "Details" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:53 msgid "Source Filter" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:54 #: ../src/backend/filters/spatialAnalysis.cpp:1059 #: ../src/backend/filters/rangeFile.cpp:649 msgid "Ions" msgstr "Ionen" #: ../src/gui/dialogs/ExportRngDialog.cpp:55 #: ../src/gui/dialogs/rangeEditDialog.cpp:1585 #: ../src/backend/filters/voxelise.cpp:781 #: ../src/backend/filters/rangeFile.cpp:725 msgid "Ranges" msgstr "Ranges" #: ../src/gui/dialogs/ExportRngDialog.cpp:88 msgid "Param" msgstr "Param." #: ../src/gui/dialogs/ExportRngDialog.cpp:89 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352 #: ../src/gui/dialogs/animateFilterDialog.cpp:1199 #: ../src/backend/filters/dataLoad.cpp:547 msgid "Value" msgstr "Wert" #: ../src/gui/dialogs/ExportRngDialog.cpp:90 msgid "Value2" msgstr "Wert2" #: ../src/gui/dialogs/ExportRngDialog.cpp:97 msgid "Ion Name" msgstr "Ionenname" #: ../src/gui/dialogs/ExportRngDialog.cpp:98 msgid "Num Ranges" msgstr "Num Ranges" #: ../src/gui/dialogs/ExportRngDialog.cpp:116 #: ../src/gui/dialogs/rangeEditDialog.cpp:694 ../src/backend/filter.cpp:52 msgid "Ion" msgstr "Ion" #: ../src/gui/dialogs/ExportRngDialog.cpp:117 msgid "Range Start" msgstr "Range Anfang" #: ../src/gui/dialogs/ExportRngDialog.cpp:118 msgid "Range end" msgstr "Range Ende" #: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2521 msgid "Save pos..." msgstr "pos speichern..." #: ../src/gui/dialogs/ExportRngDialog.cpp:152 msgid "" "Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV " "(*.env)|*.env|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:184 ../src/gui/mainFrame.cpp:1555 #: ../src/gui/mainFrame.cpp:1730 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2411 ../src/gui/mainFrame.cpp:2587 #: ../src/gui/mainFrame.cpp:2846 msgid "Unable to save. Check output destination can be written to." msgstr "" "Speichern nicht möglich. Bitte überprüfen Sie ob der Ausgabepfad " "schreibgeschützt ist." #: ../src/gui/dialogs/ExportRngDialog.cpp:253 msgid "Export Range" msgstr "Range exportieren" #: ../src/gui/dialogs/ExportRngDialog.cpp:258 msgid "List of rangefiles in filter tree" msgstr "Liste der Rangedateien im Filterbaum" #: ../src/gui/dialogs/ExportRngDialog.cpp:260 msgid "Detailed view of selected range" msgstr "Detailierte Ansicht des ausgewählten Range" #: ../src/gui/dialogs/rangeEditDialog.cpp:221 msgid "Show Overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:246 msgid "e.g. H2O" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:559 #: ../src/gui/dialogs/rangeEditDialog.cpp:693 ../src/gui/mainFrame.cpp:6428 #: ../src/backend/filter.cpp:53 msgid "Plot" msgstr "Plot" #: ../src/gui/dialogs/rangeEditDialog.cpp:560 msgid "Short Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:561 msgid "Long Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:562 #: ../src/gui/dialogs/transferFuncDialog.cpp:767 #: ../src/backend/filters/filterCommon.cpp:528 #: ../src/backend/filters/filterCommon.cpp:531 #: ../src/backend/filters/profile.cpp:1197 #: ../src/backend/filters/annotation.cpp:813 #: ../src/backend/filters/spectrumPlot.cpp:697 msgid "Colour" msgstr "Farbe" #: ../src/gui/dialogs/rangeEditDialog.cpp:695 #: ../src/backend/filters/annotation.cpp:652 #: ../src/backend/filters/annotation.cpp:764 msgid "Start" msgstr "Anfang" #: ../src/gui/dialogs/rangeEditDialog.cpp:696 #: ../src/backend/filters/annotation.cpp:657 #: ../src/backend/filters/annotation.cpp:768 msgid "End" msgstr "Ende" #: ../src/gui/dialogs/rangeEditDialog.cpp:1258 msgid "Range or ion?" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1259 msgid "Select type to add" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1540 msgid "Range Editor" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1544 msgid "Enable or disable all overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1545 msgid "Entered overlays, use delete to remove" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1546 msgid "Available plots for ranging" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1547 msgid "Enter species to display as overlay, e.g. SiO2" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1548 msgid "Editable ranges" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1549 msgid "Editable ions" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1584 #: ../src/gui/dialogs/animateFilterDialog.cpp:177 msgid "Plots" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1586 msgid "Overlay" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:39 msgid "Remove &All" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:123 msgid "Restore state?" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:133 msgid "Multiple autosave states were found; would you like to restore one?" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:37 ../src/backend/filter.cpp:618 #: ../src/backend/filter.cpp:621 msgid "Error" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:39 msgid "Warning" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:42 #: ../src/gui/dialogs/filterErrorDialog.cpp:52 msgid "Filter Errors" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:759 #: ../src/backend/filters/spectrumPlot.cpp:650 msgid "Max" msgstr "Max" #: ../src/gui/dialogs/transferFuncDialog.cpp:760 #: ../src/backend/filters/spectrumPlot.cpp:646 msgid "Min" msgstr "Min" #: ../src/gui/dialogs/transferFuncDialog.cpp:762 msgid "Traces" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:763 msgid "Red" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:764 msgid "Green" msgstr "Grün" #: ../src/gui/dialogs/transferFuncDialog.cpp:766 #: ../src/backend/filters/ionColour.cpp:314 msgid "Opacity" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:770 #: ../src/backend/filters/filterCommon.cpp:699 msgid "Transfer Function" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:823 msgid "Transfer Function Editor" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:826 msgid "Colour chosen by moving selected node up-down" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:828 msgid "Drag nodes to move, click to add nodes" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:830 msgid "Final colour scale" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:835 msgid "Adjust node group's colour" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:836 msgid "Remove the selected node" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:847 msgid "Node Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:49 msgid "Stashes" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:52 msgid "Stashed Tree" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:54 msgid "Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:60 msgid "Stash Name" msgstr "Stash Name" #: ../src/gui/dialogs/StashDialog.cpp:61 msgid "Filter Count" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:94 msgid "Stashed Trees" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:97 msgid "Erase stashed item" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:98 msgid "Filter view for current stash" msgstr "Filteransicht für den aktuellen Stash" #: ../src/gui/dialogs/StashDialog.cpp:99 msgid "Settings for selected filter in current stash" msgstr "Einstellungen für den ausgewählten Stash" #: ../src/gui/dialogs/StashDialog.cpp:100 msgid "Available stashes" msgstr "Verfügbare Stash" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:45 msgid "Start Frame: " msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:47 msgid "From File" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:50 msgid "From Table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350 #: ../src/gui/dialogs/animateFilterDialog.cpp:197 msgid "Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240 msgid "Select text file..." msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241 msgid "Text files (*.txt)|*.txt;|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342 msgid "String Keyframes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344 msgid "Frame at which to start string sequence" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345 msgid "Frame offset for data start" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346 msgid "File to use as string data source, one value per row" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347 msgid "Select file to use as data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348 msgid "Use table below for data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355 msgid "Remove selected strings from table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356 msgid "Abort value selection and return to previous window" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357 msgid "Accept data values" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:60 msgid "Keyframe Data" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:61 msgid "Transition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64 msgid "Step" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:65 msgid "Ramp" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:68 #: ../src/gui/dialogs/animateFilterDialog.cpp:1181 msgid "Start Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:70 #: ../src/gui/dialogs/animateFilterDialog.cpp:1182 msgid "End Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:73 msgid "Initial Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:74 msgid "startColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:75 msgid "Final Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:76 msgid "endColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:250 msgid "Key Frame : Colour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:252 msgid "Colour at the start of the transtition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:253 msgid "Colour at end of transition" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:92 msgid "Cameca/Ametek RRNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:93 msgid "Oak-Ridge RNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:94 msgid "Cameca/Ametek ENV" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:156 msgid "Key frames" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:157 msgid "Output Data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:158 msgid "Filters and properties" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:164 msgid "Dir : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:167 msgid "Output only when refresh required" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:169 msgid "Data Types:" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:170 msgid "3D Images" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:171 msgid "File Prefix: " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:173 msgid "Size : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:175 msgid "..." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:176 msgid "Point data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:178 msgid "Voxel data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:179 msgid "Range files" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:180 msgid "Format" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 msgid "transition frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 ../src/gui/mainFrame.cpp:1782 msgid "Frame count" msgstr "Bildanzahl" #: ../src/gui/dialogs/animateFilterDialog.cpp:771 msgid "Key frame : Colour" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:826 msgid "File existed, but was unable to read or interpret file contents." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:827 msgid "String load failed" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:848 msgid "Keyframe : decimal" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:857 msgid "Keyframe : integer" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:866 msgid "Keyframe : 3D Point" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:994 msgid "Select or create new folder" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1174 msgid "Export Animation" msgstr "Animation exportieren" #: ../src/gui/dialogs/animateFilterDialog.cpp:1175 msgid "Select filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1176 msgid "Select property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1178 #: ../src/gui/dialogs/animateFilterDialog.cpp:1197 msgid "Filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1179 #: ../src/gui/dialogs/animateFilterDialog.cpp:1198 msgid "Property" msgstr "Eigenschaft" #: ../src/gui/dialogs/animateFilterDialog.cpp:1180 #: ../src/backend/filters/spatialAnalysis.cpp:1103 #: ../src/backend/filters/transform.cpp:1158 #: ../src/backend/filters/annotation.cpp:607 #: ../src/backend/filters/annotation.cpp:611 #: ../src/backend/filters/ionDownsample.cpp:475 msgid "Mode" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1183 msgid "Keyframe table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1184 msgid "Remove the selected keyframe from the table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1185 msgid "Enter where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1186 msgid "Browse to directory where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1188 msgid "" "Title for files, result will be saved as #-name.png, where # is image number." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1189 msgid "Target resolution (image size)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1190 msgid "Select frame for property display" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1191 msgid "Enter frame number to change frame (eg 1/20)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1192 msgid "Save point data (POS files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1193 msgid "Save plots (as text files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1194 msgid "Save voxel data (raw files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1195 msgid "Save range files in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1200 msgid "Animation parameters for current frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1201 msgid "Abort animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1202 msgid "Run Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1273 msgid "Filter view" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1274 msgid "Frame view" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:45 msgid "Width :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:47 msgid "Height :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:50 #: ../src/gui/dialogs/prefDialog.cpp:85 msgid "Reset" msgstr "Zurücksetzen" #: ../src/gui/dialogs/resolutionDialog.cpp:336 msgid "Resolution Selection" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:63 msgid "Export:" msgstr "Exportieren:" #: ../src/gui/dialogs/ExportPos.cpp:64 #: ../src/backend/filters/boundingBox.cpp:568 msgid "Visible" msgstr "Sichtbar" #: ../src/gui/dialogs/ExportPos.cpp:65 msgid "Selected Data" msgstr "Daten auswählen" #: ../src/gui/dialogs/ExportPos.cpp:67 msgid "Available Data" msgstr "Verfügbare Daten" #: ../src/gui/dialogs/ExportPos.cpp:73 msgid "Selection" msgstr "Auswahl" #: ../src/gui/dialogs/ExportPos.cpp:98 ../src/gui/dialogs/ExportPos.cpp:101 msgid "Index" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:99 ../src/gui/dialogs/ExportPos.cpp:102 #: ../src/backend/filters/spatialAnalysis.cpp:2653 #: ../src/backend/filters/spatialAnalysis.cpp:2749 #: ../src/backend/filters/spatialAnalysis.cpp:2812 #: ../src/backend/filters/spatialAnalysis.cpp:3608 #: ../src/backend/filters/spatialAnalysis.cpp:3894 #: ../src/backend/filters/profile.cpp:644 #: ../src/backend/filters/spectrumPlot.cpp:65 msgid "Count" msgstr "Anzahl" #: ../src/gui/dialogs/ExportPos.cpp:444 msgid "Export Pos Data" msgstr "POS Daten exportieren" #: ../src/gui/dialogs/ExportPos.cpp:447 msgid "Tree of filters, select leaves to show ion data." msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:449 msgid "Add all data from all filters" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:450 msgid "Add all data from currently selected filter" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:451 msgid "Add selected data from currently selected filter" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:73 msgid "Panel Display" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:75 msgid "Online Updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:77 ../src/gui/dialogs/prefDialog.cpp:577 msgid "Startup" msgstr "Startup" #: ../src/gui/dialogs/prefDialog.cpp:78 msgid "Camera Speed" msgstr "Kamerageschwindigkeit" #: ../src/gui/dialogs/prefDialog.cpp:79 msgid "Available Filters" msgstr "Verfügbare Filter" #: ../src/gui/dialogs/prefDialog.cpp:84 msgid "Reset All" msgstr "Alle zurücksetzen" #: ../src/gui/dialogs/prefDialog.cpp:87 msgid "Show all panels" msgstr "Zeige alle Fenster" #: ../src/gui/dialogs/prefDialog.cpp:88 msgid "Remember last" msgstr "Zuletzt verwendet" #: ../src/gui/dialogs/prefDialog.cpp:89 msgid "Show Selected" msgstr "Zeige Auswahl" #: ../src/gui/dialogs/prefDialog.cpp:92 msgid "Control Pane" msgstr "Kontrollfenster" #: ../src/gui/dialogs/prefDialog.cpp:93 msgid "Raw Data Panel" msgstr "Rohdatenfenster" #: ../src/gui/dialogs/prefDialog.cpp:94 ../src/gui/mainFrame.cpp:744 msgid "Plot List" msgstr "Plotliste" #: ../src/gui/dialogs/prefDialog.cpp:96 msgid "Periodically notify about available updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:98 msgid "Prefer orthographic at startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:99 msgid "Move Rate" msgstr "Bewegungsgeschwindigkeit" #: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104 msgid "(slow)" msgstr "(langsam)" #: ../src/gui/dialogs/prefDialog.cpp:102 ../src/gui/dialogs/prefDialog.cpp:106 msgid "(fast)" msgstr "(schnell)" #: ../src/gui/dialogs/prefDialog.cpp:103 msgid "Zoom Rate" msgstr "Zoomgeschwindigkeit" #: ../src/gui/dialogs/prefDialog.cpp:433 msgid "Show all panels when starting program" msgstr "Zeige alle Fenster beim Programmstart" #: ../src/gui/dialogs/prefDialog.cpp:436 msgid "Show panels visible at last shutdown when starting program" msgstr "Beim Programmstart zuletzt eingeschaltete Fenster anzeigen." #: ../src/gui/dialogs/prefDialog.cpp:443 msgid "Show selected panels when starting program" msgstr "Zeige ausgewählte Fenster beim Programmstart" #: ../src/gui/dialogs/prefDialog.cpp:492 msgid "Preferences" msgstr "Voreinstellungen" #: ../src/gui/dialogs/prefDialog.cpp:494 msgid "Set the method of panel layout when starting the program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:497 msgid "" "Lets the program check the internet to see if updates to the program version " "are available, then notifies you about updates now and again." msgstr "" "Lässt das Programm via Internet überprüfen ob Updates für diese " "Programmversion verfügbar sind. Danach informiert es über die neuen Updates." #: ../src/gui/dialogs/prefDialog.cpp:499 msgid "" "By default, use an orthographic camera at startup. State files will override " "this preference." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:500 msgid "Camera translation, orbit and swivel rates. " msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:501 msgid "Camera zooming rate." msgstr "Zoomgeschwindigkeit der Kamera" #: ../src/gui/dialogs/prefDialog.cpp:503 msgid "Reset the filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:504 msgid "Reset all filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:576 msgid "Filt. Default" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:578 msgid "Camera" msgstr "Kamera" #: ../src/gui/mainFrame.cpp:123 msgid "New camera name..." msgstr "Neuer Kameraname..." #: ../src/gui/mainFrame.cpp:124 msgid "New stash name..." msgstr "" #: ../src/gui/mainFrame.cpp:129 msgid "New Filter..." msgstr "" #: ../src/gui/mainFrame.cpp:146 ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 #: ../src/backend/filters/annotation.h:102 msgid "Annotation" msgstr "Kommentar" #: ../src/gui/mainFrame.cpp:147 msgid "Bounding Box" msgstr "Begrenzungs-Box" #: ../src/gui/mainFrame.cpp:148 ../src/backend/filters/ionClip.cpp:581 #: ../src/backend/filters/ionClip.h:66 msgid "Clipping" msgstr "Zuschneiden" #: ../src/gui/mainFrame.cpp:149 ../src/backend/filters/clusterAnalysis.h:151 msgid "Cluster Analysis" msgstr "Clusteranalyse" #: ../src/gui/mainFrame.cpp:150 msgid "Compos. Profiles" msgstr "Konz.Profil" #: ../src/gui/mainFrame.cpp:151 msgid "Downsampling" msgstr "Datenreduktion" #: ../src/gui/mainFrame.cpp:152 msgid "Extern. Prog." msgstr "Ext. Progr." #: ../src/gui/mainFrame.cpp:153 msgid "Ion Colour" msgstr "Ionenfarbe" #: ../src/gui/mainFrame.cpp:154 msgid "Ion Info" msgstr "Ion Info" #: ../src/gui/mainFrame.cpp:155 msgid "Ion Transform" msgstr "Ionentransform" #: ../src/gui/mainFrame.cpp:156 ../src/backend/filters/spectrumPlot.h:78 msgid "Spectrum" msgstr "Spektrum" #: ../src/gui/mainFrame.cpp:157 msgid "Range File" msgstr "Rangedatei" #: ../src/gui/mainFrame.cpp:158 ../src/backend/filters/spatialAnalysis.h:228 msgid "Spat. Analysis" msgstr "Räumliche Analyse" #: ../src/gui/mainFrame.cpp:159 ../src/backend/filters/voxelise.h:102 msgid "Voxelisation" msgstr "Voxelisation" #: ../src/gui/mainFrame.cpp:160 ../src/backend/filters/voxelLoad.h:86 msgid "Voxel Load" msgstr "" #: ../src/gui/mainFrame.cpp:411 msgid "XML State File (*.xml)" msgstr "" #: ../src/gui/mainFrame.cpp:412 msgid "POS File (*.pos)" msgstr "" #: ../src/gui/mainFrame.cpp:413 msgid "LAWATAP ATO File (*.ato)" msgstr "" #: ../src/gui/mainFrame.cpp:414 msgid "Text File (*.txt, *.csv)" msgstr "" #: ../src/gui/mainFrame.cpp:415 msgid "3Dap Files (*.ops)" msgstr "" #: ../src/gui/mainFrame.cpp:416 msgid "VTK rectangular grids (*.vtk)" msgstr "" #: ../src/gui/mainFrame.cpp:417 msgid "Raw Binary files (*.raw)" msgstr "" #: ../src/gui/mainFrame.cpp:418 msgid "All Files (*)" msgstr "" #: ../src/gui/mainFrame.cpp:496 msgid "OpenGL Failed" msgstr "OpenGL fehlgeschlagen" #: ../src/gui/mainFrame.cpp:497 ../src/gui/mainFrame.cpp:499 msgid "" "Unable to initialise the openGL (3D) panel. Program cannot start. Please " "check your video drivers." msgstr "" "Kann das OpenGL (3D)-Panel nicht initialisieren. Das Programm kann nicht " "gestartet werden. Bitte überprüfen Sie Ihren Video-Treiber." #: ../src/gui/mainFrame.cpp:522 msgid "&Open...\tCtrl+O" msgstr "&Öffnen...\tCtrl+O" #: ../src/gui/mainFrame.cpp:522 msgid "Open state file" msgstr "Statusdatei öffnen" #: ../src/gui/mainFrame.cpp:523 msgid "&Merge...\tCtrl+Shift+O" msgstr "&Zusammenführen...\tCtrl+Shift+O" #: ../src/gui/mainFrame.cpp:523 msgid "Merge other file" msgstr "" #: ../src/gui/mainFrame.cpp:527 msgid "&Recent" msgstr "&Letzte" #: ../src/gui/mainFrame.cpp:528 msgid "&Save\tCtrl+S" msgstr "&Speichern\tCtrl+S" #: ../src/gui/mainFrame.cpp:528 msgid "Save state to file" msgstr "Status in Datei speichern" #: ../src/gui/mainFrame.cpp:530 msgid "Save &As...\tCtrl+Shift+S" msgstr "Speichern &als...\tCtrl+Shift+S" #: ../src/gui/mainFrame.cpp:530 msgid "Save current state to new file" msgstr "Aktuellen Status als neue Datei speichern" #: ../src/gui/mainFrame.cpp:533 msgid "&Plot...\tCtrl+P" msgstr "&Plot...\tCtrl+P" #: ../src/gui/mainFrame.cpp:533 msgid "Export Current Plot" msgstr "Aktuellen Plot exportieren" #: ../src/gui/mainFrame.cpp:534 msgid "&Image...\tCtrl+I" msgstr "&Bild...\tCtrl+I" #: ../src/gui/mainFrame.cpp:534 msgid "Export Current 3D View" msgstr "Aktuelle 3D Ansicht exportieren" #: ../src/gui/mainFrame.cpp:535 msgid "Ion&s...\tCtrl+N" msgstr "Ion&en...\tCtrl+N" #: ../src/gui/mainFrame.cpp:535 msgid "Export Ion Data" msgstr "Ionendaten exportieren" #: ../src/gui/mainFrame.cpp:536 msgid "Ran&ges...\tCtrl+G" msgstr "Ran&ges...\tCtrl+G" #: ../src/gui/mainFrame.cpp:536 msgid "Export Range Data" msgstr "Rangedaten exportieren" #: ../src/gui/mainFrame.cpp:537 msgid "&Voxels...\tCtrl+Shift+V" msgstr "" #: ../src/gui/mainFrame.cpp:537 msgid "Export Voxel Data" msgstr "" #: ../src/gui/mainFrame.cpp:539 msgid "&Animate Filters...\tCtrl+T" msgstr "" #: ../src/gui/mainFrame.cpp:539 msgid "Export Animated Filter" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Ani&mate Camera...\tCtrl+M" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Export Animated Camera" msgstr "" #: ../src/gui/mainFrame.cpp:541 msgid "Pac&kage...\tCtrl+K" msgstr "Pa&ket...\tCtrl+K" #: ../src/gui/mainFrame.cpp:541 msgid "Export analysis package" msgstr "Analysepaket exportieren" #: ../src/gui/mainFrame.cpp:543 msgid "&Export" msgstr "&Exportieren" #: ../src/gui/mainFrame.cpp:546 msgid "&Quit\tCtrl+Q" msgstr "&Beenden\tCtrl+Q" #: ../src/gui/mainFrame.cpp:546 ../src/gui/mainFrame.cpp:548 msgid "Exit Program" msgstr "Programm beenden" #: ../src/gui/mainFrame.cpp:548 msgid "E&xit" msgstr "Beenden" #: ../src/gui/mainFrame.cpp:550 msgid "&File" msgstr "&Datei" #: ../src/gui/mainFrame.cpp:554 msgid "&Background Colour...\tCtrl+B" msgstr "&Hintergrundfarbe...\tCtrl+B" #: ../src/gui/mainFrame.cpp:554 msgid "Change background colour" msgstr "Hintergrundfarbe ändern" #: ../src/gui/mainFrame.cpp:558 msgid "&Control Pane\tF2" msgstr "" #: ../src/gui/mainFrame.cpp:558 ../src/gui/mainFrame.cpp:561 msgid "Toggle left control pane" msgstr "Linkes Kontrollfenster ein/aus schalten" #: ../src/gui/mainFrame.cpp:561 msgid "&Control Pane\tAlt+C" msgstr "&Kontrollfenster\tAlt+C" #: ../src/gui/mainFrame.cpp:567 msgid "&Raw Data Pane\tF3" msgstr "" #: ../src/gui/mainFrame.cpp:567 ../src/gui/mainFrame.cpp:570 msgid "Toggle raw data pane (bottom)" msgstr "Rohdatenfenster (unten)" #: ../src/gui/mainFrame.cpp:570 msgid "&Raw Data Pane\tAlt+R" msgstr "&Rohdatenfenster\tAlt+R" #: ../src/gui/mainFrame.cpp:574 msgid "&Plot List\tF4" msgstr "" #: ../src/gui/mainFrame.cpp:574 ../src/gui/mainFrame.cpp:576 msgid "Toggle plot list" msgstr "Plotliste ein/aus schalten" #: ../src/gui/mainFrame.cpp:576 msgid "&Plot List\tAlt+P" msgstr "&Plot Liste\tAlt+P" #: ../src/gui/mainFrame.cpp:582 msgid "&Legend\tCtrl+L" msgstr "&Legende\tCtrl+L" #: ../src/gui/mainFrame.cpp:582 msgid "Toggle Legend display" msgstr "Legende anzeigen ein/aus" #: ../src/gui/mainFrame.cpp:584 msgid "P&lot..." msgstr "P&lot..." #: ../src/gui/mainFrame.cpp:585 msgid "&Axis\tCtrl+Shift+I" msgstr "&Achsen\tCtrl+Shift+I" #: ../src/gui/mainFrame.cpp:585 msgid "Toggle World Axis display" msgstr "Hauptachsen ein/aus schalten" #: ../src/gui/mainFrame.cpp:590 msgid "&Fullscreen mode\tF11" msgstr "&Vollbildmodus\tF11" #: ../src/gui/mainFrame.cpp:590 ../src/gui/mainFrame.cpp:592 msgid "Next fullscreen mode: with toolbars" msgstr "Nächster Vollbildmodus: ohne Werkzeugleisten" #: ../src/gui/mainFrame.cpp:592 msgid "&Fullscreen mode\tCtrl+Shift+F" msgstr "&Vollbildmodus\tCtrl+Shift+F" #: ../src/gui/mainFrame.cpp:597 msgid "&Undo\tCtrl+Z" msgstr "&Zurück\tCtrl+Z" #: ../src/gui/mainFrame.cpp:599 msgid "&Redo\tCtrl+Y" msgstr "&Wiederholen\tCtrl+Y" #: ../src/gui/mainFrame.cpp:602 msgid "&Range" msgstr "" #: ../src/gui/mainFrame.cpp:605 msgid "&Preferences" msgstr "&Voreinstellungen" #: ../src/gui/mainFrame.cpp:607 msgid "&Edit" msgstr "&Bearbeiten" #: ../src/gui/mainFrame.cpp:610 msgid "&View" msgstr "&Ansicht" #: ../src/gui/mainFrame.cpp:612 msgid "&Help...\tCtrl+H" msgstr "&Hilfe...\tCtrl+H" #: ../src/gui/mainFrame.cpp:612 msgid "Show help files and documentation" msgstr "Hilfedateien und Dokumentation anzeigen" #: ../src/gui/mainFrame.cpp:613 msgid "&Contact..." msgstr "&Kontakt..." #: ../src/gui/mainFrame.cpp:613 msgid "Open contact page" msgstr "Kontaktseite öffnen" #: ../src/gui/mainFrame.cpp:615 msgid "&About..." msgstr "Über 3Depict..." #: ../src/gui/mainFrame.cpp:615 msgid "Information about this program" msgstr "Informationen zu diesem Programm" #: ../src/gui/mainFrame.cpp:616 msgid "&Help" msgstr "&Hilfe" #: ../src/gui/mainFrame.cpp:618 msgid "Stashed Filters" msgstr "Zwischengelagerte Filter" #: ../src/gui/mainFrame.cpp:623 msgid "New Filters" msgstr "" #: ../src/gui/mainFrame.cpp:653 msgid "Auto Refresh" msgstr "" "Autom.\n" "aktualisieren" #: ../src/gui/mainFrame.cpp:659 msgid "Filter settings" msgstr "Filtereinstellungen" #: ../src/gui/mainFrame.cpp:662 msgid "Camera Name" msgstr "Kameraname" #: ../src/gui/mainFrame.cpp:674 msgid "Resize to Fit" msgstr "" #: ../src/gui/mainFrame.cpp:675 msgid "Rotate View" msgstr "" #: ../src/gui/mainFrame.cpp:676 msgid "Rotate +" msgstr "Rotieren+" #: ../src/gui/mainFrame.cpp:677 msgid "Rotate-" msgstr "Rotieren-" #: ../src/gui/mainFrame.cpp:680 msgid "3D Post-processing" msgstr "3D Nachbearbeitung" #: ../src/gui/mainFrame.cpp:682 msgid "Enable Cropping" msgstr "Zuschneiden aktivieren" #: ../src/gui/mainFrame.cpp:684 ../src/gui/mainFrame.cpp:695 msgid "x-y" msgstr "x-y" #: ../src/gui/mainFrame.cpp:685 ../src/gui/mainFrame.cpp:696 msgid "x-z" msgstr "x-z" #: ../src/gui/mainFrame.cpp:686 ../src/gui/mainFrame.cpp:697 msgid "y-x" msgstr "y-x" #: ../src/gui/mainFrame.cpp:687 ../src/gui/mainFrame.cpp:698 msgid "y-z" msgstr "y-z" #: ../src/gui/mainFrame.cpp:688 ../src/gui/mainFrame.cpp:699 msgid "z-x" msgstr "z-x" #: ../src/gui/mainFrame.cpp:689 ../src/gui/mainFrame.cpp:700 msgid "z-y" msgstr "z-y" #: ../src/gui/mainFrame.cpp:704 msgid "Use camera coordinates" msgstr "Verwende Kamerakoordinaten" #: ../src/gui/mainFrame.cpp:705 msgid "dX" msgstr "dX" #: ../src/gui/mainFrame.cpp:707 msgid "dY" msgstr "dY" #: ../src/gui/mainFrame.cpp:709 msgid "dZ" msgstr "dZ" #: ../src/gui/mainFrame.cpp:711 msgid "Enable Anaglyphic Stereo" msgstr "Anaglyphic Stereo aktivieren" #: ../src/gui/mainFrame.cpp:712 msgid "Flip Channels" msgstr "Kanäle tauschen" #: ../src/gui/mainFrame.cpp:713 msgid "Anaglyph Mode" msgstr "Anaglyphmodus" #: ../src/gui/mainFrame.cpp:715 msgid "Red-Blue" msgstr "Rot-Blau" #: ../src/gui/mainFrame.cpp:716 msgid "Red-Green" msgstr "Rot-Grün" #: ../src/gui/mainFrame.cpp:717 msgid "Red-Cyan" msgstr "Rot-Zyan" #: ../src/gui/mainFrame.cpp:718 msgid "Green-Magenta" msgstr "Grün-Magenta" #: ../src/gui/mainFrame.cpp:722 msgid "Baseline Separation" msgstr "Basislinienabstand" #: ../src/gui/mainFrame.cpp:724 ../src/backend/filters/filterCommon.cpp:744 #: ../src/backend/filters/profile.cpp:1203 #: ../src/backend/filters/boundingBox.cpp:660 #: ../src/backend/filters/dataLoad.cpp:647 #: ../src/backend/filters/spectrumPlot.cpp:701 msgid "Appearance" msgstr "" #: ../src/gui/mainFrame.cpp:725 msgid "Smooth && translucent objects" msgstr "Glatte && durchsichtige Objekte" #: ../src/gui/mainFrame.cpp:727 msgid "3D lighting" msgstr "3D Beleuchtung" #: ../src/gui/mainFrame.cpp:730 msgid "Performance" msgstr "" #: ../src/gui/mainFrame.cpp:731 msgid "Fast and weak randomisation." msgstr "Schnelle aber schwache Randomisierung" #: ../src/gui/mainFrame.cpp:733 msgid "Limit Output Pts" msgstr "" #: ../src/gui/mainFrame.cpp:738 msgid "Filter caching" msgstr "Filter zwischenspeichern" #: ../src/gui/mainFrame.cpp:740 msgid "Max. Ram usage (%)" msgstr "Max. RAM-Nutzung (%)" #: ../src/gui/mainFrame.cpp:812 msgid "Warning: Your configuration file appears to be invalid:\n" msgstr "Warnung: Ihre Konfigurationsdatei scheint ungültig zu sein.\n" #: ../src/gui/mainFrame.cpp:813 msgid "\tConfig Load: " msgstr "" #: ../src/gui/mainFrame.cpp:1127 msgid "Current state has not been saved, would you like to save it now?" msgstr "" #: ../src/gui/mainFrame.cpp:1128 msgid "State changed" msgstr "" #: ../src/gui/mainFrame.cpp:1150 ../src/gui/mainFrame.cpp:1202 msgid "Select Data or State File..." msgstr "Daten oder Statusdatei auswählen..." #: ../src/gui/mainFrame.cpp:1214 msgid "Merged file." msgstr "Datei zusammengeführt." #: ../src/gui/mainFrame.cpp:1317 msgid "Tip: You can use ⌘ (command) to merge" msgstr "Tip: Sie können ⌘ (command) zum Zusammenführen verwenden" #: ../src/gui/mainFrame.cpp:1319 msgid "Tip: You can use ctrl to merge" msgstr "Tip: Sie können strg zum Zusammen führen verwenden" #: ../src/gui/mainFrame.cpp:1353 msgid "Load error" msgstr "Fehler beim Laden" #: ../src/gui/mainFrame.cpp:1354 msgid "" "Error loading state file.\n" "See console for more info." msgstr "" "Fehler beim Laden der Statusdatei.\n" "Konsole für mehr Informationen." #: ../src/gui/mainFrame.cpp:1362 msgid "" "This state file contains filters that can be unsafe to run\n" "Do you wish to remove these before continuing?." msgstr "" "Diese Statusdatei enthält Filter deren Anwendung möglicherweise unsicher " "ist. Wollen Sie diese entfernen." #: ../src/gui/mainFrame.cpp:1363 msgid "Security warning" msgstr "Sicherheitswarnung" #: ../src/gui/mainFrame.cpp:1576 ../src/gui/mainFrame.cpp:1672 #: ../src/gui/mainFrame.cpp:2125 msgid "Unable to save" msgstr "Speichern nicht möglich" #: ../src/gui/mainFrame.cpp:1577 msgid "No plot available. Please create a plot before exporting." msgstr "Kein Plot vefügbar. Plot muss vor dem Exportieren erzeugt werden." #: ../src/gui/mainFrame.cpp:1581 msgid "Save plot..." msgstr "Plot speichern..." #: ../src/gui/mainFrame.cpp:1582 msgid "" "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*." "svg|PNG File (*.png)|*.png|All Files (*)|*" msgstr "" "Dateierweiterung (svg,png)|*.svg;*.png|Skalierbare Vektorgrafik (*.svg)|*." "svg|PNG Datei (*.png)|*.png|Alle Dateien (*)|*" #: ../src/gui/mainFrame.cpp:1636 msgid "Select type for save" msgstr "" #: ../src/gui/mainFrame.cpp:1637 msgid "Choose file type" msgstr "" #: ../src/gui/mainFrame.cpp:1657 ../src/gui/mainFrame.cpp:1714 #: ../src/gui/mainFrame.cpp:1750 msgid "Choose resolution" msgstr "Auflösung auswählen" #: ../src/gui/mainFrame.cpp:1673 msgid "Unknown file extension. Please use \"svg\" or \"png\"" msgstr "Unbekannte Dateierweiterung. Bitte verwenden Sie \"svg\" oder \"png\"" #: ../src/gui/mainFrame.cpp:1684 msgid "Saved plot: " msgstr "Gespeicherter Plot:" #: ../src/gui/mainFrame.cpp:1691 ../src/gui/mainFrame.cpp:1743 msgid "Save Image..." msgstr "Speichere Bild..." #: ../src/gui/mainFrame.cpp:1692 ../src/gui/mainFrame.cpp:1744 msgid "PNG File (*.png)|*.png|All Files (*)|*" msgstr "PNG Datei (*.png)|*.png|Alle Dateien (*)|*" #: ../src/gui/mainFrame.cpp:1706 msgid "File already exists. Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1707 ../src/gui/mainFrame.cpp:2551 #: ../src/gui/mainFrame.cpp:2803 ../src/gui/mainFrame.cpp:2826 msgid "Overwrite?" msgstr "Überschreiben?" #: ../src/gui/mainFrame.cpp:1734 ../src/gui/mainFrame.cpp:1810 msgid "Saved 3D View :" msgstr "Gespeicherte 3D Ansicht" #: ../src/gui/mainFrame.cpp:1764 msgid "Program limitation" msgstr "Programmeinschränkung" #: ../src/gui/mainFrame.cpp:1765 msgid "" "Limitation on the screenshot dimension; please ensure that both width and " "height exceed the initial values,\n" " or that they are smaller than the initial values.\n" " If this bothers, please submit a bug." msgstr "" "Beschränkung der Screenshot Dimensionen; stellen Sie bitte sicher, dass " "Breite und Höhe die ursprünglichen Werte überschreiten, oder dass diese " "kleiner als die ursprünglichen Werte sind. Sollte Sie dies stören, melden " "Sie bitte einen Bug." #: ../src/gui/mainFrame.cpp:1782 msgid "Number of frames" msgstr "Bilderanzahl" #: ../src/gui/mainFrame.cpp:1839 msgid "Abo&rt" msgstr "" #: ../src/gui/mainFrame.cpp:1841 msgid "&Refresh" msgstr "Aktualisie&ren" #: ../src/gui/mainFrame.cpp:1966 msgid "Cannot animate with no filters." msgstr "" #: ../src/gui/mainFrame.cpp:2048 msgid "Animating" msgstr "" #: ../src/gui/mainFrame.cpp:2049 msgid "Performing refresh" msgstr "" #: ../src/gui/mainFrame.cpp:2075 msgid "Filter property change failed" msgstr "" #: ../src/gui/mainFrame.cpp:2097 msgid "Refresh failed on frame :" msgstr "" #: ../src/gui/mainFrame.cpp:2126 msgid "Image save failed for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2151 msgid "Ion save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2152 msgid "Unable to save ions for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2187 ../src/gui/mainFrame.cpp:2205 msgid "Plot save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2188 ../src/gui/mainFrame.cpp:2206 msgid "Unable to save plot or frame " msgstr "" #: ../src/gui/mainFrame.cpp:2255 msgid "Range save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2256 msgid "Unable to save range for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2285 msgid "Voxel save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2286 msgid "Unable to save voxels for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2315 msgid "Animate failed" msgstr "" #: ../src/gui/mainFrame.cpp:2339 ../src/gui/mainFrame.cpp:2505 #: ../src/gui/mainFrame.cpp:2612 ../src/gui/mainFrame.cpp:2639 msgid "No filters means no data to export" msgstr "Keine Filter bedeutet keine Daten zum Exportieren" #: ../src/gui/mainFrame.cpp:2353 msgid "Package name" msgstr "Paketname" #: ../src/gui/mainFrame.cpp:2354 msgid "Package directory name" msgstr "Paketverzeichnis" #: ../src/gui/mainFrame.cpp:2356 msgid "AnalysisPackage" msgstr "Analysepaket" #: ../src/gui/mainFrame.cpp:2369 msgid "Package folder already exists, won't overwrite." msgstr "Paketverzeichnis existiert bereits. Werde es nicht überschreiben." #: ../src/gui/mainFrame.cpp:2370 msgid "Not available" msgstr "Nicht verfügbar" #: ../src/gui/mainFrame.cpp:2395 msgid "" "Package folder creation failed\n" "check writing to this location is possible." msgstr "" "Anlegen des Paketverzeichnisses fehlgeschlagen\n" "Überprüfen Sie ob der angegenbene Ort schreibgeschützt ist." #: ../src/gui/mainFrame.cpp:2396 msgid "Folder creation failed" msgstr "Anlegen des Ordners ist fehlgeschlagen" #: ../src/gui/mainFrame.cpp:2416 msgid "Copying" msgstr "kopiere" #: ../src/gui/mainFrame.cpp:2417 msgid "Copying referenced files" msgstr "" #: ../src/gui/mainFrame.cpp:2483 msgid "Error copying file" msgstr "Fehler beim Kopieren der Datei" #: ../src/gui/mainFrame.cpp:2492 msgid "Saved package: " msgstr "Gespeicherte Pakete: " #: ../src/gui/mainFrame.cpp:2516 msgid "Export" msgstr "Exportieren" #: ../src/gui/mainFrame.cpp:2522 msgid "" "POS Data (*.pos)|*.pos|Text File (*.txt)|*.txt|VTK Legacy (*.vtk)|*.vtk|All " "Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2550 ../src/gui/mainFrame.cpp:2802 msgid "File already exists, overwrite?" msgstr "Datei existiert bereits. Überschreiben?" #: ../src/gui/mainFrame.cpp:2591 msgid "Saved ions: " msgstr "Gespeicherte Ionen:" #: ../src/gui/mainFrame.cpp:2616 msgid "Export Ranges" msgstr "Range exportieren" #: ../src/gui/mainFrame.cpp:2652 msgid "No voxel filters" msgstr "" #: ../src/gui/mainFrame.cpp:2698 msgid "Select voxels..." msgstr "" #: ../src/gui/mainFrame.cpp:2705 msgid "Save voxels..." msgstr "" #: ../src/gui/mainFrame.cpp:2706 msgid "" "Raw Binary Data (float32) (*.raw)|*.raw|VTK Legacy (*.vtk)|*.vtk|All Files " "(*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2763 msgid "Exported voxels" msgstr "" #: ../src/gui/mainFrame.cpp:2767 msgid " (VTK format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2772 msgid " (RAW format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2784 msgid "Save state..." msgstr "Speichere Status..." #: ../src/gui/mainFrame.cpp:2785 msgid "XML state file (*.xml)|*.xml|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2825 msgid "Files have been referred to using relative paths. Keep relative paths?" msgstr "" "Auf Dateien wurde mit relativen Pfaden verwiesen. Relative Pfade beibehalten?" #: ../src/gui/mainFrame.cpp:2858 msgid "Saved state: " msgstr "Gespeicherter Status: " #: ../src/gui/mainFrame.cpp:2934 msgid "Range editor" msgstr "" #: ../src/gui/mainFrame.cpp:3202 msgid "Manual not found locally. Launching web browser" msgstr "Anleitung konnte lokal nicht gefunden werden. Starte Webbrowser" #: ../src/gui/mainFrame.cpp:3211 msgid "Opening contact page in external web browser" msgstr "Öffne Kontaktseite in externem Browser" #: ../src/gui/mainFrame.cpp:3219 msgid "No filter stashes to edit." msgstr "Keine Filterstashes zum Bearbeiten." #: ../src/gui/mainFrame.cpp:3223 msgid "Filter Stashes" msgstr "Filter Stashes" #: ../src/gui/mainFrame.cpp:3240 msgid "Quick and dirty analysis for point data." msgstr "\"Quick and dirty\" Analyse von Punktdaten." #: ../src/gui/mainFrame.cpp:3250 msgid "Compiled with wx Version: " msgstr "Kompiliert mit wx Version: " #: ../src/gui/mainFrame.cpp:3271 msgid "Press enter to store new stash" msgstr "Eingabe drücken um neuen Filterstash zu speichern" #: ../src/gui/mainFrame.cpp:3277 msgid "Press enter to restore stash" msgstr "Eingabe drücken um Stash wiederherzustellen" #: ../src/gui/mainFrame.cpp:3310 msgid "Unable to create stash, selection invalid" msgstr "Stash kann nicht erstellt werden, Auswahl ungültig" #: ../src/gui/mainFrame.cpp:3317 msgid "Created new filter tree stash" msgstr "Neuer Filterstash wurde erzeugt" #: ../src/gui/mainFrame.cpp:3426 msgid "Filter type not a data source - can't be at tree base" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete\tDel" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3639 msgid "Moving - Hold ⌘ (command) to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3641 msgid "Moving - Hold control to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3835 ../src/gui/mainFrame.cpp:4234 msgid "" "Filter settings are experimental. Program may be unstable when using this " "filter." msgstr "" #: ../src/gui/mainFrame.cpp:3994 msgid "Press enter to store new camera" msgstr "Eingabe drücken um neue Kamera zu speichern" #: ../src/gui/mainFrame.cpp:3996 msgid "Press enter to restore camera" msgstr "Eingabe drücken um Kamera wiederherzustellen" #: ../src/gui/mainFrame.cpp:4021 ../src/gui/mainFrame.cpp:4062 msgid "Restored camera: " msgstr "Wiederhergestellte Kamera: " #: ../src/gui/mainFrame.cpp:4039 msgid "Stored camera: " msgstr "Gespeicherte Kamera: " #: ../src/gui/mainFrame.cpp:4144 msgid "Select an item from the filter tree before choosing a new filter" msgstr "" "Aktivieren Sie zuerst ein Punkt aus dem Filterverlauf bevor Sie einen neuen " "Filter auswählen" #: ../src/gui/mainFrame.cpp:4146 msgid "Load data source (file->open) before choosing a new filter" msgstr "Lade Datenquelle (Datei->öffnen) vor dem Auswählen eines neuen Filters" #: ../src/gui/mainFrame.cpp:4161 msgid "Select RNG File..." msgstr "RNG Datei auswählen..." #: ../src/gui/mainFrame.cpp:4182 msgid "Failed reading range file." msgstr "Fehler beim Lesen der Rangedatei." #: ../src/gui/mainFrame.cpp:4186 msgid "Error loading file" msgstr "Fehler beim Laden der Datei" #: ../src/gui/mainFrame.cpp:4254 ../src/gui/mainFrame.cpp:4354 #: ../src/gui/mainFrame.cpp:5900 ../src/gui/mainFrame.cpp:6430 msgid "Cons." msgstr "Kons." #: ../src/gui/mainFrame.cpp:4318 msgid "Refresh Aborted." msgstr "Aktualisieren abgebrochen" #: ../src/gui/mainFrame.cpp:4358 msgid "*Cons." msgstr "" #: ../src/gui/mainFrame.cpp:4360 msgid "§Cons." msgstr "§Kons." #: ../src/gui/mainFrame.cpp:4422 msgid "Complete" msgstr "" #: ../src/gui/mainFrame.cpp:4520 msgid "msgs" msgstr "" #: ../src/gui/mainFrame.cpp:4561 msgid "Autosave complete." msgstr "Autosave beendet" #: ../src/gui/mainFrame.cpp:4775 msgid "Aborting...." msgstr "" #: ../src/gui/mainFrame.cpp:4844 msgid "Updated." msgstr "" #: ../src/gui/mainFrame.cpp:4853 msgid "Calculating..." msgstr "" #: ../src/gui/mainFrame.cpp:4856 msgid "% Done (Esc aborts)" msgstr "\\% fertig (Esc abbrechen)" #: ../src/gui/mainFrame.cpp:4858 msgid "% Done" msgstr "\\% fertig" #: ../src/gui/mainFrame.cpp:5133 msgid "Tip: You can shift-click to force full refresh, if required" msgstr "" #: ../src/gui/mainFrame.cpp:5195 msgid "No data to save" msgstr "Keine Daten zum Sichern" #: ../src/gui/mainFrame.cpp:5383 msgid "Aborting..." msgstr "Abbrechen..." #: ../src/gui/mainFrame.cpp:5389 msgid "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " msgstr "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " #: ../src/gui/mainFrame.cpp:5390 ../src/gui/mainFrame.cpp:5410 msgid "Confirmation request" msgstr "Bestätigungsabfrage" #: ../src/gui/mainFrame.cpp:5409 msgid "Are you sure you wish to exit 3Depict?" msgstr "Sind Sie sicher, dass Sie 3Depict beenden wollen?" #: ../src/gui/mainFrame.cpp:5928 msgid "Update Notice: New version " msgstr "Updatenotiz: Neue Version " #: ../src/gui/mainFrame.cpp:5928 msgid " found online." msgstr " online gefunden." #: ../src/gui/mainFrame.cpp:5932 msgid "Online Check: " msgstr "Überprüfe online:" #: ../src/gui/mainFrame.cpp:5932 msgid " is up-to-date." msgstr "ist up-to-date." #: ../src/gui/mainFrame.cpp:6022 msgid "An auto-save state was found, would you like to restore it?." msgstr "Ein auto-save Status wurde gefunden. Wollen Sie ihn wiederherstellen?" #: ../src/gui/mainFrame.cpp:6023 msgid "Autosave" msgstr "Automatisch speichern" #: ../src/gui/mainFrame.cpp:6030 msgid "Unable to load autosave file.." msgstr "Kann Autosavedatei nicht laden.." #: ../src/gui/mainFrame.cpp:6221 msgid "List of available filters" msgstr "Liste der verfügbaren Filter" #: ../src/gui/mainFrame.cpp:6223 msgid "" "Tree - drag to move items, hold ⌘ for copy, shift for splice. Tap delete to " "remove items, multi-click to rename" msgstr "" #: ../src/gui/mainFrame.cpp:6225 msgid "" "Tree - drag to move items, hold Ctrl for copy, shift for splice. Tap delete " "to remove items, multi-click to rename." msgstr "" #: ../src/gui/mainFrame.cpp:6227 msgid "" "Enable/Disable automatic updates of data when filter change takes effect" msgstr "" "Ein/Ausschalten vom automatischen Aktualisieren der Daten wenn Änderungen am " "Filter wirksam werden" #: ../src/gui/mainFrame.cpp:6230 msgid "" "Enable/Disable \"Alpha blending\" (transparency) in rendering system. " "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") " "and to make transparent surfaces. Disabling will provide faster rendering " "but look more blocky" msgstr "" #: ../src/gui/mainFrame.cpp:6231 msgid "" "Enable/Disable lighting calculations in rendering, for objects that request " "this. Lighting provides important depth cues for objects comprised of 3D " "surfaces. Disabling may allow faster rendering in complex scenes" msgstr "" "Ein/Ausschalten der Beleuchtungseffekte beim Rendern von Objekten die dies " "anfordern. Beleuchtung bietet wichtige 'depth cues' für mit 3D Oberflächen " "umrandete Objekte. Deaktivieren erlaubt u.U. schnelleres Rendern bei " "komplizierten Szenen." #: ../src/gui/mainFrame.cpp:6232 msgid "" "Enable/Disable weak randomisation (Galois linear feedback shift register). " "Strong randomisation uses a much slower random selection method, but " "provides better protection against inadvertent correlations, and is " "recommended for final analyses" msgstr "" "Ein/Ausschalten der schwachen Randomisierung (Galois linear feedback shift " "register). Starke Randomisierung verwendet einen viel langsamere " "Auswahlmethode bietet dafür aber einen besseren Schutz gegen unbeabsichtigte " "Korrelationen und wird für die endgültige Analyse empfohlen." #: ../src/gui/mainFrame.cpp:6234 msgid "" "Limit the number of points that can be displayed in the 3D scene. Does not " "affect filter tree calculations. Disabling this can severely reduce " "performance, due to large numbers of points being visible at once." msgstr "" #: ../src/gui/mainFrame.cpp:6235 msgid "" "Enable/Disable caching of intermediate results during filter updates. " "Disabling caching will use less system RAM, though changes to any filter " "property will cause the entire filter tree to be recomputed, greatly slowing " "computations" msgstr "" #: ../src/gui/mainFrame.cpp:6237 msgid "Camera data information" msgstr "Kamerainformation" #: ../src/gui/mainFrame.cpp:6238 ../src/gui/mainFrame.cpp:6239 #: ../src/gui/mainFrame.cpp:6240 ../src/gui/mainFrame.cpp:6241 #: ../src/gui/mainFrame.cpp:6242 ../src/gui/mainFrame.cpp:6243 msgid "Align camera view to this axis" msgstr "" #: ../src/gui/mainFrame.cpp:6244 msgid "Resize view to fit 3D data" msgstr "" #: ../src/gui/mainFrame.cpp:6245 msgid "Rotate view in the +ve direction (anti-clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6246 msgid "Rotate view cin the -ve direction (clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6247 msgid "Step size in degrees for rotation" msgstr "" #: ../src/gui/mainFrame.cpp:6251 msgid "Enable/disable visual effects on final 3D output" msgstr "Ein/Ausschalten von visuellen Effekten in der finalen 3D Ausgabe." #: ../src/gui/mainFrame.cpp:6253 msgid "Enable cropping post-process effect" msgstr "Cropping post-Prozess Effect einschalten" #: ../src/gui/mainFrame.cpp:6256 msgid "" "Colour based 3D effect enable/disable - requires appropriate colour filter " "3D glasses." msgstr "" "Farbbasierte 3D-Effekte ein/ausschalten - erfordert geeignete 3D-Brillen" #: ../src/gui/mainFrame.cpp:6257 msgid "Glasses colour mode" msgstr "Brillenfarbmodus" #: ../src/gui/mainFrame.cpp:6259 msgid "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" msgstr "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" #: ../src/gui/mainFrame.cpp:6263 ../src/backend/filters/dataLoad.cpp:535 msgid "X" msgstr "X" #: ../src/gui/mainFrame.cpp:6264 ../src/backend/filters/dataLoad.cpp:539 msgid "Y" msgstr "Y" #: ../src/gui/mainFrame.cpp:6265 msgid "Save raw data to file" msgstr "Speichere Rohdaten in Datei" #: ../src/gui/mainFrame.cpp:6266 msgid "Copy raw data to clipboard" msgstr "Kopiere Rohdaten in die Zwischenablage" #: ../src/gui/mainFrame.cpp:6267 msgid "Manage \"stashed\" data." msgstr "" #: ../src/gui/mainFrame.cpp:6268 msgid "Program text output" msgstr "Programm Textausgabe" #: ../src/gui/mainFrame.cpp:6269 msgid "Select active camera, or type to create new named camera" msgstr "" #: ../src/gui/mainFrame.cpp:6270 msgid "Remove the selected camera" msgstr "Ausgewählte Kamera entfernen" #: ../src/gui/mainFrame.cpp:6271 msgid "Perform cropping from coordinate frame of camera" msgstr "" #: ../src/gui/mainFrame.cpp:6272 msgid "" "Set the maximum amount of RAM to use in order to speed repeat computations" msgstr "" #: ../src/gui/mainFrame.cpp:6273 msgid "Collapse the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:6274 msgid "Expand the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:6275 msgid "Process the filter tree, hold shift to purge cached filter data" msgstr "" #: ../src/gui/mainFrame.cpp:6390 msgid "Crop" msgstr "Zuschneiden" #: ../src/gui/mainFrame.cpp:6391 msgid "Stereo" msgstr "Stereo" #: ../src/gui/mainFrame.cpp:6408 ../src/backend/filters/externalProgram.cpp:586 #: ../src/backend/filters/ionColour.cpp:336 #: ../src/backend/filters/spectrumPlot.cpp:655 msgid "Data" msgstr "Daten" #: ../src/gui/mainFrame.cpp:6409 msgid "Cam" msgstr "Cam" #: ../src/gui/mainFrame.cpp:6410 msgid "Post" msgstr "Post" #: ../src/gui/mainFrame.cpp:6411 msgid "Tools" msgstr "Werkz." #: ../src/gui/mainFrame.cpp:6429 msgid "Raw" msgstr "Roh" #: ../src/gui/mainFrame.cpp:6473 msgid "Align Camera" msgstr "" #: ../src/gui/mathglPane.cpp:263 msgid "No plots selected." msgstr "Kein Plot ausgewählt." #: ../src/gui/mathglPane.cpp:1233 msgid "" "Unable to allocate requested memory.\n" " Try a lower resolution, or save as vector (SVG)." msgstr "" "Kann den notwendigen Speicher nicht zuordnen. Versuche eine geringer " "Auflösung oder speichere als Vektografik (svg)." #: ../src/gui/mathglPane.cpp:1235 msgid "Plotting functions returned an error:\n" msgstr "Plot-Funktion meldete einen Fehler:\n" #: ../src/gui/mathglPane.cpp:1237 msgid "File readback check failed" msgstr "" #: ../src/gui/mathglPane.cpp:1239 msgid "Filesize during readback appears to be zero." msgstr "" #: ../src/3Depict.cpp:424 msgid "File : " msgstr "Datei : " #: ../src/3Depict.cpp:424 msgid " does not exist. Skipping" msgstr " existiert nicht. Überspringe" #: ../src/backend/configFile.cpp:188 msgid "Config file present, but is not valid (root node test)" msgstr "Konfigurationsdatei vorhanden, aber nicht gültig (root node test)" #: ../src/backend/configFile.cpp:229 msgid "Unable to interpret recent file entry" msgstr "Kann den letzten Dateieintrag nicht interpretieren" #: ../src/backend/configFile.cpp:269 msgid "Unable to determine filter type in defaults listing." msgstr "Kann den Filtertyp im Defaultslisting nicht bestimmen." #: ../src/backend/configFile.cpp:630 msgid "Online access for non win32/apple platforms is intentionally disabled, " msgstr "" "Onlinezugang für nicht Win32/apple systeme wurde absichtlich deaktiviert." #: ../src/backend/configFile.cpp:631 msgid "" "regardless of the settings you use here. Use your package manager to keep up-" "to-date" msgstr "" "Nutzen Sie Ihren Paketmanager um up-to-date zu sein unabhängig von den " "Einstellungen die Sie hier verwenden" #: ../src/backend/plot.cpp:28 ../src/backend/filters/algorithms/mass.cpp:27 #: ../src/backend/filters/voxelise.cpp:104 #: ../src/backend/filters/filterCommon.cpp:66 #: ../src/backend/filters/spectrumPlot.cpp:76 msgid "None" msgstr "Keiner" #: ../src/backend/plot.cpp:29 msgid "Moving avg." msgstr "Gleit.Durchschn." #: ../src/backend/plot.cpp:33 msgid "Lines" msgstr "Linien" #: ../src/backend/plot.cpp:34 msgid "Bars" msgstr "Block" #: ../src/backend/plot.cpp:35 msgid "Steps" msgstr "Stufen" #: ../src/backend/plot.cpp:36 msgid "Stem" msgstr "" #: ../src/backend/plot.cpp:37 msgid "Points" msgstr "Punkte" #: ../src/backend/plot.cpp:39 msgid "Density" msgstr "" #: ../src/backend/plot.cpp:40 msgid "Scatter" msgstr "" #: ../src/backend/plot.cpp:788 ../src/backend/plot.cpp:796 msgid "Multiple data types" msgstr "" #: ../src/backend/plot.cpp:1662 msgid "error" msgstr "Fehler" #: ../src/backend/plot.cpp:1967 msgid "Amplitude" msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid "WARNING: Skipping node " msgstr "WARNUNG: Skipping node " #: ../src/backend/filtertree.cpp:1151 msgid " as it was not recognised" msgstr " wurde nicht erkannt." #: ../src/backend/filtertree.cpp:1189 msgid "Error processing node: " msgstr "Fehler beim Verarbeiten von Node: " #: ../src/backend/filters/externalProgram.cpp:264 msgid "Collate Input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:353 msgid "Execute" msgstr "" #: ../src/backend/filters/externalProgram.cpp:394 msgid "Collate output" msgstr "" #: ../src/backend/filters/externalProgram.cpp:567 #: ../src/backend/filters/externalProgram.cpp:575 msgid "Command" msgstr "Befehl" #: ../src/backend/filters/externalProgram.cpp:568 msgid "" "Full command to send to operating system. See manual for escape sequence " "meanings" msgstr "" #: ../src/backend/filters/externalProgram.cpp:571 msgid "Work Dir" msgstr "Arbeitsverzeichnis" #: ../src/backend/filters/externalProgram.cpp:572 msgid "Directory to run the command in" msgstr "" #: ../src/backend/filters/externalProgram.cpp:578 msgid "Cleanup input" msgstr "Bereinige Eingabe" #: ../src/backend/filters/externalProgram.cpp:579 msgid "Erase input files when command completed" msgstr "" #: ../src/backend/filters/externalProgram.cpp:582 msgid "Cache" msgstr "Zwischenspeicher" #: ../src/backend/filters/externalProgram.cpp:583 msgid "" "Assume program does not alter its output, unless inputs from 3Depict are " "altered" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:41 msgid "VTK (ascii)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:42 msgid "raw binary (float32)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:86 #: ../src/backend/filters/spatialAnalysis.cpp:584 msgid "Load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:150 #: ../src/backend/filters/dataLoad.cpp:499 #: ../src/backend/filters/dataLoad.cpp:515 #: ../src/backend/filters/rangeFile.cpp:561 #: ../src/backend/filters/rangeFile.cpp:571 msgid "File" msgstr "Datei" #: ../src/backend/filters/voxelLoad.cpp:151 msgid "Set the data file to load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:153 msgid "VTK Files (*.vtk)|*.vtk" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:165 msgid "File Type" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:166 msgid "Type of data that file contains" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:169 #: ../src/backend/filters/annotation.cpp:588 msgid "Enable" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:170 #: ../src/backend/filters/annotation.cpp:589 msgid "Enable/disable annotation" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:173 msgid "Data source" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:179 msgid "Specify bounds" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:180 msgid "Manually specify the bounding box" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:185 msgid "Lower corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:186 msgid "Position of lower bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:189 msgid "Upper corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:190 msgid "Position of upper bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:193 #: ../src/backend/filters/annotation.cpp:699 msgid "Positioning" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:28 msgid "Flat TOF" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:35 msgid "INsufficient bins to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:36 msgid "Insufficient counts to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:37 msgid "Insufficient data to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:38 msgid "Data did not appear to be random noise - cannot fit noise level" msgstr "" #: ../src/backend/filters/ionClip.cpp:65 ../src/backend/filters/profile.cpp:55 msgid "Sphere" msgstr "Kugel" #: ../src/backend/filters/ionClip.cpp:66 msgid "Plane" msgstr "Ebene" #: ../src/backend/filters/ionClip.cpp:67 msgid "Cylinder" msgstr "Zylinder" #: ../src/backend/filters/ionClip.cpp:68 msgid "Aligned box" msgstr "Ausgerichtete Box" #: ../src/backend/filters/ionClip.cpp:497 #: ../src/backend/filters/profile.cpp:1081 msgid "Primitive" msgstr "Primitiv" #: ../src/backend/filters/ionClip.cpp:498 msgid "Shape of clipping object" msgstr "" #: ../src/backend/filters/ionClip.cpp:501 #: ../src/backend/filters/profile.cpp:1086 msgid "Show Primitive" msgstr "Zeige Primitiv" #: ../src/backend/filters/ionClip.cpp:502 msgid "Display the 3D interaction object" msgstr "" #: ../src/backend/filters/ionClip.cpp:505 msgid "Invert Clip" msgstr "Invertiere Clip" #: ../src/backend/filters/ionClip.cpp:506 msgid "" "Switch between retaining points inside (disabled) and outside (enabled) of " "primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:517 #: ../src/backend/filters/profile.cpp:1119 msgid "Position for centre of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:520 #: ../src/backend/filters/spatialAnalysis.cpp:144 #: ../src/backend/filters/profile.cpp:1107 #: ../src/backend/filters/profile.cpp:1122 msgid "Radius" msgstr "Radius" #: ../src/backend/filters/ionClip.cpp:521 #: ../src/backend/filters/profile.cpp:1123 msgid "Radius of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:531 msgid "Position that plane passes through" msgstr "" #: ../src/backend/filters/ionClip.cpp:534 msgid "Plane Normal" msgstr "Plane Normal" #: ../src/backend/filters/ionClip.cpp:535 msgid "Perpendicular direction for plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:547 msgid "Centre of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:550 #: ../src/backend/filters/spatialAnalysis.cpp:989 #: ../src/backend/filters/profile.cpp:1100 #: ../src/backend/filters/transform.cpp:1261 msgid "Axis" msgstr "Achse" #: ../src/backend/filters/ionClip.cpp:551 msgid "Positive vector for cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:554 msgid "Lock Axis Mag." msgstr "Achsen Vergr. sperren" #: ../src/backend/filters/ionClip.cpp:555 msgid "Prevent changing length of cylinder during 3D interaction" msgstr "" #: ../src/backend/filters/ionClip.cpp:558 msgid "Radius." msgstr "Radius." #: ../src/backend/filters/ionClip.cpp:559 #: ../src/backend/filters/profile.cpp:1108 msgid "Radius of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:568 msgid "Centre of Aligned Box" msgstr "" #: ../src/backend/filters/ionClip.cpp:571 msgid "Corner offset" msgstr "Corner offset" #: ../src/backend/filters/ionClip.cpp:572 msgid "Vector to corner of box" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:84 #: ../src/backend/filters/clusterAnalysis.cpp:1025 msgid "Size Distribution" msgstr "Größenverteilung" #: ../src/backend/filters/clusterAnalysis.cpp:85 msgid "Chemistry Distribution" msgstr "Chemische Verteilung" #: ../src/backend/filters/clusterAnalysis.cpp:504 msgid "No range data. Can't cluster." msgstr "Keine Rangedaten. Clusteranalyse nicht möglich." #: ../src/backend/filters/clusterAnalysis.cpp:515 msgid "" "No ranges selected for cluster \"core\". Cannot continue with clustering." msgstr "" "Kein Range für cluster \"core\" ausgewählt. Kann mit Clusteranalyse nicht " "weitermachen." #: ../src/backend/filters/clusterAnalysis.cpp:524 msgid "" "No ranges selected for cluster \"bulk\". Cannot continue with clustering." msgstr "" "Kein Range für \"bulk\" ausgewählt. Kann mit Clusteranalyse nicht " "weitermachen." #: ../src/backend/filters/clusterAnalysis.cpp:696 msgid "Morphology Plot" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:697 msgid "\\lambda_1:\\lambda_2 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:698 msgid "\\lambda_2:\\lambda_3 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:699 msgid "Cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:744 msgid "No clusters had sufficient dimensionality to compute singular values" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:802 msgid "Found :" msgstr "Gefunden:" #: ../src/backend/filters/clusterAnalysis.cpp:804 msgid " clusters" msgstr " Cluster" #: ../src/backend/filters/clusterAnalysis.cpp:899 msgid "Compositions (fractional, core+bulk)" msgstr "Zusammensetzungen (fractional, core+bulk)" #: ../src/backend/filters/clusterAnalysis.cpp:901 msgid "Compositions (fractional, core only)" msgstr "Zusammensetzungen (fractional, core only)" #: ../src/backend/filters/clusterAnalysis.cpp:919 msgid "Frequencies (core+bulk)" msgstr "Häufigkeiten (core+bulk)" #: ../src/backend/filters/clusterAnalysis.cpp:950 msgid "Core Link + Erode" msgstr "Core Link + Erode" #: ../src/backend/filters/clusterAnalysis.cpp:953 #: ../src/backend/filters/clusterAnalysis.cpp:957 #: ../src/backend/filters/spatialAnalysis.cpp:804 #: ../src/backend/filters/spatialAnalysis.cpp:809 #: ../src/backend/filters/transform.cpp:1163 #: ../src/backend/filters/ionInfo.cpp:674 msgid "Algorithm" msgstr "Algorithmus" #: ../src/backend/filters/clusterAnalysis.cpp:954 msgid "Cluster algorithm mode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:964 msgid "Core Classify" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:965 msgid "" "Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:970 msgid "Core Classify Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:971 msgid "Restrict only atoms joind by this distance to be cluster sources" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:974 msgid "Classify Knn Max" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:975 msgid "" "Require that the kth NN (this number) is within the classify distance, to be " "a cluster source" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:979 msgid "Core Link Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:980 msgid "Distance between clusters to allow linking" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:983 msgid "Bulk Link" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:984 msgid "Enable linking of non-cluster species - eg for composition analysis" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:989 msgid "Bulk Link (Envelope) dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:990 msgid "" "Distance from core points, that form a cluster, used to grab surrounding " "bulk points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:993 msgid "Erosion" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:994 msgid "" "Enable removal of edge bulk atoms, to remove \"cloud\" of atoms beyond the " "nominal cluster limits (hole-closing halo)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:999 msgid "Erode Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1000 msgid "" "Distance from unclustered material in which bulk points are eroded from " "cluster" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1006 msgid "Clustering Params" msgstr "Cluster Parameter" #: ../src/backend/filters/clusterAnalysis.cpp:1010 msgid "Size Cropping" msgstr "Größeneinschrankungen" #: ../src/backend/filters/clusterAnalysis.cpp:1011 msgid "Remove clusters based upon size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1016 msgid "Min Size" msgstr "Min Größe" #: ../src/backend/filters/clusterAnalysis.cpp:1017 msgid "Remove clusters below this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1020 msgid "Max Size" msgstr "Max Größe" #: ../src/backend/filters/clusterAnalysis.cpp:1021 msgid "Remove clusters above this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1026 msgid "Show number of clusters as a function of cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1031 msgid "Dist. Log Scale" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1032 msgid "Use logarithmic scale for size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1037 msgid "Morphology Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1038 msgid "Create a plot showing cluster aspect ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1041 msgid "Cluster Id" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1042 msgid "Assign cluster output a unique per-cluster value (id)." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1047 msgid "Chemistry Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1048 msgid "Create a plot showing chemistry for each cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1053 msgid "Normalise Comp." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1054 msgid "Convert cluster counts to composition" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1059 msgid "Postprocess" msgstr "Postprozess" #: ../src/backend/filters/clusterAnalysis.cpp:1078 msgid "If selected, use as \"core\" ion type (can make clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1083 msgid "Core Ranges" msgstr "Core Ranges" #: ../src/backend/filters/clusterAnalysis.cpp:1090 msgid "Enable/Disable All" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1091 msgid "Enable/disable all ions for bulk" msgstr "Ein/Ausschalten alle Ionen für bulk." #: ../src/backend/filters/clusterAnalysis.cpp:1103 msgid "" "If selected, use as \"bulk\" ion type (can be included in existing clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1108 msgid "Bulk Ranges" msgstr "Bulk Ranges" #: ../src/backend/filters/clusterAnalysis.cpp:1124 msgid "Max. Sep + Erode" msgstr "Max. Sep + Erode" #: ../src/backend/filters/clusterAnalysis.cpp:1881 msgid " --------------------------- Parameter selection notice ------------- " msgstr " --------------------------- Parameterauswahl Notiz ------------- " #: ../src/backend/filters/clusterAnalysis.cpp:1882 msgid "You have specified a bulk distance larger than half your link distance." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1883 msgid "" "You can do this; thats OK, but the output is no longer independent of the " "computational process;" msgstr "" "Sie könne das machen, das ist in Ordnung, aber die Ausgabe ist nicht länger " "unabhängig vom Berechnungsprozess" #: ../src/backend/filters/clusterAnalysis.cpp:1884 msgid "" "This will be a problem in the case where two or more clusters can equally " "lay claim to a \"bulk\" ion. " msgstr "" "Dies ist ein Problem wenn zwei oder mehrere Cluster auf dasselbe \"bulk\" " "Ion Anspruch erheben. " #: ../src/backend/filters/clusterAnalysis.cpp:1885 msgid "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." msgstr "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." #: ../src/backend/filters/clusterAnalysis.cpp:1886 msgid "" " In theory it is possible to \"join\" the clusters, but this has not been " "implemented for speed reasons." msgstr "" "Theoretisch ist es möglich die Cluster zu 'verbinden', dies wurde jedoch aus " "Gescheindigkeitsgründen nicht implementiert." #: ../src/backend/filters/clusterAnalysis.cpp:1887 msgid "" "If you want this, please contact the author, or just use the source to add " "this in yourself." msgstr "" "Sollten Sie dies wollen, kontaktieren Sie den Autor oder verwenden Sie den " "Sourcecode um es selbst hinzuzufügen." #: ../src/backend/filters/clusterAnalysis.cpp:1888 msgid "---------------------------------------------------------------------- " msgstr "---------------------------------------------------------------------- " #: ../src/backend/filters/clusterAnalysis.cpp:1898 #: ../src/backend/filters/spatialAnalysis.cpp:576 #: ../src/backend/filters/spatialAnalysis.cpp:2428 #: ../src/backend/filters/spatialAnalysis.cpp:2914 #: ../src/backend/filters/spatialAnalysis.cpp:3203 #: ../src/backend/filters/spatialAnalysis.cpp:3505 #: ../src/backend/filters/spatialAnalysis.cpp:3656 #: ../src/backend/filters/spatialAnalysis.cpp:3744 #: ../src/backend/filters/spatialAnalysis.cpp:4016 #: ../src/backend/filters/spatialAnalysis.cpp:4238 #: ../src/backend/filters/spatialAnalysis.cpp:4431 #: ../src/backend/filters/spatialAnalysis.cpp:4661 #: ../src/backend/filters/transform.cpp:1028 msgid "Collate" msgstr "Abgleichen" #: ../src/backend/filters/clusterAnalysis.cpp:1917 msgid "Build Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1945 msgid "Core" msgstr "Kern" #: ../src/backend/filters/clusterAnalysis.cpp:2068 msgid "Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2146 msgid "Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2224 msgid "Re-Collate" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2279 msgid "Classify Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2370 msgid "Build Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2618 #: ../src/backend/filters/clusterAnalysis.cpp:2832 msgid "Cluster Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2619 #: ../src/backend/filters/clusterAnalysis.cpp:2836 msgid "Frequency" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2834 msgid "Composition" msgstr "" #: ../src/backend/filters/voxelise.cpp:96 msgid "None (Raw count)" msgstr "Keine (Roh count)" #: ../src/backend/filters/voxelise.cpp:97 msgid "Volume (Density)" msgstr "Volumen (Dichte)" #: ../src/backend/filters/voxelise.cpp:98 msgid "All Ions (conc)" msgstr "Alle Ionen (Konz)" #: ../src/backend/filters/voxelise.cpp:99 msgid "Ratio (Num/Denom)" msgstr "Verhältnis (Zähler/Nenner)" #: ../src/backend/filters/voxelise.cpp:105 msgid "Gaussian (blur)" msgstr "" #: ../src/backend/filters/voxelise.cpp:106 msgid "Lapl. of Gauss. (edges)" msgstr "" #: ../src/backend/filters/voxelise.cpp:341 msgid "Counting" msgstr "" #: ../src/backend/filters/voxelise.cpp:552 msgid "Gauss Smooth" msgstr "" #: ../src/backend/filters/voxelise.cpp:558 msgid "Calc. Laplace" msgstr "" #: ../src/backend/filters/voxelise.cpp:584 msgid "Voxel Limits (min,max): (" msgstr "Voxel Grenzen (min,max): (" #: ../src/backend/filters/voxelise.cpp:594 #: ../src/backend/filters/filterCommon.cpp:475 msgid "Representation" msgstr "Representation" #: ../src/backend/filters/voxelise.cpp:688 msgid "Fixed Width" msgstr "Fixe Breite" #: ../src/backend/filters/voxelise.cpp:689 msgid "If true, use fixed size voxels, otherwise use fixed count" msgstr "" #: ../src/backend/filters/voxelise.cpp:694 msgid "Bin Width, X" msgstr "Bin-Breite x" #: ../src/backend/filters/voxelise.cpp:695 msgid "Voxel size in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:698 msgid "Bin Width, Y" msgstr "Bin-Breite x" #: ../src/backend/filters/voxelise.cpp:699 msgid "Voxel size in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:702 msgid "Bin Width, Z" msgstr "Bin-Breite x" #: ../src/backend/filters/voxelise.cpp:703 msgid "Voxel size in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:708 msgid "Num Bins , X" msgstr "" #: ../src/backend/filters/voxelise.cpp:709 msgid "Number of bins in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:712 msgid "Num Bins, Y" msgstr "" #: ../src/backend/filters/voxelise.cpp:713 msgid "Number of bins in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:716 msgid "Num Bins, Z" msgstr "" #: ../src/backend/filters/voxelise.cpp:717 msgid "Number of bins Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:747 msgid "Normalise by" msgstr "Normalisieren mit" #: ../src/backend/filters/voxelise.cpp:748 msgid "Method to use to normalise scalar value in each voxel" msgstr "" #: ../src/backend/filters/voxelise.cpp:751 msgid "Computation" msgstr "" #: ../src/backend/filters/voxelise.cpp:758 #: ../src/backend/filters/spatialAnalysis.cpp:1172 #: ../src/backend/filters/spatialAnalysis.cpp:1191 msgid "Numerator" msgstr "Zähler" #: ../src/backend/filters/voxelise.cpp:759 msgid "Parameter \"a\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:776 msgid "Enable this ion for numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:789 #: ../src/backend/filters/voxelise.cpp:808 #: ../src/backend/filters/spatialAnalysis.cpp:1197 #: ../src/backend/filters/spatialAnalysis.cpp:1214 msgid "Denominator" msgstr "Nenner" #: ../src/backend/filters/voxelise.cpp:790 msgid "Parameter \"b\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:804 msgid "Enable this ion for denominator contribution" msgstr "" #: ../src/backend/filters/voxelise.cpp:824 msgid "Threshold Mask" msgstr "" #: ../src/backend/filters/voxelise.cpp:825 msgid "Enable threshold based exclusion of values." msgstr "" #: ../src/backend/filters/voxelise.cpp:830 msgid "Count threshold" msgstr "" #: ../src/backend/filters/voxelise.cpp:831 msgid "Threshold counts above which to keep data (if normalising, denominator)" msgstr "" #: ../src/backend/filters/voxelise.cpp:834 msgid "Mask to Max" msgstr "" #: ../src/backend/filters/voxelise.cpp:835 msgid "" "If enabled, masked values are set to the voxel maximum. If disabled, minimum" msgstr "" #: ../src/backend/filters/voxelise.cpp:839 #: ../src/backend/filters/voxelise.cpp:857 msgid "Filtering" msgstr "Filtern" #: ../src/backend/filters/voxelise.cpp:840 msgid "Smoothing method to use on voxels" msgstr "" #: ../src/backend/filters/voxelise.cpp:844 msgid "Processing" msgstr "" #: ../src/backend/filters/voxelise.cpp:848 msgid "Standard Dev" msgstr "" #: ../src/backend/filters/voxelise.cpp:849 msgid "Filtering Scale (standard deviation)" msgstr "" #: ../src/backend/filters/voxelise.cpp:852 msgid "Kernel Size" msgstr "" #: ../src/backend/filters/voxelise.cpp:853 msgid "" "Filter radius, in multiples of std. dev. Larger -> slower, more accurate" msgstr "" #: ../src/backend/filters/ionColour.cpp:144 msgid "Unable to determine colour limits" msgstr "" #: ../src/backend/filters/ionColour.cpp:302 #: ../src/backend/filters/spatialAnalysis.cpp:1238 msgid "Colour Map" msgstr "Farbtabelle" #: ../src/backend/filters/ionColour.cpp:303 #: ../src/backend/filters/filterCommon.cpp:584 #: ../src/backend/filters/filterCommon.cpp:638 msgid "Colour scheme used to assign points colours by value" msgstr "" #: ../src/backend/filters/ionColour.cpp:306 msgid "Reverse map" msgstr "" #: ../src/backend/filters/ionColour.cpp:307 msgid "Reverse the colour scale" msgstr "" #: ../src/backend/filters/ionColour.cpp:310 #: ../src/backend/filters/filterCommon.cpp:493 #: ../src/backend/filters/filterCommon.cpp:591 #: ../src/backend/filters/filterCommon.cpp:645 #: ../src/backend/filters/filterCommon.cpp:705 msgid "Show Bar" msgstr "Zeige Balken" #: ../src/backend/filters/ionColour.cpp:311 msgid "Display the colour legend in the 3D view" msgstr "" #: ../src/backend/filters/ionColour.cpp:315 msgid "How see-through to make the legend (0- transparent, 1- solid)" msgstr "" #: ../src/backend/filters/ionColour.cpp:318 msgid "Num Colours" msgstr "" #: ../src/backend/filters/ionColour.cpp:319 msgid "Number of unique colours to use in colour map" msgstr "" #: ../src/backend/filters/ionColour.cpp:322 msgid "Auto bounds" msgstr "" #: ../src/backend/filters/ionColour.cpp:323 msgid "Automatically scale colour to min/max of data range" msgstr "" #: ../src/backend/filters/ionColour.cpp:328 #: ../src/backend/filters/filterCommon.cpp:503 #: ../src/backend/filters/filterCommon.cpp:601 #: ../src/backend/filters/filterCommon.cpp:655 #: ../src/backend/filters/filterCommon.cpp:715 msgid "Map start" msgstr "" #: ../src/backend/filters/ionColour.cpp:329 #: ../src/backend/filters/filterCommon.cpp:504 #: ../src/backend/filters/filterCommon.cpp:602 #: ../src/backend/filters/filterCommon.cpp:656 #: ../src/backend/filters/filterCommon.cpp:716 msgid "Assign points with this value to the first colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:332 msgid "Map End" msgstr "" #: ../src/backend/filters/ionColour.cpp:333 #: ../src/backend/filters/filterCommon.cpp:508 #: ../src/backend/filters/filterCommon.cpp:606 #: ../src/backend/filters/filterCommon.cpp:660 #: ../src/backend/filters/filterCommon.cpp:720 msgid "Assign points with this value to the last colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:444 ../src/backend/filter.cpp:198 msgid "Aborted" msgstr "Abgebrochen" #: ../src/backend/filters/spatialAnalysis.cpp:131 msgid "Local Density" msgstr "Lokale Dichte" #: ../src/backend/filters/spatialAnalysis.cpp:132 msgid "Density Filtering" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:133 msgid "Radial Distribution" msgstr "Radial Distribution" #: ../src/backend/filters/spatialAnalysis.cpp:134 msgid "Axial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:135 msgid "Binomial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:136 msgid "Point Em/Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:137 msgid "Local Chemistry" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:138 msgid "Local Chem. Filter" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:139 msgid "Axial DF Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:143 msgid "Neighbour Count" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:639 #: ../src/backend/filters/spatialAnalysis.cpp:2462 #: ../src/backend/filters/spatialAnalysis.cpp:2515 #: ../src/backend/filters/spatialAnalysis.cpp:2919 #: ../src/backend/filters/spatialAnalysis.cpp:3208 #: ../src/backend/filters/spatialAnalysis.cpp:3516 #: ../src/backend/filters/spatialAnalysis.cpp:3662 #: ../src/backend/filters/spatialAnalysis.cpp:4263 #: ../src/backend/filters/spatialAnalysis.cpp:4686 msgid "Build" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:688 #: ../src/backend/filters/spatialAnalysis.cpp:3538 #: ../src/backend/filters/spatialAnalysis.cpp:4146 #: ../src/backend/filters/spatialAnalysis.cpp:4280 #: ../src/backend/filters/spatialAnalysis.cpp:4562 #: ../src/backend/filters/spatialAnalysis.cpp:4703 msgid "Compute" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:805 msgid "Spatial analysis algorithm to use" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:830 #: ../src/backend/filters/spatialAnalysis.cpp:861 msgid "Stop Mode" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:831 msgid "Method to use to terminate algorithm when examining each point" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:837 msgid "NN Max" msgstr "NN Max" #: ../src/backend/filters/spatialAnalysis.cpp:838 msgid "Maximum number of neighbours to examine" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:844 msgid "Normalise bins" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:845 msgid "" "Normalise counts by binwidth. Needed when comparing NN histograms against " "one another" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:848 msgid "Show Random" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:849 msgid "Show a fitted (density matched) theoretical distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:856 msgid "Dist Max" msgstr "Abst. Max." #: ../src/backend/filters/spatialAnalysis.cpp:857 #: ../src/backend/filters/spatialAnalysis.cpp:1226 msgid "Maximum distance from each point for search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:869 #: ../src/backend/filters/spatialAnalysis.cpp:981 #: ../src/backend/filters/profile.cpp:1141 msgid "Num Bins" msgstr "Bin-Anz." #: ../src/backend/filters/spatialAnalysis.cpp:870 #: ../src/backend/filters/spatialAnalysis.cpp:982 msgid "Number of bins for output 1D RDF plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:873 msgid "Surface Remove" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:874 msgid "" "Exclude surface as part of source to minimise bias in RDF (at cost of " "increased noise)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:880 msgid "Remove Dist" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:881 msgid "Minimum distance to remove from surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:887 #: ../src/backend/filters/spatialAnalysis.cpp:1028 #: ../src/backend/filters/profile.cpp:1153 #: ../src/backend/filters/ionInfo.cpp:599 msgid "Normalise" msgstr "Normalisieren" #: ../src/backend/filters/spatialAnalysis.cpp:888 msgid "Perform normalisation of the RDF, rather than raw counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:892 msgid "Plot colour" msgstr "Plotfarbe " #: ../src/backend/filters/spatialAnalysis.cpp:893 #: ../src/backend/filters/spatialAnalysis.cpp:986 msgid "Colour of output plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:897 #: ../src/backend/filters/spatialAnalysis.cpp:971 #: ../src/backend/filters/spatialAnalysis.cpp:976 #: ../src/backend/filters/spatialAnalysis.cpp:993 #: ../src/backend/filters/spatialAnalysis.cpp:1018 #: ../src/backend/filters/spatialAnalysis.cpp:1132 #: ../src/backend/filters/spatialAnalysis.cpp:1229 msgid "Alg. Params." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:908 #: ../src/backend/filters/spatialAnalysis.cpp:1147 msgid "Source" msgstr "Quelle" #: ../src/backend/filters/spatialAnalysis.cpp:909 msgid "Ions to use for initiating RDF search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:924 #: ../src/backend/filters/spatialAnalysis.cpp:1161 #: ../src/backend/filters/spatialAnalysis.cpp:1186 msgid "Enable/disable ion as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:929 #: ../src/backend/filters/spatialAnalysis.cpp:1166 msgid "Source Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:937 msgid "Enable/disable all ions as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:951 #: ../src/backend/filters/spatialAnalysis.cpp:1210 msgid "Enable/disable this ion as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:955 msgid "Target Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:963 #: ../src/backend/filters/spatialAnalysis.cpp:1124 msgid "Cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:964 msgid "Remove points with local density above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:967 #: ../src/backend/filters/spatialAnalysis.cpp:1128 msgid "Retain Upper" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:968 msgid "Retain either points with density above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:985 msgid "Plot Colour" msgstr "Plotfarbe " #: ../src/backend/filters/spatialAnalysis.cpp:990 msgid "Vector along which to calculate distribution function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:998 msgid "Block size" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:999 msgid "Number of ions to use per block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1002 msgid "Max Block Aspect" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1003 msgid "" "Maximum allowable block aspect ratio. Blocks above this aspect are " "discarded. Setting too high decreases correlation strength. Too low causes " "loss of statistical power." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1013 msgid "Extrusion Direction" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1014 msgid "Direction in which blocks are extended during construction." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1022 msgid "Plot Counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1023 msgid "Show the counts in the binomial histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1029 msgid "" "Normalise the counts in the binomial histogram to a probability density " "function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1033 msgid "Expected Freq" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1034 msgid "" "Show the theoretically expected probability density function for a random " "dataset with the same mean" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1042 msgid "Display Grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1043 msgid "Show the extruded grid in the 3D view. This may be slow" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1046 msgid "View Options" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1060 msgid "Ions to use when counting" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1073 msgid "Enable/disable ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1078 msgid "Enabled Ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Data File" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Pos file of points to subtract/replace/etc" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1091 msgid "Match Tol." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1092 msgid "Tolerance to allow for matching" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1104 msgid "Replacment condition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1109 msgid "Replace value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1110 msgid "Use value data from file when replacing ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1114 msgid "Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1125 msgid "Remove points with local concentration above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1129 msgid "Retain either points with concentration above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1148 msgid "Enable/disable all ions as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1173 msgid "Enable/Disable all ions to use as Numerator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1198 msgid "Enable/Disable all ions to use as Denominator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1221 msgid "Angular step (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1222 msgid "Step in degrees between calculations for angular histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1225 msgid "Dist. Max" msgstr "Abst. Max." #: ../src/backend/filters/spatialAnalysis.cpp:1232 msgid "Log scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1233 msgid "Show 2D plot in logarithmic scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1239 msgid "Colour scheme in 2D plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1241 #: ../src/backend/filters/annotation.cpp:816 msgid "Display" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1841 msgid "Spatial analysis aborted by user" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1842 msgid "Insufficient memory for binomial. Reduce input size?" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1843 msgid "Required range data not present" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1844 msgid "Unable to generate usable binomial grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1846 msgid "Insufficient points to continue" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1847 msgid "Unable to load file" msgstr "Kann Datei nicht laden.." #: ../src/backend/filters/spatialAnalysis.cpp:2476 #: ../src/backend/filters/spatialAnalysis.cpp:2529 #: ../src/backend/filters/filterCommon.cpp:524 #: ../src/backend/filters/filterCommon.cpp:574 #: ../src/backend/filters/filterCommon.cpp:627 msgid "Surface" msgstr "Oberfläche" #: ../src/backend/filters/spatialAnalysis.cpp:2569 #: ../src/backend/filters/spatialAnalysis.cpp:2941 #: ../src/backend/filters/spatialAnalysis.cpp:3232 msgid "Analyse" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2648 #: ../src/backend/filters/spatialAnalysis.cpp:2742 #: ../src/backend/filters/spatialAnalysis.cpp:2811 msgid "Radial Distance" msgstr "Radialer Abstand" #: ../src/backend/filters/spatialAnalysis.cpp:2650 #: ../src/backend/filters/spatialAnalysis.cpp:2747 msgid "Count/Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2659 #: ../src/backend/filters/spatialAnalysis.cpp:2755 msgid "NN Freq." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2802 msgid "Warning, " msgstr "Warnung, " #: ../src/backend/filters/spatialAnalysis.cpp:2803 msgid "" " points were unable to find neighbour points that exceeded the search " "radius, and thus terminated prematurely" msgstr "" " Punkte konnten keine Nachbapunkte die den Suchradius überschritten finden " "und beendeten vorzeitig." #: ../src/backend/filters/spatialAnalysis.cpp:2813 msgid " RDF" msgstr " RDF" #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid "Found " msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid " points with no neighbours - these have been dropped" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3139 #: ../src/backend/filters/spatialAnalysis.cpp:3440 msgid "Number Density (\\#/Vol^3)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3164 #: ../src/backend/filters/spatialAnalysis.cpp:3462 msgid "Warning," msgstr "Warnung," #: ../src/backend/filters/spatialAnalysis.cpp:3165 #: ../src/backend/filters/spatialAnalysis.cpp:3463 msgid " points were un-analysable. These have been dropped" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3187 #: ../src/backend/filters/spatialAnalysis.cpp:3485 msgid "And so on..." msgstr "Und so weiter..." #: ../src/backend/filters/spatialAnalysis.cpp:3584 msgid "Insufficient points to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3607 msgid "Axial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3609 msgid " 1D Dist. Func." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3675 msgid "Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3717 msgid "Axial DF power" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3718 msgid "Theta - Azimuthal angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3719 msgid "Phi - Elevation angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3753 msgid "Binomial" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3890 #: ../src/backend/filters/spatialAnalysis.cpp:3958 msgid "Ions in Block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3892 #: ../src/backend/filters/spatialAnalysis.cpp:3960 #: ../src/backend/filters/spectrumPlot.cpp:79 msgid "Probability" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3962 msgid "Count (blocks)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4037 #: ../src/backend/filters/spatialAnalysis.cpp:4452 msgid "Build Numerator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4051 #: ../src/backend/filters/spatialAnalysis.cpp:4466 msgid "Build Denominator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4395 #: ../src/backend/filters/spatialAnalysis.cpp:4817 msgid "Relative Conc. (%)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:55 msgid "Point Cloud" msgstr "Punktwolke" #: ../src/backend/filters/filterCommon.cpp:56 msgid "Isosurface" msgstr "Isosurface" #: ../src/backend/filters/filterCommon.cpp:57 msgid "Axial slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:58 msgid "Slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:60 msgid "Volume Render" msgstr "" #: ../src/backend/filters/filterCommon.cpp:67 msgid "Linear" msgstr "" #: ../src/backend/filters/filterCommon.cpp:476 msgid "3D display method" msgstr "" #: ../src/backend/filters/filterCommon.cpp:484 msgid "Spot size" msgstr "" #: ../src/backend/filters/filterCommon.cpp:485 msgid "Size of the spots to use for display" msgstr "" #: ../src/backend/filters/filterCommon.cpp:489 #: ../src/backend/filters/filterCommon.cpp:533 #: ../src/backend/filters/filterCommon.cpp:587 #: ../src/backend/filters/filterCommon.cpp:641 #: ../src/backend/filters/filterCommon.cpp:692 msgid "Transparency" msgstr "Transparenz" #: ../src/backend/filters/filterCommon.cpp:490 msgid "How \"see through\" each point is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:494 #: ../src/backend/filters/filterCommon.cpp:592 #: ../src/backend/filters/filterCommon.cpp:646 #: ../src/backend/filters/filterCommon.cpp:706 msgid "Display colour bar in 3D view?" msgstr "" #: ../src/backend/filters/filterCommon.cpp:497 msgid "Auto Scale" msgstr "" #: ../src/backend/filters/filterCommon.cpp:498 #: ../src/backend/filters/filterCommon.cpp:596 #: ../src/backend/filters/filterCommon.cpp:650 #: ../src/backend/filters/filterCommon.cpp:710 msgid "Auto-compute min/max values (colour limits)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:507 #: ../src/backend/filters/filterCommon.cpp:605 #: ../src/backend/filters/filterCommon.cpp:659 #: ../src/backend/filters/filterCommon.cpp:719 msgid "Map end" msgstr "" #: ../src/backend/filters/filterCommon.cpp:517 msgid "Surf. param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:519 msgid "Isovalue" msgstr "Isovalue" #: ../src/backend/filters/filterCommon.cpp:520 msgid "Scalar value to show as isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:529 msgid "Colour of isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:534 #: ../src/backend/filters/filterCommon.cpp:588 #: ../src/backend/filters/filterCommon.cpp:642 #: ../src/backend/filters/filterCommon.cpp:693 msgid "How \"see through\" each facet is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:544 #: ../src/backend/filters/filterCommon.cpp:616 msgid "Slice param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:552 #: ../src/backend/filters/filterCommon.cpp:553 msgid "Slice Axis" msgstr "" #: ../src/backend/filters/filterCommon.cpp:554 msgid "Normal for the planar slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:559 msgid "Slice Coord" msgstr "" #: ../src/backend/filters/filterCommon.cpp:560 msgid "Fractional coordinate that slice plane passes through" msgstr "" #: ../src/backend/filters/filterCommon.cpp:569 msgid "Interp Mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:570 msgid "Interpolation mode for direction normal to slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:583 #: ../src/backend/filters/filterCommon.cpp:637 #: ../src/backend/filters/filterCommon.cpp:688 msgid "Colour Mode" msgstr "Farbe Modus" #: ../src/backend/filters/filterCommon.cpp:595 #: ../src/backend/filters/filterCommon.cpp:649 #: ../src/backend/filters/filterCommon.cpp:709 msgid "Auto Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:618 msgid "Slice Origin" msgstr "" #: ../src/backend/filters/filterCommon.cpp:619 msgid "Point on plane for slice, in 0->1 coordinates" msgstr "" #: ../src/backend/filters/filterCommon.cpp:622 msgid "Slice Normal" msgstr "" #: ../src/backend/filters/filterCommon.cpp:623 msgid "Normal vector for slice plane" msgstr "" #: ../src/backend/filters/filterCommon.cpp:664 msgid "Colour mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:674 msgid "Built-in map" msgstr "" #: ../src/backend/filters/filterCommon.cpp:675 msgid "" "True if you want to use a built-in colour map, false to specify your own" msgstr "" #: ../src/backend/filters/filterCommon.cpp:689 #: ../src/backend/filters/filterCommon.cpp:700 msgid "Colour scheme used to assign colours and transparency by value" msgstr "" #: ../src/backend/filters/filterCommon.cpp:733 msgid "Show Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:734 msgid "Display the voxel's bounding box" msgstr "" #: ../src/backend/filters/filterCommon.cpp:739 msgid "Bound Colour" msgstr "" #: ../src/backend/filters/filterCommon.cpp:740 msgid "Set Voxel's bounding box colour" msgstr "" #: ../src/backend/filters/profile.cpp:53 msgid "Cylinder (axial)" msgstr "" #: ../src/backend/filters/profile.cpp:54 msgid "Cylinder (radial)" msgstr "" #: ../src/backend/filters/profile.cpp:626 #: ../src/backend/filters/annotation.cpp:81 msgid "Distance" msgstr "Abstand" #: ../src/backend/filters/profile.cpp:635 msgid "Fraction" msgstr "Anteil" #: ../src/backend/filters/profile.cpp:641 msgid "Density (\\frac{\\#}{len^3})" msgstr "" #: ../src/backend/filters/profile.cpp:712 msgid "Freq. Profile" msgstr "Häufigkeitsprofil" #: ../src/backend/filters/profile.cpp:764 msgid "No data remained in profile - cannot display result" msgstr "" #: ../src/backend/filters/profile.cpp:1063 msgid "Total Density" msgstr "" #: ../src/backend/filters/profile.cpp:1064 msgid "Do not do per-species analysis, perform density computation only" msgstr "" #: ../src/backend/filters/profile.cpp:1078 msgid "Primitive type" msgstr "" #: ../src/backend/filters/profile.cpp:1079 msgid "Basic shape to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1087 msgid "Display the 3D composition profile interaction object" msgstr "" #: ../src/backend/filters/profile.cpp:1098 msgid "Position for centre of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1101 msgid "Vector between ends of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1104 msgid "Lock Axis Mag" msgstr "Achsen Vergr. sperren" #: ../src/backend/filters/profile.cpp:1105 msgid "Prevent length of cylinder changing during interaction" msgstr "" #: ../src/backend/filters/profile.cpp:1134 msgid "Fixed Bin Num" msgstr "Fix. Bin-Anz." #: ../src/backend/filters/profile.cpp:1135 msgid "" "If true, use a fixed number of bins for profile, otherwise use fixed step " "size" msgstr "" #: ../src/backend/filters/profile.cpp:1142 msgid "Number of bins to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1148 #: ../src/backend/filters/spectrumPlot.cpp:636 msgid "Bin Width" msgstr "Bin-Breite" #: ../src/backend/filters/profile.cpp:1149 msgid "Size of each bin in profile" msgstr "" #: ../src/backend/filters/profile.cpp:1154 msgid "Convert bin counts into relative frequencies in each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1157 msgid "Min. Events" msgstr "" #: ../src/backend/filters/profile.cpp:1158 msgid "Drop data that does not have this many events" msgstr "" #: ../src/backend/filters/profile.cpp:1163 msgid "Remap Ions" msgstr "" #: ../src/backend/filters/profile.cpp:1164 msgid "Break apart ions into components, using a remap file?" msgstr "" #: ../src/backend/filters/profile.cpp:1170 msgid "Remap file" msgstr "" #: ../src/backend/filters/profile.cpp:1171 msgid "\"Remap\" file that describes how the ions can be broken apart" msgstr "" #: ../src/backend/filters/profile.cpp:1176 msgid "Settings" msgstr "" #: ../src/backend/filters/profile.cpp:1190 #: ../src/backend/filters/spectrumPlot.cpp:693 msgid "Plot Type" msgstr "Plot Typ" #: ../src/backend/filters/profile.cpp:1191 msgid "Visual style for plot" msgstr "" #: ../src/backend/filters/profile.cpp:1198 msgid "Colour of plot" msgstr "" #: ../src/backend/filters/profile.cpp:1213 msgid "Err. Estimator" msgstr "Fehlerschätzer" #: ../src/backend/filters/profile.cpp:1216 msgid "Method of estimating error associated with each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1223 msgid "Avg. Window" msgstr "" #: ../src/backend/filters/profile.cpp:1226 msgid "Number of bins to include in moving average filter" msgstr "" #: ../src/backend/filters/profile.cpp:1231 msgid "Error analysis" msgstr "" #: ../src/backend/filters/transform.cpp:84 msgid "Translate" msgstr "Translate" #: ../src/backend/filters/transform.cpp:85 msgid "Scale (isotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:86 msgid "Scale (anisotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:87 msgid "Rotate" msgstr "Rotieren" #: ../src/backend/filters/transform.cpp:88 msgid "Value Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:89 msgid "Spatial Noise" msgstr "" #: ../src/backend/filters/transform.cpp:90 msgid "Translate Value" msgstr "Translate Wert" #: ../src/backend/filters/transform.cpp:91 msgid "Crop Value" msgstr "" #: ../src/backend/filters/transform.cpp:95 msgid "Specify" msgstr "Angeben" #: ../src/backend/filters/transform.cpp:96 msgid "Boundbox Centre" msgstr "Boundbox Zentrum" #: ../src/backend/filters/transform.cpp:97 msgid "Mass Centre" msgstr "Massen-Zentrum" #: ../src/backend/filters/transform.cpp:1093 msgid "Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:1117 msgid "Splice" msgstr "" #: ../src/backend/filters/transform.cpp:1159 msgid "Algorithm to use to transform point data" msgstr "" #: ../src/backend/filters/transform.cpp:1174 msgid "Origin mode" msgstr "" #: ../src/backend/filters/transform.cpp:1175 msgid "Select how transform origin is computed" msgstr "" #: ../src/backend/filters/transform.cpp:1180 msgid "Display an interactive object to set transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1182 msgid "Display a small marker to denote transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1184 msgid "Show marker" msgstr "Zeige Markierung" #: ../src/backend/filters/transform.cpp:1199 msgid "Translation" msgstr "" #: ../src/backend/filters/transform.cpp:1200 msgid "Translation vector for transform" msgstr "" #: ../src/backend/filters/transform.cpp:1209 msgid "Offset" msgstr "" #: ../src/backend/filters/transform.cpp:1210 msgid "Scalar to use to offset each point's associated value" msgstr "" #: ../src/backend/filters/transform.cpp:1223 #: ../src/backend/filters/transform.cpp:1241 msgid "Origin of scale transform" msgstr "" #: ../src/backend/filters/transform.cpp:1227 #: ../src/backend/filters/transform.cpp:1245 msgid "Scale Fact." msgstr "Skalierungsfaktor" #: ../src/backend/filters/transform.cpp:1228 #: ../src/backend/filters/transform.cpp:1246 msgid "Enlargement factor for scaling around origin" msgstr "" #: ../src/backend/filters/transform.cpp:1258 msgid "Origin of Rotation" msgstr "" #: ../src/backend/filters/transform.cpp:1262 msgid "Axis around which to revolve" msgstr "" #: ../src/backend/filters/transform.cpp:1265 msgid "Angle (Deg)" msgstr "Winkel (deg)" #: ../src/backend/filters/transform.cpp:1266 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)" msgstr "" #: ../src/backend/filters/transform.cpp:1281 msgid "Noise Type" msgstr "" #: ../src/backend/filters/transform.cpp:1282 msgid "Method to use to degrade point data" msgstr "" #: ../src/backend/filters/transform.cpp:1290 msgid "Noise Level" msgstr "" #: ../src/backend/filters/transform.cpp:1291 msgid "Amplitude of applied noise" msgstr "" #: ../src/backend/filters/transform.cpp:1296 msgid "Standard dev." msgstr "Standardabweichung" #: ../src/backend/filters/transform.cpp:1297 msgid "Gaussian 1-sigma spread distance" msgstr "" #: ../src/backend/filters/transform.cpp:1313 msgid "Min Value" msgstr "Min Wert" #: ../src/backend/filters/transform.cpp:1314 msgid "Minimum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1316 msgid "Max Value" msgstr "Max Wert" #: ../src/backend/filters/transform.cpp:1317 msgid "Maximum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1326 msgid "Transform Params" msgstr "Transformationsparameter" #: ../src/backend/filters/transform.cpp:1695 msgid "White" msgstr "" #: ../src/backend/filters/transform.cpp:1697 msgid "Gaussian" msgstr "" #: ../src/backend/filters/boundingBox.cpp:64 msgid "Box only" msgstr "" #: ../src/backend/filters/boundingBox.cpp:65 msgid "Tick" msgstr "" #: ../src/backend/filters/boundingBox.cpp:66 msgid "Dimension" msgstr "" #: ../src/backend/filters/boundingBox.cpp:569 msgid "If true, show box, otherwise hide box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:582 msgid "Style" msgstr "" #: ../src/backend/filters/boundingBox.cpp:583 msgid "Box display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:586 msgid "Display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:594 msgid "Fixed Tick Num" msgstr "" #: ../src/backend/filters/boundingBox.cpp:595 msgid "" "If true, evenly use specified number of ticks. Otherwise, use distance to " "determine tick count" msgstr "" #: ../src/backend/filters/boundingBox.cpp:600 msgid "Num X" msgstr "Num X" #: ../src/backend/filters/boundingBox.cpp:600 msgid "Tick count in X direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:603 msgid "Num Y" msgstr "Num Y" #: ../src/backend/filters/boundingBox.cpp:603 msgid "Tick count in Y direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:606 msgid "Num Z" msgstr "Num Z" #: ../src/backend/filters/boundingBox.cpp:606 msgid "Tick count in Z direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Spacing X" msgstr "X-Abstand" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Distance between ticks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Spacing Y" msgstr "Y-Abstand" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Distance between ticks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:617 msgid "Spacing Z" msgstr "Z-Abstand" #: ../src/backend/filters/boundingBox.cpp:617 msgid "Distance between ticks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Ticks X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Display tick marks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Ticks Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Display tick marks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Ticks Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Display tick marks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:633 msgid "Tick marks" msgstr "" #: ../src/backend/filters/boundingBox.cpp:639 msgid "Box Colour" msgstr "Box Farbe" #: ../src/backend/filters/boundingBox.cpp:640 msgid "Colour of the bounding box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:644 msgid "Line thickness" msgstr "Linienbreite" #: ../src/backend/filters/boundingBox.cpp:645 msgid "Thickness of the lines used to draw the box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:651 #: ../src/backend/filters/annotation.cpp:780 msgid "Font Size" msgstr "Schriftgröße" #: ../src/backend/filters/boundingBox.cpp:652 msgid "Relative size for text" msgstr "" #: ../src/backend/filters/boundingBox.cpp:655 msgid "Abs. Coords" msgstr "" #: ../src/backend/filters/boundingBox.cpp:656 msgid "Show labels using absolute co-ordinates" msgstr "" #: ../src/backend/filters/annotation.cpp:80 msgid "Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:86 msgid "Arrow" msgstr "Pfeil" #: ../src/backend/filters/annotation.cpp:87 msgid "Text" msgstr "Text" #: ../src/backend/filters/annotation.cpp:88 msgid "Arrow+Text" msgstr "Pfeil+Text" #: ../src/backend/filters/annotation.cpp:89 msgid "Angle" msgstr "Winkel" #: ../src/backend/filters/annotation.cpp:90 msgid "Ruler" msgstr "Lineal" #: ../src/backend/filters/annotation.cpp:192 ../src/backend/filter.cpp:55 msgid "Draw" msgstr "Zeichnen" #: ../src/backend/filters/annotation.cpp:595 msgid "Status" msgstr "" #: ../src/backend/filters/annotation.cpp:608 msgid "Type or style of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 msgid "Text of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:626 msgid "Position of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:629 #: ../src/backend/filters/annotation.cpp:670 #: ../src/backend/filters/annotation.cpp:702 msgid "Up dir" msgstr "Up dir" #: ../src/backend/filters/annotation.cpp:630 #: ../src/backend/filters/annotation.cpp:671 #: ../src/backend/filters/annotation.cpp:703 #: ../src/backend/filters/annotation.cpp:773 msgid "Vector for up direction of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:633 #: ../src/backend/filters/annotation.cpp:673 #: ../src/backend/filters/annotation.cpp:706 msgid "Across dir" msgstr "Across dir" #: ../src/backend/filters/annotation.cpp:634 #: ../src/backend/filters/annotation.cpp:674 #: ../src/backend/filters/annotation.cpp:707 #: ../src/backend/filters/annotation.cpp:777 msgid "Reading direction for annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:637 #: ../src/backend/filters/annotation.cpp:666 #: ../src/backend/filters/annotation.cpp:722 msgid "Text size" msgstr "Textgröße" #: ../src/backend/filters/annotation.cpp:638 #: ../src/backend/filters/annotation.cpp:667 #: ../src/backend/filters/annotation.cpp:723 #: ../src/backend/filters/annotation.cpp:781 msgid "Relative size of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:653 msgid "3D position for tail of arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:658 msgid "3D position to which arrow points" msgstr "" #: ../src/backend/filters/annotation.cpp:663 msgid "Options" msgstr "" #: ../src/backend/filters/annotation.cpp:677 msgid "Arrow radius" msgstr "" #: ../src/backend/filters/annotation.cpp:678 msgid "Size of the arrow head" msgstr "" #: ../src/backend/filters/annotation.cpp:687 msgid "Position A" msgstr "Position A" #: ../src/backend/filters/annotation.cpp:688 msgid "Location of first non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:692 msgid "Location of central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:695 msgid "Position B" msgstr "Position B" #: ../src/backend/filters/annotation.cpp:696 msgid "Location of second non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:710 msgid "Reflexive" msgstr "Reflexive" #: ../src/backend/filters/annotation.cpp:711 msgid "Measure interor (enabled) or exterior angle (disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:714 msgid "Show Angle" msgstr "Zeige Winkel" #: ../src/backend/filters/annotation.cpp:715 msgid "Display angle text (when enabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:741 msgid "Digit Format" msgstr "Zahlenformat" #: ../src/backend/filters/annotation.cpp:741 msgid "" "Format of angle text; # for numeral position, '.' for separator, eg ##.## " "gives 12.34" msgstr "" #: ../src/backend/filters/annotation.cpp:747 msgid "Sphere size" msgstr "Kugelgröße" #: ../src/backend/filters/annotation.cpp:748 #: ../src/backend/filters/annotation.cpp:804 msgid "Marker sphere size for manipulating tool" msgstr "" #: ../src/backend/filters/annotation.cpp:760 msgid "Display Style" msgstr "" #: ../src/backend/filters/annotation.cpp:761 msgid "Set the appearance of the ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:765 msgid "Ruler beginning location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:769 msgid "Ruler finish location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:772 msgid "Up direction" msgstr "" #: ../src/backend/filters/annotation.cpp:776 msgid "Across direction" msgstr "" #: ../src/backend/filters/annotation.cpp:784 msgid "Fixed Ticks" msgstr "Fixe Marker" #: ../src/backend/filters/annotation.cpp:785 msgid "" "Use fixed (enabled) number of text markers, or one every fixed distance " "(disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:790 msgid "Num Ticks" msgstr "Anzahl Marker" #: ../src/backend/filters/annotation.cpp:791 msgid "Number of tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:796 msgid "Tick Spacing" msgstr "Markerabstand" #: ../src/backend/filters/annotation.cpp:797 msgid "Distance between tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:803 msgid "Sphere Size" msgstr "Kugelgröße" #: ../src/backend/filters/annotation.cpp:814 msgid "Colour for ruler and ticks" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:210 msgid "Sampling" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:463 msgid "By Count" msgstr "Nach Anzahl" #: ../src/backend/filters/ionDownsample.cpp:464 msgid "Sample up to a fixed number of ions" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:469 msgid "Per Species" msgstr "Nach Spezies" #: ../src/backend/filters/ionDownsample.cpp:470 msgid "Use species specific (from ranging) sampling values" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:501 msgid "Sampling value for species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:508 #: ../src/backend/filters/ionInfo.cpp:371 #: ../src/backend/filters/ionInfo.cpp:429 msgid "Unranged" msgstr "Nicht Geranged" #: ../src/backend/filters/ionDownsample.cpp:517 #: ../src/backend/filters/ionDownsample.cpp:534 msgid "Sampling rates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:523 msgid "Output Count" msgstr "Ausgabe Anzahl" #: ../src/backend/filters/ionDownsample.cpp:524 msgid "Sample up to this value of points" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:529 msgid "Out Fraction" msgstr "Ausgabe Anteil" #: ../src/backend/filters/ionDownsample.cpp:530 msgid "Sample this fraction of points" msgstr "" #: ../src/backend/filters/ionInfo.cpp:42 msgid "Rectilinear" msgstr "Geradlinig" #: ../src/backend/filters/ionInfo.cpp:43 msgid "Convex hull" msgstr "Konvexe Hülle" #: ../src/backend/filters/ionInfo.cpp:226 msgid "No ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:248 msgid "Ion counts" msgstr "" #: ../src/backend/filters/ionInfo.cpp:267 msgid "" "Background fit failed - input data was considered ill formed (gauss-test)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:268 msgid "Following data has not been corrected" msgstr "" #: ../src/backend/filters/ionInfo.cpp:321 msgid "--Counts--" msgstr "- Anzahl -" #: ../src/backend/filters/ionInfo.cpp:333 msgid "Total ranged (without remap)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:335 msgid "Total Ranged\t" msgstr "Gesamt ranged" #: ../src/backend/filters/ionInfo.cpp:341 msgid "Total (incl. unranged,without remap)\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:343 msgid "Total (incl. unranged)\t" msgstr "Total (inkl. nicht geranged)" #: ../src/backend/filters/ionInfo.cpp:361 #: ../src/backend/filters/ionInfo.cpp:415 msgid "n/a" msgstr "" #: ../src/backend/filters/ionInfo.cpp:434 msgid "Unranged ions ignored" msgstr "" #: ../src/backend/filters/ionInfo.cpp:447 msgid "Number of points : " msgstr "Anzahl der Punkte: " #: ../src/backend/filters/ionInfo.cpp:459 #: ../src/backend/filters/ionInfo.cpp:661 msgid "Volume" msgstr "Volumen" #: ../src/backend/filters/ionInfo.cpp:480 msgid "Rectilinear Bounds : " msgstr "Geradlinige Grenzen:" #: ../src/backend/filters/ionInfo.cpp:485 msgid "Volume (len^3): " msgstr "Volumen (Läng.^3)" #: ../src/backend/filters/ionInfo.cpp:502 msgid "Convex Volume (len^3): " msgstr "Konvexes Volumen (Läng.^3)" #: ../src/backend/filters/ionInfo.cpp:505 msgid "Unable to compute volume" msgstr "Kann Volumen nicht berechnen" #: ../src/backend/filters/ionInfo.cpp:535 msgid "Ranged Density (pts/vol):" msgstr "Ranged Dichte (pts / vol):" #: ../src/backend/filters/ionInfo.cpp:540 msgid "Total Density (pts/vol):" msgstr "Gesamtdichte (pts / vol):" #: ../src/backend/filters/ionInfo.cpp:568 msgid "Compositions" msgstr "Zusammensetzungen" #: ../src/backend/filters/ionInfo.cpp:569 msgid "Display compositional data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:574 msgid "Remap ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:575 msgid "Break up ion counts/compositions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:581 msgid "Remap File" msgstr "" #: ../src/backend/filters/ionInfo.cpp:582 msgid "File describing how ions are to be broken up" msgstr "" #: ../src/backend/filters/ionInfo.cpp:590 msgid "Counts" msgstr "Anzahl" #: ../src/backend/filters/ionInfo.cpp:591 msgid "Display count data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:596 msgid "Ion data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:600 msgid "Normalise count data by totals" msgstr "" #: ../src/backend/filters/ionInfo.cpp:662 msgid "Compute volume for point data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:675 msgid "Select volume counting technique" msgstr "" #: ../src/backend/filters/ionInfo.cpp:678 msgid "Volume data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:63 msgid "Auto" msgstr "" #: ../src/backend/filters/dataLoad.cpp:64 msgid "Little" msgstr "" #: ../src/backend/filters/dataLoad.cpp:65 msgid "Big" msgstr "" #: ../src/backend/filters/dataLoad.cpp:68 msgid "POS Data" msgstr "Pos-Daten" #: ../src/backend/filters/dataLoad.cpp:69 msgid "Text Data" msgstr "Text-Daten" #: ../src/backend/filters/dataLoad.cpp:70 msgid "ATO Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:71 msgid "Tapsim Data" msgstr "Tapsim-Daten" #: ../src/backend/filters/dataLoad.cpp:72 msgid "3Dap/Posap OPS Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:232 msgid " does not exist" msgstr " existiert nicht" #: ../src/backend/filters/dataLoad.cpp:253 msgid "Reading File" msgstr "" #: ../src/backend/filters/dataLoad.cpp:268 #: ../src/backend/filters/dataLoad.cpp:281 #: ../src/backend/filters/dataLoad.cpp:325 #: ../src/backend/filters/dataLoad.cpp:336 #: ../src/backend/filters/dataLoad.cpp:396 #: ../src/backend/filters/dataLoad.cpp:418 #: ../src/backend/filters/dataLoad.cpp:436 msgid "Error loading file: " msgstr "Fehler beim Laden der Datei: " #: ../src/backend/filters/dataLoad.cpp:298 msgid "Sampling is active, loaded " msgstr "" #: ../src/backend/filters/dataLoad.cpp:299 msgid " available." msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 msgid "Loaded entire dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 #: ../src/backend/filters/dataLoad.cpp:406 #: ../src/backend/filters/dataLoad.cpp:428 #: ../src/backend/filters/dataLoad.cpp:446 msgid " points." msgstr "" #: ../src/backend/filters/dataLoad.cpp:351 msgid "" "Data file contained incorrect number of columns -- should be 3 or 4, was " msgstr "" #: ../src/backend/filters/dataLoad.cpp:405 #: ../src/backend/filters/dataLoad.cpp:427 #: ../src/backend/filters/dataLoad.cpp:445 msgid "Loaded dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:477 msgid "" "Warning:One or more bounds of the loaded data approaches the limits of " "numerical stability for the internal data type(magnitude too large). " "Consider rescaling data before loading" msgstr "" "Warnung: Eine oder mehrere Grenzen der geladenen Daten erreichen das Limit " "der numerischen Stabilität des internen Datentyps (Größenordnung zu groß). " "Erwägen Sie die Daten vor dem Laden zu skalieren. " #: ../src/backend/filters/dataLoad.cpp:500 msgid "File from which to load data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:502 msgid "" "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato, *.ops)|*.xml;*.pos;*.txt;*." "csv;*.ato;*.ops|All Files|*" msgstr "" #: ../src/backend/filters/dataLoad.cpp:511 msgid "File type" msgstr "Dateityp" #: ../src/backend/filters/dataLoad.cpp:512 msgid "Type of fil to be loaded" msgstr "" #: ../src/backend/filters/dataLoad.cpp:524 msgid "Entries per point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:525 msgid "Number of decimal values in file per 3D point (normally 4)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:536 msgid "Relative offset of each entry in file for point's X position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:540 msgid "Relative offset of each entry in file for point's Y position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:543 msgid "Z" msgstr "Z" #: ../src/backend/filters/dataLoad.cpp:544 msgid "Relative offset of each entry in file for point's Z position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:548 msgid "" "Relative offset of each entry in file to use for scalar value of 3D point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:564 msgid "File \"Endianness\"" msgstr "" #: ../src/backend/filters/dataLoad.cpp:565 msgid "On-disk data storage format. If file won't load, just try each" msgstr "" #: ../src/backend/filters/dataLoad.cpp:574 msgid "Recon. Width" msgstr "" #: ../src/backend/filters/dataLoad.cpp:575 msgid "" "Width of box onto which to place reconstructed detector hits (similar to tip " "radius)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:579 msgid "Ion Volume" msgstr "Ionen Volumen" #: ../src/backend/filters/dataLoad.cpp:580 msgid "Effective volume of an ion (incl. free packing volume)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:584 msgid "Det. Efficiency" msgstr "" #: ../src/backend/filters/dataLoad.cpp:585 msgid "" "Effiency of system (ions evaporated towards detector/ions detected by " "detector)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:596 msgid "Value Label" msgstr "" #: ../src/backend/filters/dataLoad.cpp:597 msgid "Name for the scalar value associated with each point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:600 msgid "Format params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Enabled" msgstr "Aktiviert" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Load this file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "Sample data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "" "Perform random selection on file contents,instead of loading entire file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:619 msgid "Load Limit (MB)" msgstr "Ladelimit (MB)" #: ../src/backend/filters/dataLoad.cpp:620 msgid "Limit for size of data to load" msgstr "" #: ../src/backend/filters/dataLoad.cpp:626 msgid "Monitor" msgstr "" #: ../src/backend/filters/dataLoad.cpp:627 msgid "" "Watch file timestamp to track changes to file contents from other programs" msgstr "" #: ../src/backend/filters/dataLoad.cpp:631 msgid "Load params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:638 msgid "Default colour" msgstr "" #: ../src/backend/filters/dataLoad.cpp:639 msgid "Default colour for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/dataLoad.cpp:643 msgid "Draw Size" msgstr "Draw Size" #: ../src/backend/filters/dataLoad.cpp:644 msgid "Default size for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:77 msgid "Maximum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:78 msgid "Max in limit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:171 msgid "Extrema" msgstr "Extrema" #: ../src/backend/filters/spectrumPlot.cpp:220 msgid "count" msgstr "Anzahl" #: ../src/backend/filters/spectrumPlot.cpp:311 msgid "Mixed data" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:441 msgid "Background fit failed" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:446 msgid "" "Insufficient bins (data points) to perform fit. Try decreasing bin size, or " "expanding range" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:449 msgid "" "Insufficient counts to perform fit. Try expanding range, or increasing " "number of ions" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:452 msgid "Insufficient data to compute Anderson-Darling statistic" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:455 msgid "" "Background noise does not appear to be gaussian-like, ensure range contains " "no peaks" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:472 msgid "Background:" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:529 #: ../src/backend/filters/spectrumPlot.cpp:531 msgid "Relative " msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:534 #: ../src/backend/filters/spectrumPlot.cpp:536 msgid "Probability Density" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:637 msgid "Step size for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:640 msgid "Auto Min/Max" msgstr "Auto Min/max" #: ../src/backend/filters/spectrumPlot.cpp:641 msgid "Automatically compute spectrum upper and lower bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:647 msgid "Starting position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:651 msgid "Ending position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:658 msgid "Logarithmic" msgstr "Logarithmisch" #: ../src/backend/filters/spectrumPlot.cpp:659 msgid "Convert the plot to logarithmic mode" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:669 msgid "Normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:670 msgid "Rescale the plot height, to make inter-spectrum comparisons easier" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:676 msgid "Lower Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:677 msgid "Do not use data below this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:680 msgid "Upper Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:681 msgid "Do not use data above this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:694 msgid "Visual style of plot" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:698 msgid "Colour of plotted spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:713 msgid "Model" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:714 msgid "Background fitting method to use" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:725 msgid "Fit Start" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:726 msgid "Start mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:729 msgid "Fit End" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:730 msgid "End mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:740 msgid "Corr. Only" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:741 msgid "Only show corrected spectrum, not fit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:746 msgid "Background Mode" msgstr "" #: ../src/backend/filters/rangeFile.cpp:121 #: ../src/backend/filters/rangeFile.h:96 msgid "Ranging" msgstr "Ranging" #: ../src/backend/filters/rangeFile.cpp:562 msgid "File to use for range data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:567 msgid "Drop unranged" msgstr "Nicht gerangete ausschalten" #: ../src/backend/filters/rangeFile.cpp:568 msgid "Remove unranged points when generating output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:576 msgid "Legend" msgstr "" #: ../src/backend/filters/rangeFile.cpp:577 msgid "Display colour legend for enabled ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:580 msgid "View" msgstr "" #: ../src/backend/filters/rangeFile.cpp:596 msgid "All Ions" msgstr "Alle Ionen" #: ../src/backend/filters/rangeFile.cpp:597 msgid "Enable/disable all ions at once" msgstr "" #: ../src/backend/filters/rangeFile.cpp:605 msgid "Species" msgstr "" #: ../src/backend/filters/rangeFile.cpp:612 msgid "IonID " msgstr "IonID " #: ../src/backend/filters/rangeFile.cpp:613 msgid "Enable/disable specified ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:625 msgid "Active Ion " msgstr "Actives Ion " #: ../src/backend/filters/rangeFile.cpp:627 msgid "If true, ion is used in output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:638 msgid "Colour " msgstr "Farbe" #: ../src/backend/filters/rangeFile.cpp:642 msgid "Colour used to represent ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:666 msgid "All Ranges" msgstr "Alle Range" #: ../src/backend/filters/rangeFile.cpp:667 msgid "Enable/disable all ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:682 msgid "Active Rng " msgstr "Activer Rng " #: ../src/backend/filters/rangeFile.cpp:685 msgid "" "Enable/disable specified range (ion must also be enabled to activiate range)" msgstr "" #: ../src/backend/filters/rangeFile.cpp:692 msgid "Ion " msgstr "Ion " #: ../src/backend/filters/rangeFile.cpp:695 msgid "Name of ion associate to this range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:706 msgid "Start rng " msgstr "Start rng " #: ../src/backend/filters/rangeFile.cpp:709 msgid "Start value for range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:716 msgid "End rng " msgstr "End rng " #: ../src/backend/filters/rangeFile.cpp:719 msgid "Stopping value for range`" msgstr "" #: ../src/backend/state.cpp:170 msgid "" "This file is a \"state\" file for the 3Depict program, and stores " "information about a particular analysis session. This file should be a valid " "\"XML\" file" msgstr "" "Diese Datei ist ein \"Status\" Datei für das Programm 3Depict. Sie speichert " "Informationen über die jeweiligen Analysesitzung. Dies sollte ein gültige " "\"XML\" Datei sein." #: ../src/backend/state.cpp:346 msgid "Failed to allocate parser" msgstr "Kann Parser nicht zuordnen" #: ../src/backend/state.cpp:381 msgid "" "Unable to retrieve root node in input state file... Is this really a non-" "empty XML file?" msgstr "" #: ../src/backend/state.cpp:388 msgid "Base state node missing. Is this really a state XML file??" msgstr "" #: ../src/backend/state.cpp:417 msgid "State was created by a newer version of this program.. " msgstr "Status wurde von einer neueren Version dieses Programmes erstellt.. " #: ../src/backend/state.cpp:418 msgid "file reading will continue, but may fail." msgstr "Datei wird weiter eingelesen kann aber unter Umständen fehlschlagen." #: ../src/backend/state.cpp:428 msgid "" "Warning, unparseable version number in state file. File reading will " "continue, but may fail" msgstr "" "Warnung: Nicht lesbare Versionsnummer in Statusdatei. Datei wird weiter " "eingelesen kann aber unter Umständen fehlschlagen." #: ../src/backend/state.cpp:437 msgid "Unable to find the \"writer\" node" msgstr "Kann \"writer\" node nicht finden" #: ../src/backend/state.cpp:447 msgid "Unable to find the \"backcolour\" node." msgstr "Kann \"backcolour\" node nicht finden." #: ../src/backend/state.cpp:455 msgid "\"backcolour\" node missing \"r\" value." msgstr "\"backcolour\" node fehlt \"r\" Wert." #: ../src/backend/state.cpp:460 msgid "Unable to interpret \"backColour\" node's \"r\" value." msgstr "Kann \"backColour\" node's \"r\" Wert nicht interpretieren." #: ../src/backend/state.cpp:468 msgid "\"backcolour\" node missing \"g\" value." msgstr "\"backcolour\" node fehlt \"g\" Wert." #: ../src/backend/state.cpp:474 msgid "Unable to interpret \"backColour\" node's \"g\" value." msgstr "Kann \"backColour\" node's \"g\" Wert nicht interpretieren." #: ../src/backend/state.cpp:482 msgid "\"backcolour\" node missing \"b\" value." msgstr "\"backcolour\" node fehlt \"b\" Wert." #: ../src/backend/state.cpp:488 msgid "Unable to interpret \"backColour\" node's \"b\" value." msgstr "Kann \"backColour\" node's \"b\" Wert nicht interpretieren." #: ../src/backend/state.cpp:495 msgid "\"backcolour\"s rgb values must be in range [0,1]" msgstr "\"backcolour\"s rgb Wert muss im Bereich [0,1] liegen" #: ../src/backend/state.cpp:523 msgid "Unable to find or interpret \"showaxis\" node" msgstr "Kann \"showaxis\" node nicht interpretieren" #: ../src/backend/state.cpp:567 msgid "Unable to locate \"filtertree\" node." msgstr "Kann \"filtertree\" node nicht finden." #: ../src/backend/state.cpp:583 msgid "Cameras section missing \"active\" node." msgstr "Cameras section fehlt \"active\" node." #: ../src/backend/state.cpp:591 msgid "Unable to find property \"value\" for \"cameras->active\" node." msgstr "Kann \"Eigenschaftswert\" für \"Kamera->aktiv\" Node nicht finden." #: ../src/backend/state.cpp:597 msgid "Unable to interpret property \"value\" for \"cameras->active\" node." msgstr "" "Kann \"Eigenschaftswert\" für \"Kamera->aktiv\" Node nicht interpretieren." #: ../src/backend/state.cpp:617 msgid "Failed to interpret camera state for camera : " msgstr "" #: ../src/backend/state.cpp:625 msgid "Unable to interpret the camera type for camera : " msgstr "" #: ../src/backend/state.cpp:681 msgid "Unable to locate stash name for stash " msgstr "Kann den Stashnamen für Stash nicht finden" #: ../src/backend/state.cpp:690 msgid "Empty stash name for stash " msgstr "Leerer Stashname für Stash" #: ../src/backend/state.cpp:699 msgid "No filter tree for stash:" msgstr "" #: ../src/backend/state.cpp:705 msgid "For stash " msgstr "Für Stash " #: ../src/backend/state.cpp:737 msgid "Unrecognised effect :" msgstr "Nichterkannter Effekt :" #: ../src/backend/state.cpp:747 msgid "Duplicate effect found" msgstr "Doppelter Effekt gefunden" #: ../src/backend/state.cpp:747 msgid " cannot use." msgstr "kann nicht verwenden." #: ../src/backend/state.cpp:757 msgid "Error reading effect : " msgstr "Fehler beim Lesen:" #: ../src/backend/state.cpp:977 msgid "-merge" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:225 msgid "" "Parent filter has no output, but filter requires input -- there is no point " "in placing a child filter here." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:226 msgid "Leaf-only filter with child" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:236 msgid "" "Parent filters' output will be blocked by child, without use. Parent results " "will be dropped." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:237 #: ../src/backend/filtertreeAnalyse.cpp:251 msgid "Bad parent->child pair" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:250 msgid "" "First filter does not output anything useable by child filter. Child filter " "not useful." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:330 msgid "Spatial results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:331 msgid "" "Filters and settings selected that could alter reported results that depend " "upon density. Check to see if spatial sampling may be happening in the " "filter tree - this warning is provisional only." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:399 msgid "Filter needs parent \"" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:400 msgid "" "\" but does not have one. Filter may not function correctly until this " "parent is given." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:401 msgid "Filter missing needed parent" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:432 msgid "Bad range filter settings" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:433 msgid "" "Rangefile set to drop unranged data, however a child filter requires it." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:529 msgid "Filter cannot generate data, but has no input - it is at the tree base." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:530 msgid "Non data-generating filter at root" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:632 msgid "Composition results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:633 msgid "" "Filters and settings selected that could bias reported composition. Check to " "see if species biasing may occcur in the filter tree - this warning is " "provisional only." msgstr "" #: ../src/backend/APT/APTFileIO.cpp:44 ../src/backend/APT/APTFileIO.cpp:79 #: ../src/backend/APT/APTFileIO.cpp:103 ../src/backend/APT/APTFileIO.cpp:123 msgid "Error opening file" msgstr "Fehler beim Öffnen der Datei" #: ../src/backend/APT/APTFileIO.cpp:45 msgid "Only found header, no data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:46 msgid "Unable to reopen file after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:47 msgid "Error whilst reading file contents" msgstr "Fehler beim Lesen des Dateiinhaltes" #: ../src/backend/APT/APTFileIO.cpp:48 ../src/backend/APT/APTFileIO.cpp:49 msgid "Unexpected file format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:50 msgid "Insufficient memory to continue" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:54 msgid "Memory allocation failure on POS load" msgstr "Speicherzuweisungsfeher beim Laden der pos-Datei" #: ../src/backend/APT/APTFileIO.cpp:55 msgid "Error opening pos file" msgstr "Fehler beim Öffnen der pos-Datei" #: ../src/backend/APT/APTFileIO.cpp:56 msgid "Pos file empty" msgstr "Pos-Datei ist leer" #: ../src/backend/APT/APTFileIO.cpp:57 msgid "Pos file size appears to have non-integer number of entries" msgstr "" "Pos-Dateigröße scheint eine nicht ganzzahlige Anzahl an Einträgen zu haben" #: ../src/backend/APT/APTFileIO.cpp:58 msgid "Error reading from pos file (after open)" msgstr "Fehler beim Lesen aus pos-Datei (nach dem öffnen)" #: ../src/backend/APT/APTFileIO.cpp:59 msgid "Error - Found NaN in pos file" msgstr "Fehler - Fand NaN in pos-Datei" #: ../src/backend/APT/APTFileIO.cpp:60 msgid "Error - Found Inf in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:61 msgid "Pos load aborted by interrupt." msgstr "Pos laden durch Interrupt abgebrochen." #: ../src/backend/APT/APTFileIO.cpp:80 msgid "No numerical data found" msgstr "Keine numerischen Daten gefunden" #: ../src/backend/APT/APTFileIO.cpp:81 msgid "Error re-opening file, after first scan" msgstr "Fehler beim nochmaligen Öffnen der Datei nach dem ersten Scan" #: ../src/backend/APT/APTFileIO.cpp:82 msgid "Unable to read file contents after open" msgstr "Kann den Dateiinhalt nach dem Öffnen nich lesen" #: ../src/backend/APT/APTFileIO.cpp:83 msgid "Error interpreting field in file" msgstr "Fehler beim Interpretieren eine Feldes in der Datei" #: ../src/backend/APT/APTFileIO.cpp:84 msgid "Incorrect number of fields in file" msgstr "Die Datei enthält eine falsche Anzahl von Feldern" #: ../src/backend/APT/APTFileIO.cpp:85 ../src/backend/APT/APTFileIO.cpp:107 msgid "Unable to allocate memory to store data" msgstr "Kann Speicher nicht zuordnen" #: ../src/backend/APT/APTFileIO.cpp:104 msgid "File is empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:105 msgid "Filesize does not match expected format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:106 msgid "File version number not <4, as expected" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:108 msgid "Unable to detect endian-ness in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:122 msgid "Error interpreting file contents" msgstr "Fehler beim Lesen des Dateiinhaltes" #: ../src/backend/APT/APTFileIO.cpp:124 msgid "Aborted opening file" msgstr "Fehler beim Öffnen der Datei" #: ../src/backend/APT/APTRanges.cpp:48 msgid "Error opening file, check name and permissions." msgstr "Fehler beim Öffnen der Datei, überprüfe Namen und Berechtigungen." #: ../src/backend/APT/APTRanges.cpp:49 msgid "" "Error interpreting range file header, expecting ion count and range count, " "respectively." msgstr "" "Fehler beim Rangedatei interpretieren, erwarte Ionenanzahl bzw. Rangeanzahl." #: ../src/backend/APT/APTRanges.cpp:50 msgid "" "Range file appears to be empty, check file is a proper range file and is not " "empty." msgstr "" "Rangedatei scheint leer zu sein. Prüfe ob die Datei wirklich ein Rangedatei " "und nicht leer ist." #: ../src/backend/APT/APTRanges.cpp:51 msgid "Error reading the long name for ion." msgstr "Fehler beim Lesen des langen Namens für Ion." #: ../src/backend/APT/APTRanges.cpp:52 msgid "Error reading the short name for ion." msgstr "Fehler beim Lesen des kurzen Namens für Ion." #: ../src/backend/APT/APTRanges.cpp:53 msgid "" "Error reading colour data in the file, expecting 3 decimal values, space " "separated." msgstr "" "Fehler beim Lesen der Farbinformationen in der Datei. Erwarte 3, durch " "Leerzeichen getrennte, Dezimalwerte." #: ../src/backend/APT/APTRanges.cpp:54 msgid "" "Tried skipping to table separator line (line with dashes), but did not find " "it." msgstr "" #: ../src/backend/APT/APTRanges.cpp:55 msgid "" "Number of ions in the table header did not match the number specified at the " "start of the file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:56 msgid "" "Unexpected failure whilst trying to skip over range lead-in data (bit before " "range start value)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:57 msgid "" "Range table had an incorrect number of entries, should be 2 or 3 + number of " "ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:58 msgid "Unable to read range start and end values" msgstr "Kann Anfangs und Endwert des Range nicht lesen" #: ../src/backend/APT/APTRanges.cpp:59 msgid "Unable to read range table entry" msgstr "Kann Rangetabelleneintrag nich lesen" #: ../src/backend/APT/APTRanges.cpp:60 msgid "" "Error reading file, unexpected format, are you sure it is a proper range " "file?" msgstr "" "Fehler beim Lesen der Datei: Unerwartetes Format, sind Sie sicher, dass dies " "eine korrekte Rangedatei ist?" #: ../src/backend/APT/APTRanges.cpp:61 msgid "" "Too many ranges appeared to have range entries with no usable data (eg, all " "blank)" msgstr "Zu viele Ranges scheinen ungültige Einträge zu haben (z.B. alle leer)" #: ../src/backend/APT/APTRanges.cpp:62 msgid "" "Range file appears to contain malformed data, check things like start and " "ends of m/c are not equal or flipped." msgstr "" #: ../src/backend/APT/APTRanges.cpp:63 msgid "Range file appears to be inconsistent (eg, overlapping ranges)" msgstr "Rangedatei schein inkonsistent zu sein (z.B. überlappende Ranges)" #: ../src/backend/APT/APTRanges.cpp:64 msgid "No ion name mapping found for multiple ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:65 msgid "Polyatomic extension range matches multiple masses in first section" msgstr "" #: ../src/backend/APT/APTRanges.cpp:66 msgid "Range file is exceedingly large. Refusing to open" msgstr "" #: ../src/backend/APT/APTRanges.cpp:68 msgid "Unable to read range table header (aka table separator)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:69 msgid "Unable to read [Ions] contents, should be of form A=B" msgstr "" #: ../src/backend/APT/APTRanges.cpp:70 msgid "Unable to parse number of ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:71 msgid "Number of ions seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:72 msgid "Too many ions in ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:73 msgid "Found ranges block before ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:74 msgid "Number of ranges seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:75 msgid "Unable to read number of ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:76 msgid "Range line was too short, needs 4 entries per line, minimum" msgstr "" #: ../src/backend/APT/APTRanges.cpp:77 msgid "Range line missing required \":\" separator" msgstr "" #: ../src/backend/APT/APTRanges.cpp:79 msgid "Range colour incorrect size, should be 6 bytes" msgstr "" #: ../src/backend/APT/APTRanges.cpp:80 msgid "Range specified as named ion, but ion not found in [Ions] block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:81 msgid "Range had unreadable start value" msgstr "" #: ../src/backend/APT/APTRanges.cpp:82 msgid "Range had unreadable endvalue" msgstr "" #: ../src/backend/APT/APTRanges.cpp:83 msgid "Range name was empty" msgstr "" #: ../src/backend/APT/APTRanges.cpp:84 msgid "Range block had unparsable line, should start with number or range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:85 msgid "Ion block missing" msgstr "" #: ../src/backend/APT/APTRanges.cpp:86 msgid "No ranges found" msgstr "" #: ../src/backend/APT/APTRanges.cpp:87 msgid "Unable to identify the number of basic ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:88 msgid "" "Number of ranges specfied in range block, did not match number of ranges read" msgstr "" #: ../src/backend/APT/APTRanges.cpp:89 msgid "Range block contained line that did not match A=xxx format" msgstr "" #: ../src/backend/APT/APTRanges.cpp:90 msgid "Range had unreadable ion multiplicity" msgstr "" #: ../src/backend/APT/APTRanges.cpp:91 msgid "Unable to read volume from range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:1459 msgid "" "Range headings do not match order of the ions listed in the name " "specifications. The name specification ordering will be used when reading " "the range table, as the range heading section is declared as a comment in " "the file-format specifications, and is not to be intepreted by this program. " "Check range-species associations actually match what you expect." msgstr "" #: ../src/backend/filter.cpp:54 msgid "2D Plot" msgstr "" #: ../src/backend/filter.cpp:56 msgid "Range" msgstr "Range" #: ../src/backend/filter.cpp:57 msgid "Voxel" msgstr "Voxel" #: ../src/backend/filters/transform.h:71 msgid "Ion. Transform" msgstr "Ion. Transformieren" #: ../src/backend/filters/ionColour.h:66 msgid "Spectral Colour" msgstr "Spectral Farbe" #: ../src/backend/filters/boundingBox.h:76 msgid "Bound box" msgstr "Begrenzungs-Box" #: ../src/backend/filters/ionDownsample.h:84 msgid "Ion Sampler" msgstr "" #: ../src/backend/filters/profile.h:131 msgid "Comp. Prof." msgstr "Konz. Prof." #: ../src/backend/filters/ionInfo.h:117 msgid "Ion info" msgstr "Ioneninfo" #: ../src/backend/filters/dataLoad.h:148 msgid "Pos Data" msgstr "POS-Daten" #: ../src/backend/filters/externalProgram.h:69 msgid "Ext. Program" msgstr "Ext. Programm" #: ../data/startup-tips.txt:5 msgid "" "You can reset the main view by tapping the space bar. Hold down modifier " "keys like shift,ctrl to change the axis. Double tap to switch which axis to " "look the other way (+ve or -ve direction)" msgstr "" #: ../data/startup-tips.txt:6 msgid "" "You can delete filters from the tree by selecting them, then tapping delete?" msgstr "" #: ../data/startup-tips.txt:7 msgid "" "Multiple languages are supported? You can translate the program into your " "own language at https://www.transifex.com/projects/p/3depict/" msgstr "" #: ../data/startup-tips.txt:8 msgid "" "Package files can be easily shared to allow others to view your analysis, " "using the File->Export->Package menu item. This will automatically import " "all referenced files (eg pos/rng files) into a single shareable folder" msgstr "" #: ../data/startup-tips.txt:9 msgid "" "You can export plots to SVG \"Vector\" format, for easier editing - edit " "your plots in inkscape!" msgstr "" #: ../data/startup-tips.txt:10 msgid "You can access the manual from the Help menu" msgstr "" #: ../data/startup-tips.txt:11 msgid "You can change filter defaults using the Edit->Preferences menu item" msgstr "" #: ../data/startup-tips.txt:12 msgid "" "You can overlay multiple plots at once, by selecting more than on plot at a " "time (e.g. using Ctrl)" msgstr "" #: ../data/startup-tips.txt:13 msgid "" "Calculations are much faster (more than linear speedup) when working with " "smaller datasets - try sampling, or clipping out a small region to work " "faster, then remove the sampling when you are ready" msgstr "" #: ../data/startup-tips.txt:14 msgid "" "You can abort most calculations either by pressing Escape (OSX/Linux), or by " "using the Abort button (Windows)" msgstr "" #: ../data/startup-tips.txt:15 msgid "" "That anyone can contribute to improving this program, even without knowing " "about computer programming? Reporting bugs helps us to prioritise our work, " "and directs us to fix real problems for all users" msgstr "" #: ../data/startup-tips.txt:16 msgid "" "You can load more than one file at a time, then either operate on them " "separately, or together" msgstr "" #: ../data/startup-tips.txt:17 msgid "" "You can have more than one range file for different parts of your dataset" msgstr "" #: ../data/startup-tips.txt:18 msgid "" "Cameras can be saved and retrieved whenever you like, using the camera tab" msgstr "" #: ../data/startup-tips.txt:19 msgid "" "Subsections of the filter tree can be saved to the \"Stashed filters\" drop-" "down" msgstr "" #: ../data/startup-tips.txt:20 msgid "" "The console tab along the bottom often shows useful messages from filters. " "When new messages appear, a small symbol is shown on the tab" msgstr "" #: ../data/startup-tips.txt:21 msgid "" "The raw data used for any plot can be accessed from the \"Raw\" tab on the " "bottom panel" msgstr "" #: ../data/startup-tips.txt:22 msgid "" "You can ask questions about the program, or using it on your data via our " "forums (https://sourceforge.net/p/threedepict/discussion/general/)" msgstr "" #: ../data/startup-tips.txt:23 msgid "" "By creating a camera, you can switch between orthographic (parallel) and " "perspective views" msgstr "" #: ../data/startup-tips.txt:24 msgid "" "You can open multiple files at once, and get a side-by-side view by " "translating (shifting) one of the datasets to one side" msgstr "" #: ../data/startup-tips.txt:25 msgid "" "From version 0.0.20, vector values in filter properties (e.g. \"(1,0,0)\") " "can be specified using ISO 31-11 spherical coordinates using the following " "notation , with angles in degrees" msgstr "" #: ../data/startup-tips.txt:26 msgid "" "You can change the behavior of filter dragging by holding Ctrl (mac: cmd) or " "Shift whilst dragging? This switches between move, copy and \"splice" msgstr "" #: ../data/startup-tips.txt:27 msgid "" "We like to know where we are being helpful? Please consider writing the " "program and version number in any work you might publish - whether in print " "or online. Alternatively, link to our website, or write to us to let us know " "we helped!" msgstr "" #: ../data/startup-tips.txt:28 msgid "" "You can merge files by placing two \"Pos Data\" filters in series, then " "saving the result?" msgstr "" #: ../data/startup-tips.txt:29 msgid "" "When using the camera 3D cropping tool, you can hold Shift to only move the " "centre node in one axis (up/down or left/right).)" msgstr "" #~ msgid "Load...\tCtrl+L" #~ msgstr "Laden..\tCtrl+L" #~ msgid "Save...\tCtrl+S" #~ msgstr "&Speichern\tCtrl+S" #~ msgid "" #~ "3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*." #~ "pos|XML State File (*.xml)|*.xml|All Files (*)|*" #~ msgstr "" #~ "3Depictdateien (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS Datei (*.pos)|*." #~ "pos|XML Status Datei (*.xml)|*.xml|All Files (*)|*" #~ msgid "POS Data (*.pos)|*.pos|All Files (*)|*" #~ msgstr "POS-Daten (*.pos)|*.pos|All Files (*)|*" #~ msgid "Bin width y" #~ msgstr "Bin-Breite y" #~ msgid "Bin width z" #~ msgstr "Bin-Breite Z" #~ msgid "Num bins x" #~ msgstr "Anzahl Bins x" #~ msgid "Num bins y" #~ msgstr "Anzahl Bins y" #~ msgid "Num bins z" #~ msgstr "Anzahl Bins z" #~ msgid "Mass-to-Charge (amu/e)" #~ msgstr "Masse-zu-Ladung (amu/e)" #~ msgid "Origin " #~ msgstr "Ursprung " 3Depict-0.0.22/translations/makeTranslations0000755000175000017500000000555013047732054020452 0ustar pcuserpcuser#!/bin/bash #I wrote this because autoconf is confusing as bloody hell. #I just need to copy some files into a place where gettext will expect them #I Shouldn't need to create some mega ultimate makefile.am for that, then #follow some random poorly documented hierarchy and naming system. (Looking at you gettextize!) #Usage: makeTranslation [install|update] #extract program name from sources -- Now with added case sensitivity hack! PROGRAM_NAME=`cat ../src/common/constants.cpp | grep PROGRAM_NAME | awk -F= '{print $2}' | sed 's/;//g' | sed 's/\"//g' | sed 's/;//' | sed 's/^\s*//'` #Where do we want to install the translations? (if using this script). TRANSLATION_INSTALL="/usr/share/locale/" #Space separated list of maintained locales MAINTAINED_LOCALES="de_DE fr_FR es_ES" echo "Program name is $PROGRAM_NAME" if [ x"$PROGRAM_NAME" == x"" ] ; then echo "Unable to extract program name. Aborting" exit 1; fi if [ $# -eq 0 ] ; then echo "Creating binary translation files.." #Create binary versions of gettext translation files for i in *.po do #Quick check to see if we have any "" elements in the files if [ x"`grep ' tmp.pot #replace the default headers from msgmerge THISYEAR=`date | awk '{print $6}'` sed -i "s/YEAR THE PACKAGE.*/$THISYEAR/" tmp.pot sed -i "s/SOME DESCRIPTIVE TITLE.*/Translation file for locale $i/" tmp.pot sed -i 's/PACKAGE package/3Depict package/' tmp.pot #overwrite po mv tmp.pot ${PROGRAM_NAME}_${i}.po done echo "Replacing base template" msgmerge -N ${PROGRAM_NAME}_base.pot update.pot > tmp.pot mv tmp.pot ${PROGRAM_NAME}_base.pot rm update.pot fi fi 3Depict-0.0.22/translations/3Depict_es_ES.po0000644000175000017500000047366713414412454020135 0ustar pcuserpcuser# Translation file # Copyright (C) 2017 # This file is distributed under the same license as the 3Depict package. # # Translators: msgid "" msgstr "" "Project-Id-Version: 3Depict\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-06 14:48+0000\n" "PO-Revision-Date: 2017-09-19 12:00+0000\n" "Last-Translator: mycae\n" "Language-Team: Spanish (Spain) (http://www.transifex.com/mycae/3depict/" "language/es_ES/)\n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/gl/cameras.cpp:585 msgid "Lock" msgstr "Bloquear" #: ../src/gl/cameras.cpp:592 ../src/backend/filters/ionClip.cpp:516 #: ../src/backend/filters/ionClip.cpp:530 #: ../src/backend/filters/ionClip.cpp:546 #: ../src/backend/filters/ionClip.cpp:567 #: ../src/backend/filters/profile.cpp:1097 #: ../src/backend/filters/profile.cpp:1118 #: ../src/backend/filters/transform.cpp:1222 #: ../src/backend/filters/transform.cpp:1240 #: ../src/backend/filters/transform.cpp:1257 #: ../src/backend/filters/annotation.cpp:625 #: ../src/backend/filters/annotation.cpp:691 msgid "Origin" msgstr "Origen" #: ../src/gl/cameras.cpp:600 ../src/backend/filters/spatialAnalysis.cpp:936 msgid "Target" msgstr "Destino" #: ../src/gl/cameras.cpp:606 msgid "Up Dir." msgstr "Arriba de Dir." #: ../src/gl/cameras.cpp:614 ../src/gl/cameras.cpp:717 msgid "Perspective" msgstr "Perspectiva" #: ../src/gl/cameras.cpp:616 ../src/gl/cameras.cpp:719 #: ../src/gui/mainFrame.cpp:5762 msgid "Orthogonal" msgstr "Ortogonal" #: ../src/gl/cameras.cpp:620 msgid "Projection" msgstr "Projection" #: ../src/gl/cameras.cpp:629 msgid "Field of View (deg)" msgstr "Campo de Vista (deg)" #: ../src/gl/cameras.cpp:635 msgid "View size" msgstr "Medida de vista" #: ../src/wx/wxcomponents.cpp:189 msgid "Save Data..." msgstr "Salva Dato..." #: ../src/wx/wxcomponents.cpp:190 msgid "Text File (*.txt)|*.txt|All Files (*)|*" msgstr "Archivo de texto (*.txt)|*.txt|Todos los Archivos (*)|*" #: ../src/wx/wxcomponents.cpp:202 msgid "Error saving file. Check output dir is writable." msgstr "Archivo de ahorro del error. Producción de control dir es writable." #: ../src/wx/wxcomponents.cpp:202 ../src/gui/dialogs/ExportRngDialog.cpp:187 #: ../src/gui/mainFrame.cpp:1555 ../src/gui/mainFrame.cpp:1680 #: ../src/gui/mainFrame.cpp:1729 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2410 ../src/gui/mainFrame.cpp:2483 #: ../src/gui/mainFrame.cpp:2586 ../src/gui/mainFrame.cpp:2845 msgid "Save error" msgstr "Error al guardar" #: ../src/common/basics.cpp:183 msgid "in the future?" msgstr "En el futuro?" #: ../src/common/basics.cpp:234 msgid "a decade ago" msgstr "Hace una década" #: ../src/common/basics.cpp:235 msgid "a year ago" msgstr "Hace un año" #: ../src/common/basics.cpp:236 msgid "a month ago" msgstr "Hace un mes" #: ../src/common/basics.cpp:237 msgid "a week ago" msgstr "Hace una semana" #: ../src/common/basics.cpp:238 msgid "a day ago" msgstr "Hace un día" #: ../src/common/basics.cpp:239 msgid "an hour ago" msgstr "hace 1 hora" #: ../src/common/basics.cpp:240 msgid "45 minutes ago" msgstr "Hace 45 minutos" #: ../src/common/basics.cpp:241 msgid "30 minutes ago" msgstr "Hace 30 minutos" #: ../src/common/basics.cpp:242 msgid "20 minutes ago" msgstr "Hace 20 minutos" #: ../src/common/basics.cpp:243 msgid "15 minutes ago" msgstr "Hace 15 minutos" #: ../src/common/basics.cpp:244 msgid "10 minutes ago" msgstr "Hace 10 minutos" #: ../src/common/basics.cpp:245 msgid "5 minutes ago" msgstr "Hace 5 minutos" #: ../src/common/basics.cpp:246 msgid "a minute ago" msgstr "hace un minuto" #: ../src/common/basics.cpp:247 msgid "30 seconds ago" msgstr "Hace 30 segundos" #: ../src/common/basics.cpp:248 msgid "10 seconds ago" msgstr "Hace 10 segundos" #: ../src/common/basics.cpp:249 msgid "a second ago" msgstr "Un segundo hace" #: ../src/common/basics.cpp:254 msgid "a few decades ago" msgstr "Hace unas cuantas décadas" #: ../src/common/basics.cpp:255 msgid "a few years ago" msgstr "Hace unos cuantos años" #: ../src/common/basics.cpp:256 msgid "a few months ago" msgstr "Hace unos cuantos meses" #: ../src/common/basics.cpp:257 msgid "a few weeks ago" msgstr "Hace unas cuantas semanas" #: ../src/common/basics.cpp:258 msgid "a few days ago" msgstr "Hace unos cuantos días" #: ../src/common/basics.cpp:259 msgid "a few hours ago" msgstr "Hace unas cuantas horas" #: ../src/common/basics.cpp:262 msgid "tens of minutes ago" msgstr "" #: ../src/common/basics.cpp:266 msgid "a few minutes ago" msgstr "Hace unos cuantos minutos" #: ../src/common/basics.cpp:269 msgid "a few seconds ago" msgstr "hace unos segundos" #: ../src/common/basics.cpp:296 msgid "moments ago" msgstr "Momentos hace" #: ../src/common/colourmap.cpp:307 msgid "Jet" msgstr "Jet" #: ../src/common/colourmap.cpp:308 msgid "Hot" msgstr "Caliente" #: ../src/common/colourmap.cpp:309 msgid "Cold" msgstr "Frío" #: ../src/common/colourmap.cpp:310 msgid "Grey" msgstr "Gris" #: ../src/common/colourmap.cpp:311 msgid "Cyclic" msgstr "Cíclico" #: ../src/common/colourmap.cpp:312 msgid "General" msgstr "General" #: ../src/common/colourmap.cpp:313 #: ../src/gui/dialogs/transferFuncDialog.cpp:765 msgid "Blue" msgstr "Azul" #: ../src/common/colourmap.cpp:314 msgid "Pseudo-Random" msgstr "Pseudo-Aleatorio" #: ../src/common/colourmap.cpp:315 msgid "Inferno" msgstr "" #: ../src/common/colourmap.cpp:316 msgid "Viridis" msgstr "" #: ../src/common/constants.cpp:21 msgid "" "Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG " "File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*." "rrng)|*.rrng;*.RRNG|All Files (*)|*" msgstr "" #: ../src/gui/glPane.cpp:642 msgid "Use shift/ctrl-space or double tap to alter reset axis" msgstr "Cambio de uso/ctrl-grifo espacial o doble para alterar reset eje" #: ../src/gui/glPane.cpp:939 msgid "Image progress" msgstr "Progreso de imagen" #: ../src/gui/glPane.cpp:940 msgid "Rendering tiles..." msgstr "Rendering Enladrilla..." #: ../src/gui/glPane.cpp:1133 msgid "Animation progress" msgstr "Progreso de animación" #: ../src/gui/glPane.cpp:1134 msgid "Rendering sequence..." msgstr "Rendering Secuencia..." #: ../src/gui/glPane.cpp:1172 msgid "Saving Image " msgstr "Imagen de ahorro " #: ../src/gui/glPane.cpp:1172 ../src/gui/mainFrame.cpp:4829 #: ../src/gui/mainFrame.cpp:4833 ../src/gui/mainFrame.cpp:4846 #: ../src/backend/filters/dataLoad.cpp:299 msgid " of " msgstr " de " #: ../src/gui/dialogs/ExportRngDialog.cpp:40 msgid "Range Sources" msgstr "Fuentes de gama" #: ../src/gui/dialogs/ExportRngDialog.cpp:42 msgid "Details" msgstr "Detalles" #: ../src/gui/dialogs/ExportRngDialog.cpp:53 msgid "Source Filter" msgstr "Filtro de fuentes" #: ../src/gui/dialogs/ExportRngDialog.cpp:54 #: ../src/backend/filters/spatialAnalysis.cpp:1059 #: ../src/backend/filters/rangeFile.cpp:649 msgid "Ions" msgstr "Iones" #: ../src/gui/dialogs/ExportRngDialog.cpp:55 #: ../src/gui/dialogs/rangeEditDialog.cpp:1585 #: ../src/backend/filters/voxelise.cpp:781 #: ../src/backend/filters/rangeFile.cpp:725 msgid "Ranges" msgstr "Rangos" #: ../src/gui/dialogs/ExportRngDialog.cpp:88 msgid "Param" msgstr "Param" #: ../src/gui/dialogs/ExportRngDialog.cpp:89 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352 #: ../src/gui/dialogs/animateFilterDialog.cpp:1199 #: ../src/backend/filters/dataLoad.cpp:547 msgid "Value" msgstr "Valor" #: ../src/gui/dialogs/ExportRngDialog.cpp:90 msgid "Value2" msgstr "Valor2" #: ../src/gui/dialogs/ExportRngDialog.cpp:97 msgid "Ion Name" msgstr "Nombre de ión" #: ../src/gui/dialogs/ExportRngDialog.cpp:98 msgid "Num Ranges" msgstr "Num Gamas" #: ../src/gui/dialogs/ExportRngDialog.cpp:116 #: ../src/gui/dialogs/rangeEditDialog.cpp:694 ../src/backend/filter.cpp:52 msgid "Ion" msgstr "Ión" #: ../src/gui/dialogs/ExportRngDialog.cpp:117 msgid "Range Start" msgstr "Inicio de gama" #: ../src/gui/dialogs/ExportRngDialog.cpp:118 msgid "Range end" msgstr "Fin de Rango" #: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2521 msgid "Save pos..." msgstr "Salva pos..." #: ../src/gui/dialogs/ExportRngDialog.cpp:152 msgid "" "Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV " "(*.env)|*.env|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:184 ../src/gui/mainFrame.cpp:1555 #: ../src/gui/mainFrame.cpp:1730 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2411 ../src/gui/mainFrame.cpp:2587 #: ../src/gui/mainFrame.cpp:2846 msgid "Unable to save. Check output destination can be written to." msgstr "" "Incapaz de salvar. Destino de producción del control puede ser escrito a." #: ../src/gui/dialogs/ExportRngDialog.cpp:253 msgid "Export Range" msgstr "Exportar rango" #: ../src/gui/dialogs/ExportRngDialog.cpp:258 msgid "List of rangefiles in filter tree" msgstr "Lista de rangefiles en árbol de filtro" #: ../src/gui/dialogs/ExportRngDialog.cpp:260 msgid "Detailed view of selected range" msgstr "Vista detallada de gama seleccionada" #: ../src/gui/dialogs/rangeEditDialog.cpp:221 msgid "Show Overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:246 msgid "e.g. H2O" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:559 #: ../src/gui/dialogs/rangeEditDialog.cpp:693 ../src/gui/mainFrame.cpp:6428 #: ../src/backend/filter.cpp:53 msgid "Plot" msgstr "Dibujar" #: ../src/gui/dialogs/rangeEditDialog.cpp:560 msgid "Short Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:561 msgid "Long Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:562 #: ../src/gui/dialogs/transferFuncDialog.cpp:767 #: ../src/backend/filters/filterCommon.cpp:528 #: ../src/backend/filters/filterCommon.cpp:531 #: ../src/backend/filters/profile.cpp:1197 #: ../src/backend/filters/annotation.cpp:813 #: ../src/backend/filters/spectrumPlot.cpp:697 msgid "Colour" msgstr "Colour" #: ../src/gui/dialogs/rangeEditDialog.cpp:695 #: ../src/backend/filters/annotation.cpp:652 #: ../src/backend/filters/annotation.cpp:764 msgid "Start" msgstr "Inicio" #: ../src/gui/dialogs/rangeEditDialog.cpp:696 #: ../src/backend/filters/annotation.cpp:657 #: ../src/backend/filters/annotation.cpp:768 msgid "End" msgstr "Final" #: ../src/gui/dialogs/rangeEditDialog.cpp:1258 msgid "Range or ion?" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1259 msgid "Select type to add" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1540 msgid "Range Editor" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1544 msgid "Enable or disable all overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1545 msgid "Entered overlays, use delete to remove" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1546 msgid "Available plots for ranging" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1547 msgid "Enter species to display as overlay, e.g. SiO2" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1548 msgid "Editable ranges" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1549 msgid "Editable ions" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1584 #: ../src/gui/dialogs/animateFilterDialog.cpp:177 msgid "Plots" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1586 msgid "Overlay" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:39 msgid "Remove &All" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:123 msgid "Restore state?" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:133 msgid "Multiple autosave states were found; would you like to restore one?" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:37 ../src/backend/filter.cpp:618 #: ../src/backend/filter.cpp:621 msgid "Error" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:39 msgid "Warning" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:42 #: ../src/gui/dialogs/filterErrorDialog.cpp:52 msgid "Filter Errors" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:759 #: ../src/backend/filters/spectrumPlot.cpp:650 msgid "Max" msgstr "Max" #: ../src/gui/dialogs/transferFuncDialog.cpp:760 #: ../src/backend/filters/spectrumPlot.cpp:646 msgid "Min" msgstr "Mínimo" #: ../src/gui/dialogs/transferFuncDialog.cpp:762 msgid "Traces" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:763 msgid "Red" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:764 msgid "Green" msgstr "Verde" #: ../src/gui/dialogs/transferFuncDialog.cpp:766 #: ../src/backend/filters/ionColour.cpp:314 msgid "Opacity" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:770 #: ../src/backend/filters/filterCommon.cpp:699 msgid "Transfer Function" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:823 msgid "Transfer Function Editor" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:826 msgid "Colour chosen by moving selected node up-down" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:828 msgid "Drag nodes to move, click to add nodes" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:830 msgid "Final colour scale" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:835 msgid "Adjust node group's colour" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:836 msgid "Remove the selected node" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:847 msgid "Node Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:49 msgid "Stashes" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:52 msgid "Stashed Tree" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:54 msgid "Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:60 msgid "Stash Name" msgstr "Stash Nombre" #: ../src/gui/dialogs/StashDialog.cpp:61 msgid "Filter Count" msgstr "El Filtro Cuenta" #: ../src/gui/dialogs/StashDialog.cpp:94 msgid "Stashed Trees" msgstr "Stashed árboles" #: ../src/gui/dialogs/StashDialog.cpp:97 msgid "Erase stashed item" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:98 msgid "Filter view for current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:99 msgid "Settings for selected filter in current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:100 msgid "Available stashes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:45 msgid "Start Frame: " msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:47 msgid "From File" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:50 msgid "From Table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350 #: ../src/gui/dialogs/animateFilterDialog.cpp:197 msgid "Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240 msgid "Select text file..." msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241 msgid "Text files (*.txt)|*.txt;|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342 msgid "String Keyframes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344 msgid "Frame at which to start string sequence" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345 msgid "Frame offset for data start" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346 msgid "File to use as string data source, one value per row" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347 msgid "Select file to use as data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348 msgid "Use table below for data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355 msgid "Remove selected strings from table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356 msgid "Abort value selection and return to previous window" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357 msgid "Accept data values" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:60 msgid "Keyframe Data" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:61 msgid "Transition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64 msgid "Step" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:65 msgid "Ramp" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:68 #: ../src/gui/dialogs/animateFilterDialog.cpp:1181 msgid "Start Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:70 #: ../src/gui/dialogs/animateFilterDialog.cpp:1182 msgid "End Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:73 msgid "Initial Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:74 msgid "startColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:75 msgid "Final Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:76 msgid "endColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:250 msgid "Key Frame : Colour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:252 msgid "Colour at the start of the transtition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:253 msgid "Colour at end of transition" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:92 msgid "Cameca/Ametek RRNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:93 msgid "Oak-Ridge RNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:94 msgid "Cameca/Ametek ENV" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:156 msgid "Key frames" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:157 msgid "Output Data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:158 msgid "Filters and properties" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:164 msgid "Dir : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:167 msgid "Output only when refresh required" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:169 msgid "Data Types:" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:170 msgid "3D Images" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:171 msgid "File Prefix: " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:173 msgid "Size : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:175 msgid "..." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:176 msgid "Point data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:178 msgid "Voxel data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:179 msgid "Range files" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:180 msgid "Format" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 msgid "transition frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 ../src/gui/mainFrame.cpp:1782 msgid "Frame count" msgstr "El Marco cuenta" #: ../src/gui/dialogs/animateFilterDialog.cpp:771 msgid "Key frame : Colour" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:826 msgid "File existed, but was unable to read or interpret file contents." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:827 msgid "String load failed" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:848 msgid "Keyframe : decimal" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:857 msgid "Keyframe : integer" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:866 msgid "Keyframe : 3D Point" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:994 msgid "Select or create new folder" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1174 msgid "Export Animation" msgstr "Animación de exportación" #: ../src/gui/dialogs/animateFilterDialog.cpp:1175 msgid "Select filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1176 msgid "Select property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1178 #: ../src/gui/dialogs/animateFilterDialog.cpp:1197 msgid "Filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1179 #: ../src/gui/dialogs/animateFilterDialog.cpp:1198 msgid "Property" msgstr "Propiedad" #: ../src/gui/dialogs/animateFilterDialog.cpp:1180 #: ../src/backend/filters/spatialAnalysis.cpp:1103 #: ../src/backend/filters/transform.cpp:1158 #: ../src/backend/filters/annotation.cpp:607 #: ../src/backend/filters/annotation.cpp:611 #: ../src/backend/filters/ionDownsample.cpp:475 msgid "Mode" msgstr "Modo" #: ../src/gui/dialogs/animateFilterDialog.cpp:1183 msgid "Keyframe table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1184 msgid "Remove the selected keyframe from the table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1185 msgid "Enter where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1186 msgid "Browse to directory where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1188 msgid "" "Title for files, result will be saved as #-name.png, where # is image number." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1189 msgid "Target resolution (image size)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1190 msgid "Select frame for property display" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1191 msgid "Enter frame number to change frame (eg 1/20)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1192 msgid "Save point data (POS files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1193 msgid "Save plots (as text files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1194 msgid "Save voxel data (raw files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1195 msgid "Save range files in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1200 msgid "Animation parameters for current frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1201 msgid "Abort animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1202 msgid "Run Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1273 msgid "Filter view" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1274 msgid "Frame view" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:45 msgid "Width :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:47 msgid "Height :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:50 #: ../src/gui/dialogs/prefDialog.cpp:85 msgid "Reset" msgstr "Restablecer" #: ../src/gui/dialogs/resolutionDialog.cpp:336 msgid "Resolution Selection" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:63 msgid "Export:" msgstr "Exportar:" #: ../src/gui/dialogs/ExportPos.cpp:64 #: ../src/backend/filters/boundingBox.cpp:568 msgid "Visible" msgstr "Visibilidad" #: ../src/gui/dialogs/ExportPos.cpp:65 msgid "Selected Data" msgstr "Dato seleccionado" #: ../src/gui/dialogs/ExportPos.cpp:67 msgid "Available Data" msgstr "Dato disponible" #: ../src/gui/dialogs/ExportPos.cpp:73 msgid "Selection" msgstr "Selección" #: ../src/gui/dialogs/ExportPos.cpp:98 ../src/gui/dialogs/ExportPos.cpp:101 msgid "Index" msgstr "Índice" #: ../src/gui/dialogs/ExportPos.cpp:99 ../src/gui/dialogs/ExportPos.cpp:102 #: ../src/backend/filters/spatialAnalysis.cpp:2653 #: ../src/backend/filters/spatialAnalysis.cpp:2749 #: ../src/backend/filters/spatialAnalysis.cpp:2812 #: ../src/backend/filters/spatialAnalysis.cpp:3608 #: ../src/backend/filters/spatialAnalysis.cpp:3894 #: ../src/backend/filters/profile.cpp:644 #: ../src/backend/filters/spectrumPlot.cpp:65 msgid "Count" msgstr "Contador" #: ../src/gui/dialogs/ExportPos.cpp:444 msgid "Export Pos Data" msgstr "Exportación Pos Dato" #: ../src/gui/dialogs/ExportPos.cpp:447 msgid "Tree of filters, select leaves to show ion data." msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:449 msgid "Add all data from all filters" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:450 msgid "Add all data from currently selected filter" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:451 msgid "Add selected data from currently selected filter" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:73 msgid "Panel Display" msgstr "Panel de visualización" #: ../src/gui/dialogs/prefDialog.cpp:75 msgid "Online Updates" msgstr "Online Actualiza" #: ../src/gui/dialogs/prefDialog.cpp:77 ../src/gui/dialogs/prefDialog.cpp:577 msgid "Startup" msgstr "Arranque" #: ../src/gui/dialogs/prefDialog.cpp:78 msgid "Camera Speed" msgstr "Velocidad de cámara" #: ../src/gui/dialogs/prefDialog.cpp:79 msgid "Available Filters" msgstr "Filtros disponibles" #: ../src/gui/dialogs/prefDialog.cpp:84 msgid "Reset All" msgstr "Restablecer todo" #: ../src/gui/dialogs/prefDialog.cpp:87 msgid "Show all panels" msgstr "Muestra todos los tableros" #: ../src/gui/dialogs/prefDialog.cpp:88 msgid "Remember last" msgstr "Recuerda último" #: ../src/gui/dialogs/prefDialog.cpp:89 msgid "Show Selected" msgstr "El Espectáculo Seleccionó" #: ../src/gui/dialogs/prefDialog.cpp:92 msgid "Control Pane" msgstr "Control Pane" #: ../src/gui/dialogs/prefDialog.cpp:93 msgid "Raw Data Panel" msgstr "Tablero de Dato crudo" #: ../src/gui/dialogs/prefDialog.cpp:94 ../src/gui/mainFrame.cpp:744 msgid "Plot List" msgstr "Lista de parcela" #: ../src/gui/dialogs/prefDialog.cpp:96 msgid "Periodically notify about available updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:98 msgid "Prefer orthographic at startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:99 msgid "Move Rate" msgstr "índice de movimiento" #: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104 msgid "(slow)" msgstr "(Lento)" #: ../src/gui/dialogs/prefDialog.cpp:102 ../src/gui/dialogs/prefDialog.cpp:106 msgid "(fast)" msgstr "(Ayuno)" #: ../src/gui/dialogs/prefDialog.cpp:103 msgid "Zoom Rate" msgstr "Zoom índice" #: ../src/gui/dialogs/prefDialog.cpp:433 msgid "Show all panels when starting program" msgstr "Muestra todos los tableros cuándo empezando programa" #: ../src/gui/dialogs/prefDialog.cpp:436 msgid "Show panels visible at last shutdown when starting program" msgstr "" "Tableros de espectáculo visibles por fin shutdown cuándo empezando programa" #: ../src/gui/dialogs/prefDialog.cpp:443 msgid "Show selected panels when starting program" msgstr "Espectáculo tableros seleccionados cuándo empezando programa" #: ../src/gui/dialogs/prefDialog.cpp:492 msgid "Preferences" msgstr "Preferencias" #: ../src/gui/dialogs/prefDialog.cpp:494 msgid "Set the method of panel layout when starting the program" msgstr "Pone el método de tablero layout cuándo empezando el programa" #: ../src/gui/dialogs/prefDialog.cpp:497 msgid "" "Lets the program check the internet to see if updates to the program version " "are available, then notifies you about updates now and again." msgstr "" "Deja el programa comprueba el internet para ver si actualiza a la versión de " "programa es disponible, entonces te notifica aproximadamente actualiza ahora " "y otra vez." #: ../src/gui/dialogs/prefDialog.cpp:499 msgid "" "By default, use an orthographic camera at startup. State files will override " "this preference." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:500 msgid "Camera translation, orbit and swivel rates. " msgstr "Traducción de cámara, órbita y swivel índices. " #: ../src/gui/dialogs/prefDialog.cpp:501 msgid "Camera zooming rate." msgstr "Cámara zooming índice." #: ../src/gui/dialogs/prefDialog.cpp:503 msgid "Reset the filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:504 msgid "Reset all filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:576 msgid "Filt. Default" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:578 msgid "Camera" msgstr "Cámara" #: ../src/gui/mainFrame.cpp:123 msgid "New camera name..." msgstr "Nombre de cámara nuevo..." #: ../src/gui/mainFrame.cpp:124 msgid "New stash name..." msgstr "" #: ../src/gui/mainFrame.cpp:129 msgid "New Filter..." msgstr "" #: ../src/gui/mainFrame.cpp:146 ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 #: ../src/backend/filters/annotation.h:102 msgid "Annotation" msgstr "Anotacion" #: ../src/gui/mainFrame.cpp:147 msgid "Bounding Box" msgstr "Cuadro limitador" #: ../src/gui/mainFrame.cpp:148 ../src/backend/filters/ionClip.cpp:581 #: ../src/backend/filters/ionClip.h:66 msgid "Clipping" msgstr "Recorte" #: ../src/gui/mainFrame.cpp:149 ../src/backend/filters/clusterAnalysis.h:151 msgid "Cluster Analysis" msgstr "Análisis de grupo" #: ../src/gui/mainFrame.cpp:150 msgid "Compos. Profiles" msgstr "Compos. Perfiles" #: ../src/gui/mainFrame.cpp:151 msgid "Downsampling" msgstr "Downsampling" #: ../src/gui/mainFrame.cpp:152 msgid "Extern. Prog." msgstr "Extern. Prog." #: ../src/gui/mainFrame.cpp:153 msgid "Ion Colour" msgstr "Color de ión" #: ../src/gui/mainFrame.cpp:154 msgid "Ion Info" msgstr "Ión Info" #: ../src/gui/mainFrame.cpp:155 msgid "Ion Transform" msgstr "El Ión Transforma" #: ../src/gui/mainFrame.cpp:156 ../src/backend/filters/spectrumPlot.h:78 msgid "Spectrum" msgstr "Espectro" #: ../src/gui/mainFrame.cpp:157 msgid "Range File" msgstr "Archivo de gama" #: ../src/gui/mainFrame.cpp:158 ../src/backend/filters/spatialAnalysis.h:228 msgid "Spat. Analysis" msgstr "Spat. Análisis" #: ../src/gui/mainFrame.cpp:159 ../src/backend/filters/voxelise.h:102 msgid "Voxelisation" msgstr "Voxelisation" #: ../src/gui/mainFrame.cpp:160 ../src/backend/filters/voxelLoad.h:86 msgid "Voxel Load" msgstr "" #: ../src/gui/mainFrame.cpp:411 msgid "XML State File (*.xml)" msgstr "" #: ../src/gui/mainFrame.cpp:412 msgid "POS File (*.pos)" msgstr "" #: ../src/gui/mainFrame.cpp:413 msgid "LAWATAP ATO File (*.ato)" msgstr "" #: ../src/gui/mainFrame.cpp:414 msgid "Text File (*.txt, *.csv)" msgstr "" #: ../src/gui/mainFrame.cpp:415 msgid "3Dap Files (*.ops)" msgstr "" #: ../src/gui/mainFrame.cpp:416 msgid "VTK rectangular grids (*.vtk)" msgstr "" #: ../src/gui/mainFrame.cpp:417 msgid "Raw Binary files (*.raw)" msgstr "" #: ../src/gui/mainFrame.cpp:418 msgid "All Files (*)" msgstr "" #: ../src/gui/mainFrame.cpp:496 msgid "OpenGL Failed" msgstr "OpenGL Falló" #: ../src/gui/mainFrame.cpp:497 ../src/gui/mainFrame.cpp:499 msgid "" "Unable to initialise the openGL (3D) panel. Program cannot start. Please " "check your video drivers." msgstr "" "Incapaz a initialise el openGL (3D) tablero. El Programa no puede empezar. " "Complacer comprobar vuestros conductores de vídeo." #: ../src/gui/mainFrame.cpp:522 msgid "&Open...\tCtrl+O" msgstr "&Abierto...\tCtrl+O" #: ../src/gui/mainFrame.cpp:522 msgid "Open state file" msgstr "Archivo estatal abierto" #: ../src/gui/mainFrame.cpp:523 msgid "&Merge...\tCtrl+Shift+O" msgstr "&Fusiona...\tCtrl+Cambio+O" #: ../src/gui/mainFrame.cpp:523 msgid "Merge other file" msgstr "Fusionar otro archivo" #: ../src/gui/mainFrame.cpp:527 msgid "&Recent" msgstr "&Reciente" #: ../src/gui/mainFrame.cpp:528 msgid "&Save\tCtrl+S" msgstr "&Salva\tCtrl+S" #: ../src/gui/mainFrame.cpp:528 msgid "Save state to file" msgstr "Salva estatal de archivar" #: ../src/gui/mainFrame.cpp:530 msgid "Save &As...\tCtrl+Shift+S" msgstr "Salva &Tan...\tCtrl+Cambio+S" #: ../src/gui/mainFrame.cpp:530 msgid "Save current state to new file" msgstr "Salva estado actual a archivo nuevo" #: ../src/gui/mainFrame.cpp:533 msgid "&Plot...\tCtrl+P" msgstr "&Parcela...\tCtrl+P" #: ../src/gui/mainFrame.cpp:533 msgid "Export Current Plot" msgstr "Exportación Parcela Actual" #: ../src/gui/mainFrame.cpp:534 msgid "&Image...\tCtrl+I" msgstr "&Imagen...\tCtrl+Yo" #: ../src/gui/mainFrame.cpp:534 msgid "Export Current 3D View" msgstr "Corriente de exportación 3D Vista" #: ../src/gui/mainFrame.cpp:535 msgid "Ion&s...\tCtrl+N" msgstr "Ión&s...\tCtrl+N" #: ../src/gui/mainFrame.cpp:535 msgid "Export Ion Data" msgstr "Dato de Ión de la exportación" #: ../src/gui/mainFrame.cpp:536 msgid "Ran&ges...\tCtrl+G" msgstr "Corrió&ges...\tCtrl+G" #: ../src/gui/mainFrame.cpp:536 msgid "Export Range Data" msgstr "Dato de Gama de la exportación" #: ../src/gui/mainFrame.cpp:537 msgid "&Voxels...\tCtrl+Shift+V" msgstr "" #: ../src/gui/mainFrame.cpp:537 msgid "Export Voxel Data" msgstr "" #: ../src/gui/mainFrame.cpp:539 msgid "&Animate Filters...\tCtrl+T" msgstr "" #: ../src/gui/mainFrame.cpp:539 msgid "Export Animated Filter" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Ani&mate Camera...\tCtrl+M" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Export Animated Camera" msgstr "" #: ../src/gui/mainFrame.cpp:541 msgid "Pac&kage...\tCtrl+K" msgstr "Pac&kage...\tCtrl+K" #: ../src/gui/mainFrame.cpp:541 msgid "Export analysis package" msgstr "Paquete de análisis de la exportación" #: ../src/gui/mainFrame.cpp:543 msgid "&Export" msgstr "&Exportar" #: ../src/gui/mainFrame.cpp:546 msgid "&Quit\tCtrl+Q" msgstr "&Quit\tCtrl+Q" #: ../src/gui/mainFrame.cpp:546 ../src/gui/mainFrame.cpp:548 msgid "Exit Program" msgstr "Programa de salida" #: ../src/gui/mainFrame.cpp:548 msgid "E&xit" msgstr "Sa&lir" #: ../src/gui/mainFrame.cpp:550 msgid "&File" msgstr "&Archivo" #: ../src/gui/mainFrame.cpp:554 msgid "&Background Colour...\tCtrl+B" msgstr "&Color de fondo...\tCtrl+B" #: ../src/gui/mainFrame.cpp:554 msgid "Change background colour" msgstr "Color de fondo del cambio" #: ../src/gui/mainFrame.cpp:558 msgid "&Control Pane\tF2" msgstr "" #: ../src/gui/mainFrame.cpp:558 ../src/gui/mainFrame.cpp:561 msgid "Toggle left control pane" msgstr "Toggle Dejó control pane" #: ../src/gui/mainFrame.cpp:561 msgid "&Control Pane\tAlt+C" msgstr "&Control Pane\tAlt+C" #: ../src/gui/mainFrame.cpp:567 msgid "&Raw Data Pane\tF3" msgstr "" #: ../src/gui/mainFrame.cpp:567 ../src/gui/mainFrame.cpp:570 msgid "Toggle raw data pane (bottom)" msgstr "Toggle Dato crudo pane (fondo)" #: ../src/gui/mainFrame.cpp:570 msgid "&Raw Data Pane\tAlt+R" msgstr "&Dato crudo Pane\tAlt+R" #: ../src/gui/mainFrame.cpp:574 msgid "&Plot List\tF4" msgstr "" #: ../src/gui/mainFrame.cpp:574 ../src/gui/mainFrame.cpp:576 msgid "Toggle plot list" msgstr "Toggle Lista de parcela" #: ../src/gui/mainFrame.cpp:576 msgid "&Plot List\tAlt+P" msgstr "&Lista de parcela\tAlt+P" #: ../src/gui/mainFrame.cpp:582 msgid "&Legend\tCtrl+L" msgstr "&Leyenda\tCtrl+L" #: ../src/gui/mainFrame.cpp:582 msgid "Toggle Legend display" msgstr "Toggle Exhibición de leyenda" #: ../src/gui/mainFrame.cpp:584 msgid "P&lot..." msgstr "P&Parcela..." #: ../src/gui/mainFrame.cpp:585 msgid "&Axis\tCtrl+Shift+I" msgstr "&Eje\tCtrl+Cambio+yo" #: ../src/gui/mainFrame.cpp:585 msgid "Toggle World Axis display" msgstr "Toggle Exhibición de Eje mundial" #: ../src/gui/mainFrame.cpp:590 msgid "&Fullscreen mode\tF11" msgstr "&Fullscreen F\tde modo11" #: ../src/gui/mainFrame.cpp:590 ../src/gui/mainFrame.cpp:592 msgid "Next fullscreen mode: with toolbars" msgstr "Próximo fullscreen modo: con toolbars" #: ../src/gui/mainFrame.cpp:592 msgid "&Fullscreen mode\tCtrl+Shift+F" msgstr "&Fullscreen Modo\tCtrl+F+de Cambio" #: ../src/gui/mainFrame.cpp:597 msgid "&Undo\tCtrl+Z" msgstr "&Deshace\tCtrl+Z" #: ../src/gui/mainFrame.cpp:599 msgid "&Redo\tCtrl+Y" msgstr "&Redo\tCtrl+Y" #: ../src/gui/mainFrame.cpp:602 msgid "&Range" msgstr "" #: ../src/gui/mainFrame.cpp:605 msgid "&Preferences" msgstr "&Preferencias" #: ../src/gui/mainFrame.cpp:607 msgid "&Edit" msgstr "&Editar" #: ../src/gui/mainFrame.cpp:610 msgid "&View" msgstr "&Ver" #: ../src/gui/mainFrame.cpp:612 msgid "&Help...\tCtrl+H" msgstr "&Ayuda...\tCtrl+H" #: ../src/gui/mainFrame.cpp:612 msgid "Show help files and documentation" msgstr "Archivos de ayuda del espectáculo y documentación" #: ../src/gui/mainFrame.cpp:613 msgid "&Contact..." msgstr "&Contacto..." #: ../src/gui/mainFrame.cpp:613 msgid "Open contact page" msgstr "Página de contacto abierto" #: ../src/gui/mainFrame.cpp:615 msgid "&About..." msgstr "&Acerca de..." #: ../src/gui/mainFrame.cpp:615 msgid "Information about this program" msgstr "Información sobre este programa" #: ../src/gui/mainFrame.cpp:616 msgid "&Help" msgstr "A&yuda" #: ../src/gui/mainFrame.cpp:618 msgid "Stashed Filters" msgstr "Stashed Filtros" #: ../src/gui/mainFrame.cpp:623 msgid "New Filters" msgstr "" #: ../src/gui/mainFrame.cpp:653 msgid "Auto Refresh" msgstr "Coche Refresh" #: ../src/gui/mainFrame.cpp:659 msgid "Filter settings" msgstr "Configuración de filtros" #: ../src/gui/mainFrame.cpp:662 msgid "Camera Name" msgstr "Nombre de cámara" #: ../src/gui/mainFrame.cpp:674 msgid "Resize to Fit" msgstr "" #: ../src/gui/mainFrame.cpp:675 msgid "Rotate View" msgstr "" #: ../src/gui/mainFrame.cpp:676 msgid "Rotate +" msgstr "Girar + " #: ../src/gui/mainFrame.cpp:677 msgid "Rotate-" msgstr "Girar-" #: ../src/gui/mainFrame.cpp:680 msgid "3D Post-processing" msgstr "3D Correo-procesando" #: ../src/gui/mainFrame.cpp:682 msgid "Enable Cropping" msgstr "Habilita Cropping" #: ../src/gui/mainFrame.cpp:684 ../src/gui/mainFrame.cpp:695 msgid "x-y" msgstr "x-y" #: ../src/gui/mainFrame.cpp:685 ../src/gui/mainFrame.cpp:696 msgid "x-z" msgstr "x-z" #: ../src/gui/mainFrame.cpp:686 ../src/gui/mainFrame.cpp:697 msgid "y-x" msgstr "y-x" #: ../src/gui/mainFrame.cpp:687 ../src/gui/mainFrame.cpp:698 msgid "y-z" msgstr "y-z" #: ../src/gui/mainFrame.cpp:688 ../src/gui/mainFrame.cpp:699 msgid "z-x" msgstr "z-x" #: ../src/gui/mainFrame.cpp:689 ../src/gui/mainFrame.cpp:700 msgid "z-y" msgstr "z-y" #: ../src/gui/mainFrame.cpp:704 msgid "Use camera coordinates" msgstr "Coordenadas de cámara del uso" #: ../src/gui/mainFrame.cpp:705 msgid "dX" msgstr "dX" #: ../src/gui/mainFrame.cpp:707 msgid "dY" msgstr "dY" #: ../src/gui/mainFrame.cpp:709 msgid "dZ" msgstr "dZ" #: ../src/gui/mainFrame.cpp:711 msgid "Enable Anaglyphic Stereo" msgstr "Habilita Anaglyphic Stereo" #: ../src/gui/mainFrame.cpp:712 msgid "Flip Channels" msgstr "Flip Canales" #: ../src/gui/mainFrame.cpp:713 msgid "Anaglyph Mode" msgstr "Anaglyph Modo" #: ../src/gui/mainFrame.cpp:715 msgid "Red-Blue" msgstr "Rojo-Azul" #: ../src/gui/mainFrame.cpp:716 msgid "Red-Green" msgstr "Rojo-Verde" #: ../src/gui/mainFrame.cpp:717 msgid "Red-Cyan" msgstr "Rojo-Cyan" #: ../src/gui/mainFrame.cpp:718 msgid "Green-Magenta" msgstr "Verde-Magenta" #: ../src/gui/mainFrame.cpp:722 msgid "Baseline Separation" msgstr "Baseline Separación" #: ../src/gui/mainFrame.cpp:724 ../src/backend/filters/filterCommon.cpp:744 #: ../src/backend/filters/profile.cpp:1203 #: ../src/backend/filters/boundingBox.cpp:660 #: ../src/backend/filters/dataLoad.cpp:647 #: ../src/backend/filters/spectrumPlot.cpp:701 msgid "Appearance" msgstr "" #: ../src/gui/mainFrame.cpp:725 msgid "Smooth && translucent objects" msgstr "Liso && translucent objetos" #: ../src/gui/mainFrame.cpp:727 msgid "3D lighting" msgstr "3D encendiendo" #: ../src/gui/mainFrame.cpp:730 msgid "Performance" msgstr "" #: ../src/gui/mainFrame.cpp:731 msgid "Fast and weak randomisation." msgstr "Rápido y débil randomisation." #: ../src/gui/mainFrame.cpp:733 msgid "Limit Output Pts" msgstr "" #: ../src/gui/mainFrame.cpp:738 msgid "Filter caching" msgstr "Filtro caching" #: ../src/gui/mainFrame.cpp:740 msgid "Max. Ram usage (%)" msgstr "Max. Ram Uso (%)" #: ../src/gui/mainFrame.cpp:812 msgid "Warning: Your configuration file appears to be invalid:\n" msgstr "Aviso: Vuestro archivo de configuración aparece para ser nulo:\n" #: ../src/gui/mainFrame.cpp:813 msgid "\tConfig Load: " msgstr "\tConfig Carga: " #: ../src/gui/mainFrame.cpp:1127 msgid "Current state has not been saved, would you like to save it now?" msgstr "" #: ../src/gui/mainFrame.cpp:1128 msgid "State changed" msgstr "" #: ../src/gui/mainFrame.cpp:1150 ../src/gui/mainFrame.cpp:1202 msgid "Select Data or State File..." msgstr "Selecciona Dato o Archivo Estatal..." #: ../src/gui/mainFrame.cpp:1214 msgid "Merged file." msgstr "Archivo fusionado." #: ../src/gui/mainFrame.cpp:1317 msgid "Tip: You can use ⌘ (command) to merge" msgstr "Consejo: puedes utilizar ⌘ (orden) para fusionar" #: ../src/gui/mainFrame.cpp:1319 msgid "Tip: You can use ctrl to merge" msgstr "Consejo: puedes utilizar ctrl para fusionar" #: ../src/gui/mainFrame.cpp:1353 msgid "Load error" msgstr "Error en la carga" #: ../src/gui/mainFrame.cpp:1354 msgid "" "Error loading state file.\n" "See console for more info." msgstr "" "El Error que carga archivo estatal.\n" "Ve consola para más info." #: ../src/gui/mainFrame.cpp:1362 msgid "" "This state file contains filters that can be unsafe to run\n" "Do you wish to remove these before continuing?." msgstr "" "Este archivo estatal contiene filtros que pueden ser unsafe a carrera\n" " deseas sacar estos antes de continuar?." #: ../src/gui/mainFrame.cpp:1363 msgid "Security warning" msgstr "Aviso de seguridad" #: ../src/gui/mainFrame.cpp:1576 ../src/gui/mainFrame.cpp:1672 #: ../src/gui/mainFrame.cpp:2125 msgid "Unable to save" msgstr "Incapaz de salvar" #: ../src/gui/mainFrame.cpp:1577 msgid "No plot available. Please create a plot before exporting." msgstr "" "Ninguna parcela disponible. Complacer crear una parcela antes de exportar." #: ../src/gui/mainFrame.cpp:1581 msgid "Save plot..." msgstr "Salva parcela..." #: ../src/gui/mainFrame.cpp:1582 msgid "" "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*." "svg|PNG File (*.png)|*.png|All Files (*)|*" msgstr "" "Por Extensión (svg,png)|*.svg;*.png|Scalable Vector Archivo de gráficos (*." "svg)|*.svg|PNG Archivo (*.png)|*.png|Todos los Archivos (*)|*" #: ../src/gui/mainFrame.cpp:1636 msgid "Select type for save" msgstr "" #: ../src/gui/mainFrame.cpp:1637 msgid "Choose file type" msgstr "" #: ../src/gui/mainFrame.cpp:1657 ../src/gui/mainFrame.cpp:1714 #: ../src/gui/mainFrame.cpp:1750 msgid "Choose resolution" msgstr "Escoge resolución" #: ../src/gui/mainFrame.cpp:1673 msgid "Unknown file extension. Please use \"svg\" or \"png\"" msgstr "" #: ../src/gui/mainFrame.cpp:1684 msgid "Saved plot: " msgstr "Parcela salvada: " #: ../src/gui/mainFrame.cpp:1691 ../src/gui/mainFrame.cpp:1743 msgid "Save Image..." msgstr "Guardar imagen..." #: ../src/gui/mainFrame.cpp:1692 ../src/gui/mainFrame.cpp:1744 msgid "PNG File (*.png)|*.png|All Files (*)|*" msgstr "PNG Archivo (*.png)|*.png|Todos los Archivos (*)|*" #: ../src/gui/mainFrame.cpp:1706 msgid "File already exists. Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1707 ../src/gui/mainFrame.cpp:2551 #: ../src/gui/mainFrame.cpp:2803 ../src/gui/mainFrame.cpp:2826 msgid "Overwrite?" msgstr "¿Sobreescribir?" #: ../src/gui/mainFrame.cpp:1734 ../src/gui/mainFrame.cpp:1810 msgid "Saved 3D View :" msgstr "Salvado 3D Vista :" #: ../src/gui/mainFrame.cpp:1764 msgid "Program limitation" msgstr "Limitación de programa" #: ../src/gui/mainFrame.cpp:1765 msgid "" "Limitation on the screenshot dimension; please ensure that both width and " "height exceed the initial values,\n" " or that they are smaller than the initial values.\n" " If this bothers, please submit a bug." msgstr "" "Limitación en el screenshot dimensión; complacer asegurar que ambos ancho y " "la alzada superan los valores iniciales,\n" " o que son más pequeños que los valores iniciales.\n" " Si esto molesta, complacer entregar un bug." #: ../src/gui/mainFrame.cpp:1782 msgid "Number of frames" msgstr "Número de fotogramas" #: ../src/gui/mainFrame.cpp:1839 msgid "Abo&rt" msgstr "" #: ../src/gui/mainFrame.cpp:1841 msgid "&Refresh" msgstr "" #: ../src/gui/mainFrame.cpp:1966 msgid "Cannot animate with no filters." msgstr "" #: ../src/gui/mainFrame.cpp:2048 msgid "Animating" msgstr "" #: ../src/gui/mainFrame.cpp:2049 msgid "Performing refresh" msgstr "" #: ../src/gui/mainFrame.cpp:2075 msgid "Filter property change failed" msgstr "" #: ../src/gui/mainFrame.cpp:2097 msgid "Refresh failed on frame :" msgstr "" #: ../src/gui/mainFrame.cpp:2126 msgid "Image save failed for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2151 msgid "Ion save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2152 msgid "Unable to save ions for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2187 ../src/gui/mainFrame.cpp:2205 msgid "Plot save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2188 ../src/gui/mainFrame.cpp:2206 msgid "Unable to save plot or frame " msgstr "" #: ../src/gui/mainFrame.cpp:2255 msgid "Range save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2256 msgid "Unable to save range for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2285 msgid "Voxel save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2286 msgid "Unable to save voxels for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2315 msgid "Animate failed" msgstr "" #: ../src/gui/mainFrame.cpp:2339 ../src/gui/mainFrame.cpp:2505 #: ../src/gui/mainFrame.cpp:2612 ../src/gui/mainFrame.cpp:2639 msgid "No filters means no data to export" msgstr "Ningún filtro significa ningún dato para exportar" #: ../src/gui/mainFrame.cpp:2353 msgid "Package name" msgstr "Nombre del Paquete" #: ../src/gui/mainFrame.cpp:2354 msgid "Package directory name" msgstr "Nombre de directorio del paquete" #: ../src/gui/mainFrame.cpp:2356 msgid "AnalysisPackage" msgstr "AnalysisPackage" #: ../src/gui/mainFrame.cpp:2369 msgid "Package folder already exists, won't overwrite." msgstr "Carpeta de paquete ya existe, no overwrite." #: ../src/gui/mainFrame.cpp:2370 msgid "Not available" msgstr "No disponible" #: ../src/gui/mainFrame.cpp:2395 msgid "" "Package folder creation failed\n" "check writing to this location is possible." msgstr "" "Creación de carpeta del paquete el control\n" "fallado que escribe a esta ubicación es posible." #: ../src/gui/mainFrame.cpp:2396 msgid "Folder creation failed" msgstr "Creación de carpeta falló" #: ../src/gui/mainFrame.cpp:2416 msgid "Copying" msgstr "Copiando" #: ../src/gui/mainFrame.cpp:2417 msgid "Copying referenced files" msgstr "Copiando referenced archivos" #: ../src/gui/mainFrame.cpp:2483 msgid "Error copying file" msgstr "El Error que copia archivo" #: ../src/gui/mainFrame.cpp:2492 msgid "Saved package: " msgstr "Paquete salvado: " #: ../src/gui/mainFrame.cpp:2516 msgid "Export" msgstr "Exportar" #: ../src/gui/mainFrame.cpp:2522 msgid "" "POS Data (*.pos)|*.pos|Text File (*.txt)|*.txt|VTK Legacy (*.vtk)|*.vtk|All " "Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2550 ../src/gui/mainFrame.cpp:2802 msgid "File already exists, overwrite?" msgstr "El Archivo ya existe, overwrite?" #: ../src/gui/mainFrame.cpp:2591 msgid "Saved ions: " msgstr "Iones salvados: " #: ../src/gui/mainFrame.cpp:2616 msgid "Export Ranges" msgstr "Gamas de exportación" #: ../src/gui/mainFrame.cpp:2652 msgid "No voxel filters" msgstr "" #: ../src/gui/mainFrame.cpp:2698 msgid "Select voxels..." msgstr "" #: ../src/gui/mainFrame.cpp:2705 #, fuzzy msgid "Save voxels..." msgstr "Salva pos..." #: ../src/gui/mainFrame.cpp:2706 msgid "" "Raw Binary Data (float32) (*.raw)|*.raw|VTK Legacy (*.vtk)|*.vtk|All Files " "(*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2763 msgid "Exported voxels" msgstr "" #: ../src/gui/mainFrame.cpp:2767 msgid " (VTK format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2772 msgid " (RAW format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2784 msgid "Save state..." msgstr "Salva estatal..." #: ../src/gui/mainFrame.cpp:2785 msgid "XML state file (*.xml)|*.xml|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2825 msgid "Files have been referred to using relative paths. Keep relative paths?" msgstr "" "Los Archivos han sido referred a utilizar caminos relativos. Mantiene " "caminos relativos?" #: ../src/gui/mainFrame.cpp:2858 msgid "Saved state: " msgstr "Estado salvado: " #: ../src/gui/mainFrame.cpp:2934 msgid "Range editor" msgstr "" #: ../src/gui/mainFrame.cpp:3202 msgid "Manual not found locally. Launching web browser" msgstr "Manual no fundar localmente. Navegador de web del lanzamiento" #: ../src/gui/mainFrame.cpp:3211 msgid "Opening contact page in external web browser" msgstr "Página de contacto de la apertura en navegador de web externa" #: ../src/gui/mainFrame.cpp:3219 msgid "No filter stashes to edit." msgstr "Ningún filtro stashes para editar." #: ../src/gui/mainFrame.cpp:3223 msgid "Filter Stashes" msgstr "Filtro Stashes" #: ../src/gui/mainFrame.cpp:3240 msgid "Quick and dirty analysis for point data." msgstr "Rápidamente y análisis sucio para dato de punto." #: ../src/gui/mainFrame.cpp:3250 msgid "Compiled with wx Version: " msgstr "Compiled Con wx Versión: " #: ../src/gui/mainFrame.cpp:3271 msgid "Press enter to store new stash" msgstr "La Prensa introduce para almacenar nuevo stash" #: ../src/gui/mainFrame.cpp:3277 msgid "Press enter to restore stash" msgstr "La Prensa introduce para restaurar stash" #: ../src/gui/mainFrame.cpp:3310 msgid "Unable to create stash, selection invalid" msgstr "Incapaz de crear stash, inválido de selección" #: ../src/gui/mainFrame.cpp:3317 msgid "Created new filter tree stash" msgstr "Filtro nuevo creado árbol stash" #: ../src/gui/mainFrame.cpp:3426 msgid "Filter type not a data source - can't be at tree base" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete\tDel" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3639 msgid "Moving - Hold ⌘ (command) to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3641 msgid "Moving - Hold control to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3835 ../src/gui/mainFrame.cpp:4234 msgid "" "Filter settings are experimental. Program may be unstable when using this " "filter." msgstr "" #: ../src/gui/mainFrame.cpp:3994 msgid "Press enter to store new camera" msgstr "La Prensa introduce para almacenar cámara nuevo" #: ../src/gui/mainFrame.cpp:3996 msgid "Press enter to restore camera" msgstr "La Prensa introduce para restaurar cámara" #: ../src/gui/mainFrame.cpp:4021 ../src/gui/mainFrame.cpp:4062 msgid "Restored camera: " msgstr "Cámara restaurado: " #: ../src/gui/mainFrame.cpp:4039 msgid "Stored camera: " msgstr "Cámara almacenado: " #: ../src/gui/mainFrame.cpp:4144 msgid "Select an item from the filter tree before choosing a new filter" msgstr "" "Seleccionar un elemento del árbol de filtro antes de escoger un filtro nuevo" #: ../src/gui/mainFrame.cpp:4146 msgid "Load data source (file->open) before choosing a new filter" msgstr "" "Fuente de dato de la carga (archivo->abierto) antes de escoger un filtro " "nuevo" #: ../src/gui/mainFrame.cpp:4161 msgid "Select RNG File..." msgstr "Selecciona RNG Archivo..." #: ../src/gui/mainFrame.cpp:4182 msgid "Failed reading range file." msgstr "Fallado leyendo archivo de gama." #: ../src/gui/mainFrame.cpp:4186 msgid "Error loading file" msgstr "Error al cargar un archivo" #: ../src/gui/mainFrame.cpp:4254 ../src/gui/mainFrame.cpp:4354 #: ../src/gui/mainFrame.cpp:5900 ../src/gui/mainFrame.cpp:6430 msgid "Cons." msgstr "Cons." #: ../src/gui/mainFrame.cpp:4318 msgid "Refresh Aborted." msgstr "Refresh Abortó." #: ../src/gui/mainFrame.cpp:4358 msgid "*Cons." msgstr "" #: ../src/gui/mainFrame.cpp:4360 msgid "§Cons." msgstr "§Cons." #: ../src/gui/mainFrame.cpp:4422 msgid "Complete" msgstr "" #: ../src/gui/mainFrame.cpp:4520 msgid "msgs" msgstr "" #: ../src/gui/mainFrame.cpp:4561 msgid "Autosave complete." msgstr "Autoguardado completado." #: ../src/gui/mainFrame.cpp:4775 msgid "Aborting...." msgstr "" #: ../src/gui/mainFrame.cpp:4844 msgid "Updated." msgstr "Actualizada." #: ../src/gui/mainFrame.cpp:4853 msgid "Calculating..." msgstr "" #: ../src/gui/mainFrame.cpp:4856 msgid "% Done (Esc aborts)" msgstr "\\% Hecho (Esc aborta)" #: ../src/gui/mainFrame.cpp:4858 msgid "% Done" msgstr "\\% Hecho" #: ../src/gui/mainFrame.cpp:5133 msgid "Tip: You can shift-click to force full refresh, if required" msgstr "" #: ../src/gui/mainFrame.cpp:5195 msgid "No data to save" msgstr "Ningún dato para salvar" #: ../src/gui/mainFrame.cpp:5383 msgid "Aborting..." msgstr "Abortando..." #: ../src/gui/mainFrame.cpp:5389 msgid "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " msgstr "" "Esperando para refresh para abortar. Saliendo podría dirigir al programa " "backgrounding. Salida en todo caso? " #: ../src/gui/mainFrame.cpp:5390 ../src/gui/mainFrame.cpp:5410 msgid "Confirmation request" msgstr "Confirmation Petición" #: ../src/gui/mainFrame.cpp:5409 msgid "Are you sure you wish to exit 3Depict?" msgstr "Te es seguro deseas salir 3Describe?" #: ../src/gui/mainFrame.cpp:5928 msgid "Update Notice: New version " msgstr "Actualiza Aviso: versión Nueva " #: ../src/gui/mainFrame.cpp:5928 msgid " found online." msgstr " Encontrado online." #: ../src/gui/mainFrame.cpp:5932 msgid "Online Check: " msgstr "Online Control: " #: ../src/gui/mainFrame.cpp:5932 msgid " is up-to-date." msgstr " Es actual." #: ../src/gui/mainFrame.cpp:6022 msgid "An auto-save state was found, would you like to restore it?." msgstr "Un coche-salvar el estado fue encontrado, te gusta para restaurarlo?." #: ../src/gui/mainFrame.cpp:6023 msgid "Autosave" msgstr "Autoguardar" #: ../src/gui/mainFrame.cpp:6030 msgid "Unable to load autosave file.." msgstr "Incapaz de cargar autosave archivo.." #: ../src/gui/mainFrame.cpp:6221 msgid "List of available filters" msgstr "Lista de filtros disponibles" #: ../src/gui/mainFrame.cpp:6223 msgid "" "Tree - drag to move items, hold ⌘ for copy, shift for splice. Tap delete to " "remove items, multi-click to rename" msgstr "" #: ../src/gui/mainFrame.cpp:6225 msgid "" "Tree - drag to move items, hold Ctrl for copy, shift for splice. Tap delete " "to remove items, multi-click to rename." msgstr "" #: ../src/gui/mainFrame.cpp:6227 msgid "" "Enable/Disable automatic updates of data when filter change takes effect" msgstr "" "Habilitar/Imposibilitar automático actualiza de dato cuándo cambio de filtro " "toma efecto" #: ../src/gui/mainFrame.cpp:6230 msgid "" "Enable/Disable \"Alpha blending\" (transparency) in rendering system. " "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") " "and to make transparent surfaces. Disabling will provide faster rendering " "but look more blocky" msgstr "" #: ../src/gui/mainFrame.cpp:6231 msgid "" "Enable/Disable lighting calculations in rendering, for objects that request " "this. Lighting provides important depth cues for objects comprised of 3D " "surfaces. Disabling may allow faster rendering in complex scenes" msgstr "" "Habilita/Imposibilita encender cálculos en rendering, para objetos que piden " "esto. Encendiendo proporciona profundidad importante cues para los objetos " "comprendidos de 3D superficies. Imposibilitando puede dejar más rápido " "rendering en escenas complejas" #: ../src/gui/mainFrame.cpp:6232 msgid "" "Enable/Disable weak randomisation (Galois linear feedback shift register). " "Strong randomisation uses a much slower random selection method, but " "provides better protection against inadvertent correlations, and is " "recommended for final analyses" msgstr "" "Habilitar/Imposibilitar débil randomisation (Galois lineal feedback registro " "de cambio). Fuerte randomisation utiliza una mucha selección aleatoria más " "lenta método, pero proporciona protección mejor contra inadvertent " "correlaciones, y es recomendado para análisis finales" #: ../src/gui/mainFrame.cpp:6234 msgid "" "Limit the number of points that can be displayed in the 3D scene. Does not " "affect filter tree calculations. Disabling this can severely reduce " "performance, due to large numbers of points being visible at once." msgstr "" #: ../src/gui/mainFrame.cpp:6235 msgid "" "Enable/Disable caching of intermediate results during filter updates. " "Disabling caching will use less system RAM, though changes to any filter " "property will cause the entire filter tree to be recomputed, greatly slowing " "computations" msgstr "" #: ../src/gui/mainFrame.cpp:6237 msgid "Camera data information" msgstr "Información de dato del cámara" #: ../src/gui/mainFrame.cpp:6238 ../src/gui/mainFrame.cpp:6239 #: ../src/gui/mainFrame.cpp:6240 ../src/gui/mainFrame.cpp:6241 #: ../src/gui/mainFrame.cpp:6242 ../src/gui/mainFrame.cpp:6243 msgid "Align camera view to this axis" msgstr "" #: ../src/gui/mainFrame.cpp:6244 msgid "Resize view to fit 3D data" msgstr "" #: ../src/gui/mainFrame.cpp:6245 msgid "Rotate view in the +ve direction (anti-clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6246 msgid "Rotate view cin the -ve direction (clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6247 msgid "Step size in degrees for rotation" msgstr "" #: ../src/gui/mainFrame.cpp:6251 msgid "Enable/disable visual effects on final 3D output" msgstr "Habilitar/imposibilitar efectos visuales en final 3D producción" #: ../src/gui/mainFrame.cpp:6253 msgid "Enable cropping post-process effect" msgstr "Habilita cropping correo-efecto de proceso" #: ../src/gui/mainFrame.cpp:6256 msgid "" "Colour based 3D effect enable/disable - requires appropriate colour filter " "3D glasses." msgstr "" "El Color basó 3D el efecto habilita/imposibilita - requiere appropriate " "filtro de color 3D vasos." #: ../src/gui/mainFrame.cpp:6257 msgid "Glasses colour mode" msgstr "Modo de color de los vasos" #: ../src/gui/mainFrame.cpp:6259 msgid "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" msgstr "" "Nivel de separación entre imágenes izquierdas y correctas, el cual pone 3D " "profundidad a distorsión visual tradeoff" #: ../src/gui/mainFrame.cpp:6263 ../src/backend/filters/dataLoad.cpp:535 msgid "X" msgstr "X" #: ../src/gui/mainFrame.cpp:6264 ../src/backend/filters/dataLoad.cpp:539 msgid "Y" msgstr "Y" #: ../src/gui/mainFrame.cpp:6265 msgid "Save raw data to file" msgstr "Salva dato crudo para archivar" #: ../src/gui/mainFrame.cpp:6266 msgid "Copy raw data to clipboard" msgstr "Copia dato crudo a clipboard" #: ../src/gui/mainFrame.cpp:6267 msgid "Manage \"stashed\" data." msgstr "" #: ../src/gui/mainFrame.cpp:6268 msgid "Program text output" msgstr "Producción de texto del programa" #: ../src/gui/mainFrame.cpp:6269 msgid "Select active camera, or type to create new named camera" msgstr "" #: ../src/gui/mainFrame.cpp:6270 msgid "Remove the selected camera" msgstr "" #: ../src/gui/mainFrame.cpp:6271 msgid "Perform cropping from coordinate frame of camera" msgstr "" #: ../src/gui/mainFrame.cpp:6272 msgid "" "Set the maximum amount of RAM to use in order to speed repeat computations" msgstr "" #: ../src/gui/mainFrame.cpp:6273 msgid "Collapse the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:6274 msgid "Expand the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:6275 msgid "Process the filter tree, hold shift to purge cached filter data" msgstr "" #: ../src/gui/mainFrame.cpp:6390 msgid "Crop" msgstr "Recortar" #: ../src/gui/mainFrame.cpp:6391 msgid "Stereo" msgstr "Estereo" #: ../src/gui/mainFrame.cpp:6408 ../src/backend/filters/externalProgram.cpp:586 #: ../src/backend/filters/ionColour.cpp:336 #: ../src/backend/filters/spectrumPlot.cpp:655 msgid "Data" msgstr "Data" #: ../src/gui/mainFrame.cpp:6409 msgid "Cam" msgstr "Cam" #: ../src/gui/mainFrame.cpp:6410 msgid "Post" msgstr "Postear" #: ../src/gui/mainFrame.cpp:6411 msgid "Tools" msgstr "Herramientas" #: ../src/gui/mainFrame.cpp:6429 msgid "Raw" msgstr "Datos en crudo" #: ../src/gui/mainFrame.cpp:6473 msgid "Align Camera" msgstr "" #: ../src/gui/mathglPane.cpp:263 msgid "No plots selected." msgstr "Ninguna parcela seleccionó." #: ../src/gui/mathglPane.cpp:1233 msgid "" "Unable to allocate requested memory.\n" " Try a lower resolution, or save as vector (SVG)." msgstr "" "Incapaz a allocate memoria pedida.\n" " Probar una resolución más baja, o salvar como vector (SVG)." #: ../src/gui/mathglPane.cpp:1235 msgid "Plotting functions returned an error:\n" msgstr "Plotting Funciona regresado un error:\n" #: ../src/gui/mathglPane.cpp:1237 msgid "File readback check failed" msgstr "Archivo readback el control falló" #: ../src/gui/mathglPane.cpp:1239 msgid "Filesize during readback appears to be zero." msgstr "Filesize Durante readback aparece para ser zero." #: ../src/3Depict.cpp:424 msgid "File : " msgstr "Archivo :" #: ../src/3Depict.cpp:424 msgid " does not exist. Skipping" msgstr " No existe. Skipping" #: ../src/backend/configFile.cpp:188 msgid "Config file present, but is not valid (root node test)" msgstr "" "Config Presente de archivo, pero no es válido (prueba de nodo de la raíz)" #: ../src/backend/configFile.cpp:229 msgid "Unable to interpret recent file entry" msgstr "Incapaz de interpretar entrada de archivo reciente" #: ../src/backend/configFile.cpp:269 msgid "Unable to determine filter type in defaults listing." msgstr "Incapaz de determinar tipo de filtro en defaults listado." #: ../src/backend/configFile.cpp:630 msgid "Online access for non win32/apple platforms is intentionally disabled, " msgstr "" "Online Acceso para no ganar32/plataformas de manzana es intencionadamente " "imposibilitado, " #: ../src/backend/configFile.cpp:631 msgid "" "regardless of the settings you use here. Use your package manager to keep up-" "to-date" msgstr "" "A toda costa del settings te utiliza aquí. Uso vuestro director de paquete " "para mantener actual" #: ../src/backend/plot.cpp:28 ../src/backend/filters/algorithms/mass.cpp:27 #: ../src/backend/filters/voxelise.cpp:104 #: ../src/backend/filters/filterCommon.cpp:66 #: ../src/backend/filters/spectrumPlot.cpp:76 msgid "None" msgstr "Ninguno" #: ../src/backend/plot.cpp:29 msgid "Moving avg." msgstr "Moviendo avg." #: ../src/backend/plot.cpp:33 msgid "Lines" msgstr "Líneas" #: ../src/backend/plot.cpp:34 msgid "Bars" msgstr "Compases" #: ../src/backend/plot.cpp:35 msgid "Steps" msgstr "Pasos" #: ../src/backend/plot.cpp:36 msgid "Stem" msgstr "Raíz" #: ../src/backend/plot.cpp:37 msgid "Points" msgstr "Puntos" #: ../src/backend/plot.cpp:39 msgid "Density" msgstr "" #: ../src/backend/plot.cpp:40 msgid "Scatter" msgstr "" #: ../src/backend/plot.cpp:788 ../src/backend/plot.cpp:796 msgid "Multiple data types" msgstr "" #: ../src/backend/plot.cpp:1662 msgid "error" msgstr "" #: ../src/backend/plot.cpp:1967 msgid "Amplitude" msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid "WARNING: Skipping node " msgstr "AVISO: Skipping nodo " #: ../src/backend/filtertree.cpp:1151 msgid " as it was not recognised" msgstr " Cuando no fue recognised" #: ../src/backend/filtertree.cpp:1189 msgid "Error processing node: " msgstr "El Error que procesa nodo: " #: ../src/backend/filters/externalProgram.cpp:264 msgid "Collate Input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:353 msgid "Execute" msgstr "" #: ../src/backend/filters/externalProgram.cpp:394 msgid "Collate output" msgstr "" #: ../src/backend/filters/externalProgram.cpp:567 #: ../src/backend/filters/externalProgram.cpp:575 msgid "Command" msgstr "Comando" #: ../src/backend/filters/externalProgram.cpp:568 msgid "" "Full command to send to operating system. See manual for escape sequence " "meanings" msgstr "" #: ../src/backend/filters/externalProgram.cpp:571 msgid "Work Dir" msgstr "Trabajo Dir" #: ../src/backend/filters/externalProgram.cpp:572 msgid "Directory to run the command in" msgstr "" #: ../src/backend/filters/externalProgram.cpp:578 msgid "Cleanup input" msgstr "Cleanup Entrada" #: ../src/backend/filters/externalProgram.cpp:579 msgid "Erase input files when command completed" msgstr "" #: ../src/backend/filters/externalProgram.cpp:582 msgid "Cache" msgstr "Cache" #: ../src/backend/filters/externalProgram.cpp:583 msgid "" "Assume program does not alter its output, unless inputs from 3Depict are " "altered" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:41 msgid "VTK (ascii)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:42 msgid "raw binary (float32)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:86 #: ../src/backend/filters/spatialAnalysis.cpp:584 msgid "Load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:150 #: ../src/backend/filters/dataLoad.cpp:499 #: ../src/backend/filters/dataLoad.cpp:515 #: ../src/backend/filters/rangeFile.cpp:561 #: ../src/backend/filters/rangeFile.cpp:571 msgid "File" msgstr "Archivo" #: ../src/backend/filters/voxelLoad.cpp:151 msgid "Set the data file to load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:153 msgid "VTK Files (*.vtk)|*.vtk" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:165 msgid "File Type" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:166 msgid "Type of data that file contains" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:169 #: ../src/backend/filters/annotation.cpp:588 msgid "Enable" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:170 #: ../src/backend/filters/annotation.cpp:589 msgid "Enable/disable annotation" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:173 msgid "Data source" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:179 msgid "Specify bounds" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:180 msgid "Manually specify the bounding box" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:185 msgid "Lower corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:186 msgid "Position of lower bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:189 msgid "Upper corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:190 msgid "Position of upper bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:193 #: ../src/backend/filters/annotation.cpp:699 msgid "Positioning" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:28 msgid "Flat TOF" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:35 msgid "INsufficient bins to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:36 msgid "Insufficient counts to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:37 msgid "Insufficient data to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:38 msgid "Data did not appear to be random noise - cannot fit noise level" msgstr "" #: ../src/backend/filters/ionClip.cpp:65 ../src/backend/filters/profile.cpp:55 msgid "Sphere" msgstr "Esfera" #: ../src/backend/filters/ionClip.cpp:66 msgid "Plane" msgstr "Plano" #: ../src/backend/filters/ionClip.cpp:67 msgid "Cylinder" msgstr "Cilindro" #: ../src/backend/filters/ionClip.cpp:68 msgid "Aligned box" msgstr "Aligned Caja" #: ../src/backend/filters/ionClip.cpp:497 #: ../src/backend/filters/profile.cpp:1081 msgid "Primitive" msgstr "Primitiva" #: ../src/backend/filters/ionClip.cpp:498 msgid "Shape of clipping object" msgstr "" #: ../src/backend/filters/ionClip.cpp:501 #: ../src/backend/filters/profile.cpp:1086 msgid "Show Primitive" msgstr "El Espectáculo Primitivo" #: ../src/backend/filters/ionClip.cpp:502 msgid "Display the 3D interaction object" msgstr "" #: ../src/backend/filters/ionClip.cpp:505 msgid "Invert Clip" msgstr "Invert Clip" #: ../src/backend/filters/ionClip.cpp:506 msgid "" "Switch between retaining points inside (disabled) and outside (enabled) of " "primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:517 #: ../src/backend/filters/profile.cpp:1119 msgid "Position for centre of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:520 #: ../src/backend/filters/spatialAnalysis.cpp:144 #: ../src/backend/filters/profile.cpp:1107 #: ../src/backend/filters/profile.cpp:1122 msgid "Radius" msgstr "Radio" #: ../src/backend/filters/ionClip.cpp:521 #: ../src/backend/filters/profile.cpp:1123 msgid "Radius of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:531 msgid "Position that plane passes through" msgstr "" #: ../src/backend/filters/ionClip.cpp:534 msgid "Plane Normal" msgstr "El Avión Normal" #: ../src/backend/filters/ionClip.cpp:535 msgid "Perpendicular direction for plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:547 msgid "Centre of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:550 #: ../src/backend/filters/spatialAnalysis.cpp:989 #: ../src/backend/filters/profile.cpp:1100 #: ../src/backend/filters/transform.cpp:1261 msgid "Axis" msgstr "Eje" #: ../src/backend/filters/ionClip.cpp:551 msgid "Positive vector for cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:554 msgid "Lock Axis Mag." msgstr "Eje de cerradura Mag." #: ../src/backend/filters/ionClip.cpp:555 msgid "Prevent changing length of cylinder during 3D interaction" msgstr "" #: ../src/backend/filters/ionClip.cpp:558 msgid "Radius." msgstr "Radio" #: ../src/backend/filters/ionClip.cpp:559 #: ../src/backend/filters/profile.cpp:1108 msgid "Radius of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:568 msgid "Centre of Aligned Box" msgstr "" #: ../src/backend/filters/ionClip.cpp:571 msgid "Corner offset" msgstr "Esquina offset" #: ../src/backend/filters/ionClip.cpp:572 msgid "Vector to corner of box" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:84 #: ../src/backend/filters/clusterAnalysis.cpp:1025 msgid "Size Distribution" msgstr "Distribución de medida" #: ../src/backend/filters/clusterAnalysis.cpp:85 msgid "Chemistry Distribution" msgstr "Chemistry Distribución" #: ../src/backend/filters/clusterAnalysis.cpp:504 msgid "No range data. Can't cluster." msgstr "Ningún dato de gama. Puede no grupo." #: ../src/backend/filters/clusterAnalysis.cpp:515 msgid "" "No ranges selected for cluster \"core\". Cannot continue with clustering." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:524 msgid "" "No ranges selected for cluster \"bulk\". Cannot continue with clustering." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:696 msgid "Morphology Plot" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:697 msgid "\\lambda_1:\\lambda_2 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:698 msgid "\\lambda_2:\\lambda_3 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:699 msgid "Cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:744 msgid "No clusters had sufficient dimensionality to compute singular values" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:802 msgid "Found :" msgstr "Encontrado :" #: ../src/backend/filters/clusterAnalysis.cpp:804 msgid " clusters" msgstr " Grupos" #: ../src/backend/filters/clusterAnalysis.cpp:899 msgid "Compositions (fractional, core+bulk)" msgstr "Composiciones (fractional, núcleo+bulk)" #: ../src/backend/filters/clusterAnalysis.cpp:901 msgid "Compositions (fractional, core only)" msgstr "Composiciones (fractional, núcleo sólo)" #: ../src/backend/filters/clusterAnalysis.cpp:919 msgid "Frequencies (core+bulk)" msgstr "Frecuencias (núcleo+bulk)" #: ../src/backend/filters/clusterAnalysis.cpp:950 msgid "Core Link + Erode" msgstr "Vínculo de núcleo + Erosiona" #: ../src/backend/filters/clusterAnalysis.cpp:953 #: ../src/backend/filters/clusterAnalysis.cpp:957 #: ../src/backend/filters/spatialAnalysis.cpp:804 #: ../src/backend/filters/spatialAnalysis.cpp:809 #: ../src/backend/filters/transform.cpp:1163 #: ../src/backend/filters/ionInfo.cpp:674 msgid "Algorithm" msgstr "Algoritmo" #: ../src/backend/filters/clusterAnalysis.cpp:954 msgid "Cluster algorithm mode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:964 msgid "Core Classify" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:965 msgid "" "Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:970 msgid "Core Classify Dist" msgstr "El Núcleo Clasifica Dist" #: ../src/backend/filters/clusterAnalysis.cpp:971 msgid "Restrict only atoms joind by this distance to be cluster sources" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:974 msgid "Classify Knn Max" msgstr "Clasifica Knn Max" #: ../src/backend/filters/clusterAnalysis.cpp:975 msgid "" "Require that the kth NN (this number) is within the classify distance, to be " "a cluster source" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:979 msgid "Core Link Dist" msgstr "Vínculo de núcleo Dist" #: ../src/backend/filters/clusterAnalysis.cpp:980 msgid "Distance between clusters to allow linking" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:983 msgid "Bulk Link" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:984 msgid "Enable linking of non-cluster species - eg for composition analysis" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:989 msgid "Bulk Link (Envelope) dist" msgstr "Bulk Vínculo (Envelope) Dist" #: ../src/backend/filters/clusterAnalysis.cpp:990 msgid "" "Distance from core points, that form a cluster, used to grab surrounding " "bulk points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:993 msgid "Erosion" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:994 msgid "" "Enable removal of edge bulk atoms, to remove \"cloud\" of atoms beyond the " "nominal cluster limits (hole-closing halo)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:999 msgid "Erode Dist" msgstr "Erosiona Dist" #: ../src/backend/filters/clusterAnalysis.cpp:1000 msgid "" "Distance from unclustered material in which bulk points are eroded from " "cluster" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1006 msgid "Clustering Params" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1010 msgid "Size Cropping" msgstr "Medida Cropping" #: ../src/backend/filters/clusterAnalysis.cpp:1011 msgid "Remove clusters based upon size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1016 msgid "Min Size" msgstr "Tamaño Min" #: ../src/backend/filters/clusterAnalysis.cpp:1017 msgid "Remove clusters below this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1020 msgid "Max Size" msgstr "Tamaño Max" #: ../src/backend/filters/clusterAnalysis.cpp:1021 msgid "Remove clusters above this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1026 msgid "Show number of clusters as a function of cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1031 msgid "Dist. Log Scale" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1032 msgid "Use logarithmic scale for size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1037 msgid "Morphology Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1038 msgid "Create a plot showing cluster aspect ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1041 msgid "Cluster Id" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1042 msgid "Assign cluster output a unique per-cluster value (id)." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1047 msgid "Chemistry Dist." msgstr "Chemistry Dist." #: ../src/backend/filters/clusterAnalysis.cpp:1048 msgid "Create a plot showing chemistry for each cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1053 msgid "Normalise Comp." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1054 msgid "Convert cluster counts to composition" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1059 msgid "Postprocess" msgstr "Postprocess" #: ../src/backend/filters/clusterAnalysis.cpp:1078 msgid "If selected, use as \"core\" ion type (can make clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1083 msgid "Core Ranges" msgstr "Gamas de núcleo" #: ../src/backend/filters/clusterAnalysis.cpp:1090 msgid "Enable/Disable All" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1091 msgid "Enable/disable all ions for bulk" msgstr "Habilitar/imposibilitar efectos visuales en final 3D producción" #: ../src/backend/filters/clusterAnalysis.cpp:1103 msgid "" "If selected, use as \"bulk\" ion type (can be included in existing clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1108 msgid "Bulk Ranges" msgstr "Bulk Gamas" #: ../src/backend/filters/clusterAnalysis.cpp:1124 msgid "Max. Sep + Erode" msgstr "Max. Sep + Erosiona" #: ../src/backend/filters/clusterAnalysis.cpp:1881 msgid " --------------------------- Parameter selection notice ------------- " msgstr "" " --------------------------- Aviso de selección del parámetro ------------- " #: ../src/backend/filters/clusterAnalysis.cpp:1882 msgid "You have specified a bulk distance larger than half your link distance." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1883 msgid "" "You can do this; thats OK, but the output is no longer independent of the " "computational process;" msgstr "" "Puedes hacer esto; thats OK, pero la producción es no más largo " "independiente del computational proceso;" #: ../src/backend/filters/clusterAnalysis.cpp:1884 msgid "" "This will be a problem in the case where two or more clusters can equally " "lay claim to a \"bulk\" ion. " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1885 msgid "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." msgstr "" " Si vuestro inter-distancia de grupo es suficientemente grande (más grande " "que vuestro bulk enlazando distancia), entonces puedes conseguir fuera con " "esto." #: ../src/backend/filters/clusterAnalysis.cpp:1886 msgid "" " In theory it is possible to \"join\" the clusters, but this has not been " "implemented for speed reasons." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1887 msgid "" "If you want this, please contact the author, or just use the source to add " "this in yourself." msgstr "" "Si quieres esto, complacer contactar el autor, o justo utilizar la fuente " "para añadir esto en tú." #: ../src/backend/filters/clusterAnalysis.cpp:1888 msgid "---------------------------------------------------------------------- " msgstr "---------------------------------------------------------------------- " #: ../src/backend/filters/clusterAnalysis.cpp:1898 #: ../src/backend/filters/spatialAnalysis.cpp:576 #: ../src/backend/filters/spatialAnalysis.cpp:2428 #: ../src/backend/filters/spatialAnalysis.cpp:2914 #: ../src/backend/filters/spatialAnalysis.cpp:3203 #: ../src/backend/filters/spatialAnalysis.cpp:3505 #: ../src/backend/filters/spatialAnalysis.cpp:3656 #: ../src/backend/filters/spatialAnalysis.cpp:3744 #: ../src/backend/filters/spatialAnalysis.cpp:4016 #: ../src/backend/filters/spatialAnalysis.cpp:4238 #: ../src/backend/filters/spatialAnalysis.cpp:4431 #: ../src/backend/filters/spatialAnalysis.cpp:4661 #: ../src/backend/filters/transform.cpp:1028 msgid "Collate" msgstr "Intercalar" #: ../src/backend/filters/clusterAnalysis.cpp:1917 msgid "Build Core" msgstr "Núcleo de complexión" #: ../src/backend/filters/clusterAnalysis.cpp:1945 msgid "Core" msgstr "Núcleo" #: ../src/backend/filters/clusterAnalysis.cpp:2068 msgid "Bulk" msgstr "Bulk" #: ../src/backend/filters/clusterAnalysis.cpp:2146 msgid "Erode" msgstr "Erosión" #: ../src/backend/filters/clusterAnalysis.cpp:2224 msgid "Re-Collate" msgstr "Re-Cotejar" #: ../src/backend/filters/clusterAnalysis.cpp:2279 msgid "Classify Core" msgstr "Clasifica Núcleo" #: ../src/backend/filters/clusterAnalysis.cpp:2370 msgid "Build Bulk" msgstr "Complexión Bulk" #: ../src/backend/filters/clusterAnalysis.cpp:2618 #: ../src/backend/filters/clusterAnalysis.cpp:2832 msgid "Cluster Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2619 #: ../src/backend/filters/clusterAnalysis.cpp:2836 msgid "Frequency" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2834 msgid "Composition" msgstr "" #: ../src/backend/filters/voxelise.cpp:96 msgid "None (Raw count)" msgstr "Ninguno (Crudo contar)" #: ../src/backend/filters/voxelise.cpp:97 msgid "Volume (Density)" msgstr "Volumen (Densidad)" #: ../src/backend/filters/voxelise.cpp:98 msgid "All Ions (conc)" msgstr "Todos los Iones (conc)" #: ../src/backend/filters/voxelise.cpp:99 msgid "Ratio (Num/Denom)" msgstr "Proporción (Num/Denom)" #: ../src/backend/filters/voxelise.cpp:105 msgid "Gaussian (blur)" msgstr "" #: ../src/backend/filters/voxelise.cpp:106 msgid "Lapl. of Gauss. (edges)" msgstr "" #: ../src/backend/filters/voxelise.cpp:341 msgid "Counting" msgstr "" #: ../src/backend/filters/voxelise.cpp:552 msgid "Gauss Smooth" msgstr "" #: ../src/backend/filters/voxelise.cpp:558 msgid "Calc. Laplace" msgstr "" #: ../src/backend/filters/voxelise.cpp:584 msgid "Voxel Limits (min,max): (" msgstr "Voxel Límites (min,max): (" #: ../src/backend/filters/voxelise.cpp:594 #: ../src/backend/filters/filterCommon.cpp:475 msgid "Representation" msgstr "Representacion" #: ../src/backend/filters/voxelise.cpp:688 msgid "Fixed Width" msgstr "" #: ../src/backend/filters/voxelise.cpp:689 msgid "If true, use fixed size voxels, otherwise use fixed count" msgstr "" #: ../src/backend/filters/voxelise.cpp:694 msgid "Bin Width, X" msgstr "" #: ../src/backend/filters/voxelise.cpp:695 msgid "Voxel size in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:698 msgid "Bin Width, Y" msgstr "Ancho de cubo x" #: ../src/backend/filters/voxelise.cpp:699 msgid "Voxel size in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:702 msgid "Bin Width, Z" msgstr "" #: ../src/backend/filters/voxelise.cpp:703 msgid "Voxel size in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:708 msgid "Num Bins , X" msgstr "" #: ../src/backend/filters/voxelise.cpp:709 msgid "Number of bins in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:712 msgid "Num Bins, Y" msgstr "" #: ../src/backend/filters/voxelise.cpp:713 msgid "Number of bins in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:716 msgid "Num Bins, Z" msgstr "" #: ../src/backend/filters/voxelise.cpp:717 msgid "Number of bins Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:747 msgid "Normalise by" msgstr "Normalise Por" #: ../src/backend/filters/voxelise.cpp:748 msgid "Method to use to normalise scalar value in each voxel" msgstr "" #: ../src/backend/filters/voxelise.cpp:751 msgid "Computation" msgstr "" #: ../src/backend/filters/voxelise.cpp:758 #: ../src/backend/filters/spatialAnalysis.cpp:1172 #: ../src/backend/filters/spatialAnalysis.cpp:1191 msgid "Numerator" msgstr "Numerador" #: ../src/backend/filters/voxelise.cpp:759 msgid "Parameter \"a\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:776 msgid "Enable this ion for numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:789 #: ../src/backend/filters/voxelise.cpp:808 #: ../src/backend/filters/spatialAnalysis.cpp:1197 #: ../src/backend/filters/spatialAnalysis.cpp:1214 msgid "Denominator" msgstr "Denominador" #: ../src/backend/filters/voxelise.cpp:790 msgid "Parameter \"b\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:804 msgid "Enable this ion for denominator contribution" msgstr "" #: ../src/backend/filters/voxelise.cpp:824 msgid "Threshold Mask" msgstr "" #: ../src/backend/filters/voxelise.cpp:825 msgid "Enable threshold based exclusion of values." msgstr "" #: ../src/backend/filters/voxelise.cpp:830 msgid "Count threshold" msgstr "" #: ../src/backend/filters/voxelise.cpp:831 msgid "Threshold counts above which to keep data (if normalising, denominator)" msgstr "" #: ../src/backend/filters/voxelise.cpp:834 msgid "Mask to Max" msgstr "" #: ../src/backend/filters/voxelise.cpp:835 msgid "" "If enabled, masked values are set to the voxel maximum. If disabled, minimum" msgstr "" #: ../src/backend/filters/voxelise.cpp:839 #: ../src/backend/filters/voxelise.cpp:857 msgid "Filtering" msgstr "Filtrar" #: ../src/backend/filters/voxelise.cpp:840 msgid "Smoothing method to use on voxels" msgstr "" #: ../src/backend/filters/voxelise.cpp:844 msgid "Processing" msgstr "" #: ../src/backend/filters/voxelise.cpp:848 msgid "Standard Dev" msgstr "" #: ../src/backend/filters/voxelise.cpp:849 msgid "Filtering Scale (standard deviation)" msgstr "" #: ../src/backend/filters/voxelise.cpp:852 msgid "Kernel Size" msgstr "" #: ../src/backend/filters/voxelise.cpp:853 msgid "" "Filter radius, in multiples of std. dev. Larger -> slower, more accurate" msgstr "" #: ../src/backend/filters/ionColour.cpp:144 msgid "Unable to determine colour limits" msgstr "" #: ../src/backend/filters/ionColour.cpp:302 #: ../src/backend/filters/spatialAnalysis.cpp:1238 msgid "Colour Map" msgstr "Mapa de color" #: ../src/backend/filters/ionColour.cpp:303 #: ../src/backend/filters/filterCommon.cpp:584 #: ../src/backend/filters/filterCommon.cpp:638 msgid "Colour scheme used to assign points colours by value" msgstr "" #: ../src/backend/filters/ionColour.cpp:306 msgid "Reverse map" msgstr "" #: ../src/backend/filters/ionColour.cpp:307 msgid "Reverse the colour scale" msgstr "" #: ../src/backend/filters/ionColour.cpp:310 #: ../src/backend/filters/filterCommon.cpp:493 #: ../src/backend/filters/filterCommon.cpp:591 #: ../src/backend/filters/filterCommon.cpp:645 #: ../src/backend/filters/filterCommon.cpp:705 msgid "Show Bar" msgstr "Barra de espectáculo" #: ../src/backend/filters/ionColour.cpp:311 msgid "Display the colour legend in the 3D view" msgstr "" #: ../src/backend/filters/ionColour.cpp:315 msgid "How see-through to make the legend (0- transparent, 1- solid)" msgstr "" #: ../src/backend/filters/ionColour.cpp:318 msgid "Num Colours" msgstr "Num Colores" #: ../src/backend/filters/ionColour.cpp:319 msgid "Number of unique colours to use in colour map" msgstr "" #: ../src/backend/filters/ionColour.cpp:322 msgid "Auto bounds" msgstr "" #: ../src/backend/filters/ionColour.cpp:323 msgid "Automatically scale colour to min/max of data range" msgstr "" #: ../src/backend/filters/ionColour.cpp:328 #: ../src/backend/filters/filterCommon.cpp:503 #: ../src/backend/filters/filterCommon.cpp:601 #: ../src/backend/filters/filterCommon.cpp:655 #: ../src/backend/filters/filterCommon.cpp:715 msgid "Map start" msgstr "Inicio de mapa" #: ../src/backend/filters/ionColour.cpp:329 #: ../src/backend/filters/filterCommon.cpp:504 #: ../src/backend/filters/filterCommon.cpp:602 #: ../src/backend/filters/filterCommon.cpp:656 #: ../src/backend/filters/filterCommon.cpp:716 msgid "Assign points with this value to the first colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:332 msgid "Map End" msgstr "Fin de mapa" #: ../src/backend/filters/ionColour.cpp:333 #: ../src/backend/filters/filterCommon.cpp:508 #: ../src/backend/filters/filterCommon.cpp:606 #: ../src/backend/filters/filterCommon.cpp:660 #: ../src/backend/filters/filterCommon.cpp:720 msgid "Assign points with this value to the last colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:444 ../src/backend/filter.cpp:198 msgid "Aborted" msgstr "Abortado" #: ../src/backend/filters/spatialAnalysis.cpp:131 msgid "Local Density" msgstr "Densidad local" #: ../src/backend/filters/spatialAnalysis.cpp:132 msgid "Density Filtering" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:133 msgid "Radial Distribution" msgstr "Distribución radial" #: ../src/backend/filters/spatialAnalysis.cpp:134 msgid "Axial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:135 msgid "Binomial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:136 msgid "Point Em/Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:137 msgid "Local Chemistry" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:138 msgid "Local Chem. Filter" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:139 msgid "Axial DF Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:143 msgid "Neighbour Count" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:639 #: ../src/backend/filters/spatialAnalysis.cpp:2462 #: ../src/backend/filters/spatialAnalysis.cpp:2515 #: ../src/backend/filters/spatialAnalysis.cpp:2919 #: ../src/backend/filters/spatialAnalysis.cpp:3208 #: ../src/backend/filters/spatialAnalysis.cpp:3516 #: ../src/backend/filters/spatialAnalysis.cpp:3662 #: ../src/backend/filters/spatialAnalysis.cpp:4263 #: ../src/backend/filters/spatialAnalysis.cpp:4686 msgid "Build" msgstr "Construir" #: ../src/backend/filters/spatialAnalysis.cpp:688 #: ../src/backend/filters/spatialAnalysis.cpp:3538 #: ../src/backend/filters/spatialAnalysis.cpp:4146 #: ../src/backend/filters/spatialAnalysis.cpp:4280 #: ../src/backend/filters/spatialAnalysis.cpp:4562 #: ../src/backend/filters/spatialAnalysis.cpp:4703 msgid "Compute" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:805 msgid "Spatial analysis algorithm to use" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:830 #: ../src/backend/filters/spatialAnalysis.cpp:861 msgid "Stop Mode" msgstr "Modo de parón" #: ../src/backend/filters/spatialAnalysis.cpp:831 msgid "Method to use to terminate algorithm when examining each point" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:837 msgid "NN Max" msgstr "NN Max" #: ../src/backend/filters/spatialAnalysis.cpp:838 msgid "Maximum number of neighbours to examine" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:844 msgid "Normalise bins" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:845 msgid "" "Normalise counts by binwidth. Needed when comparing NN histograms against " "one another" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:848 msgid "Show Random" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:849 msgid "Show a fitted (density matched) theoretical distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:856 msgid "Dist Max" msgstr "Dist Max" #: ../src/backend/filters/spatialAnalysis.cpp:857 #: ../src/backend/filters/spatialAnalysis.cpp:1226 msgid "Maximum distance from each point for search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:869 #: ../src/backend/filters/spatialAnalysis.cpp:981 #: ../src/backend/filters/profile.cpp:1141 msgid "Num Bins" msgstr "Num Cubos" #: ../src/backend/filters/spatialAnalysis.cpp:870 #: ../src/backend/filters/spatialAnalysis.cpp:982 msgid "Number of bins for output 1D RDF plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:873 msgid "Surface Remove" msgstr "La Superficie Saca" #: ../src/backend/filters/spatialAnalysis.cpp:874 msgid "" "Exclude surface as part of source to minimise bias in RDF (at cost of " "increased noise)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:880 msgid "Remove Dist" msgstr "Saca Dist" #: ../src/backend/filters/spatialAnalysis.cpp:881 msgid "Minimum distance to remove from surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:887 #: ../src/backend/filters/spatialAnalysis.cpp:1028 #: ../src/backend/filters/profile.cpp:1153 #: ../src/backend/filters/ionInfo.cpp:599 msgid "Normalise" msgstr "Normaliza" #: ../src/backend/filters/spatialAnalysis.cpp:888 msgid "Perform normalisation of the RDF, rather than raw counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:892 msgid "Plot colour" msgstr "Color de parcela " #: ../src/backend/filters/spatialAnalysis.cpp:893 #: ../src/backend/filters/spatialAnalysis.cpp:986 msgid "Colour of output plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:897 #: ../src/backend/filters/spatialAnalysis.cpp:971 #: ../src/backend/filters/spatialAnalysis.cpp:976 #: ../src/backend/filters/spatialAnalysis.cpp:993 #: ../src/backend/filters/spatialAnalysis.cpp:1018 #: ../src/backend/filters/spatialAnalysis.cpp:1132 #: ../src/backend/filters/spatialAnalysis.cpp:1229 msgid "Alg. Params." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:908 #: ../src/backend/filters/spatialAnalysis.cpp:1147 msgid "Source" msgstr "Fuente" #: ../src/backend/filters/spatialAnalysis.cpp:909 msgid "Ions to use for initiating RDF search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:924 #: ../src/backend/filters/spatialAnalysis.cpp:1161 #: ../src/backend/filters/spatialAnalysis.cpp:1186 msgid "Enable/disable ion as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:929 #: ../src/backend/filters/spatialAnalysis.cpp:1166 msgid "Source Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:937 msgid "Enable/disable all ions as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:951 #: ../src/backend/filters/spatialAnalysis.cpp:1210 msgid "Enable/disable this ion as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:955 msgid "Target Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:963 #: ../src/backend/filters/spatialAnalysis.cpp:1124 msgid "Cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:964 msgid "Remove points with local density above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:967 #: ../src/backend/filters/spatialAnalysis.cpp:1128 msgid "Retain Upper" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:968 msgid "Retain either points with density above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:985 msgid "Plot Colour" msgstr "Color de parcela" #: ../src/backend/filters/spatialAnalysis.cpp:990 msgid "Vector along which to calculate distribution function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:998 msgid "Block size" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:999 msgid "Number of ions to use per block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1002 msgid "Max Block Aspect" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1003 msgid "" "Maximum allowable block aspect ratio. Blocks above this aspect are " "discarded. Setting too high decreases correlation strength. Too low causes " "loss of statistical power." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1013 msgid "Extrusion Direction" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1014 msgid "Direction in which blocks are extended during construction." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1022 msgid "Plot Counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1023 msgid "Show the counts in the binomial histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1029 msgid "" "Normalise the counts in the binomial histogram to a probability density " "function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1033 msgid "Expected Freq" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1034 msgid "" "Show the theoretically expected probability density function for a random " "dataset with the same mean" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1042 msgid "Display Grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1043 msgid "Show the extruded grid in the 3D view. This may be slow" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1046 msgid "View Options" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1060 msgid "Ions to use when counting" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1073 msgid "Enable/disable ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1078 msgid "Enabled Ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Data File" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Pos file of points to subtract/replace/etc" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1091 msgid "Match Tol." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1092 msgid "Tolerance to allow for matching" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1104 msgid "Replacment condition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1109 msgid "Replace value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1110 msgid "Use value data from file when replacing ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1114 msgid "Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1125 msgid "Remove points with local concentration above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1129 msgid "Retain either points with concentration above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1148 msgid "Enable/disable all ions as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1173 msgid "Enable/Disable all ions to use as Numerator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1198 msgid "Enable/Disable all ions to use as Denominator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1221 msgid "Angular step (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1222 msgid "Step in degrees between calculations for angular histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1225 msgid "Dist. Max" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1232 msgid "Log scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1233 msgid "Show 2D plot in logarithmic scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1239 msgid "Colour scheme in 2D plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1241 #: ../src/backend/filters/annotation.cpp:816 msgid "Display" msgstr "Panel de visualización" #: ../src/backend/filters/spatialAnalysis.cpp:1841 msgid "Spatial analysis aborted by user" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1842 msgid "Insufficient memory for binomial. Reduce input size?" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1843 msgid "Required range data not present" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1844 msgid "Unable to generate usable binomial grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1846 msgid "Insufficient points to continue" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1847 msgid "Unable to load file" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2476 #: ../src/backend/filters/spatialAnalysis.cpp:2529 #: ../src/backend/filters/filterCommon.cpp:524 #: ../src/backend/filters/filterCommon.cpp:574 #: ../src/backend/filters/filterCommon.cpp:627 msgid "Surface" msgstr "Superficie" #: ../src/backend/filters/spatialAnalysis.cpp:2569 #: ../src/backend/filters/spatialAnalysis.cpp:2941 #: ../src/backend/filters/spatialAnalysis.cpp:3232 msgid "Analyse" msgstr "Analiza" #: ../src/backend/filters/spatialAnalysis.cpp:2648 #: ../src/backend/filters/spatialAnalysis.cpp:2742 #: ../src/backend/filters/spatialAnalysis.cpp:2811 msgid "Radial Distance" msgstr "Distancia radial" #: ../src/backend/filters/spatialAnalysis.cpp:2650 #: ../src/backend/filters/spatialAnalysis.cpp:2747 msgid "Count/Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2659 #: ../src/backend/filters/spatialAnalysis.cpp:2755 msgid "NN Freq." msgstr "NN Freq." #: ../src/backend/filters/spatialAnalysis.cpp:2802 msgid "Warning, " msgstr "Advertencia, " #: ../src/backend/filters/spatialAnalysis.cpp:2803 msgid "" " points were unable to find neighbour points that exceeded the search " "radius, and thus terminated prematurely" msgstr "" " Los Puntos eran incapaces de encontrar puntos de vecino que superaron la " "búsqueda radius, y por ello terminated prematurely" #: ../src/backend/filters/spatialAnalysis.cpp:2813 msgid " RDF" msgstr " RDF" #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid "Found " msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid " points with no neighbours - these have been dropped" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3139 #: ../src/backend/filters/spatialAnalysis.cpp:3440 msgid "Number Density (\\#/Vol^3)" msgstr "Densidad de número (\\#/Vol^3)" #: ../src/backend/filters/spatialAnalysis.cpp:3164 #: ../src/backend/filters/spatialAnalysis.cpp:3462 msgid "Warning," msgstr "Advertencia, " #: ../src/backend/filters/spatialAnalysis.cpp:3165 #: ../src/backend/filters/spatialAnalysis.cpp:3463 msgid " points were un-analysable. These have been dropped" msgstr " Los Puntos eran un-analysable. Estos han sido caídos" #: ../src/backend/filters/spatialAnalysis.cpp:3187 #: ../src/backend/filters/spatialAnalysis.cpp:3485 msgid "And so on..." msgstr "Y tan encima..." #: ../src/backend/filters/spatialAnalysis.cpp:3584 msgid "Insufficient points to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3607 msgid "Axial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3609 msgid " 1D Dist. Func." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3675 msgid "Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3717 msgid "Axial DF power" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3718 msgid "Theta - Azimuthal angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3719 msgid "Phi - Elevation angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3753 msgid "Binomial" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3890 #: ../src/backend/filters/spatialAnalysis.cpp:3958 msgid "Ions in Block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3892 #: ../src/backend/filters/spatialAnalysis.cpp:3960 #: ../src/backend/filters/spectrumPlot.cpp:79 msgid "Probability" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3962 msgid "Count (blocks)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4037 #: ../src/backend/filters/spatialAnalysis.cpp:4452 msgid "Build Numerator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4051 #: ../src/backend/filters/spatialAnalysis.cpp:4466 msgid "Build Denominator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4395 #: ../src/backend/filters/spatialAnalysis.cpp:4817 msgid "Relative Conc. (%)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:55 msgid "Point Cloud" msgstr "Nube de punto" #: ../src/backend/filters/filterCommon.cpp:56 msgid "Isosurface" msgstr "Isosurface" #: ../src/backend/filters/filterCommon.cpp:57 msgid "Axial slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:58 msgid "Slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:60 msgid "Volume Render" msgstr "" #: ../src/backend/filters/filterCommon.cpp:67 msgid "Linear" msgstr "" #: ../src/backend/filters/filterCommon.cpp:476 msgid "3D display method" msgstr "" #: ../src/backend/filters/filterCommon.cpp:484 msgid "Spot size" msgstr "Medida de sitio" #: ../src/backend/filters/filterCommon.cpp:485 msgid "Size of the spots to use for display" msgstr "" #: ../src/backend/filters/filterCommon.cpp:489 #: ../src/backend/filters/filterCommon.cpp:533 #: ../src/backend/filters/filterCommon.cpp:587 #: ../src/backend/filters/filterCommon.cpp:641 #: ../src/backend/filters/filterCommon.cpp:692 msgid "Transparency" msgstr "Transparencia" #: ../src/backend/filters/filterCommon.cpp:490 msgid "How \"see through\" each point is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:494 #: ../src/backend/filters/filterCommon.cpp:592 #: ../src/backend/filters/filterCommon.cpp:646 #: ../src/backend/filters/filterCommon.cpp:706 msgid "Display colour bar in 3D view?" msgstr "" #: ../src/backend/filters/filterCommon.cpp:497 msgid "Auto Scale" msgstr "" #: ../src/backend/filters/filterCommon.cpp:498 #: ../src/backend/filters/filterCommon.cpp:596 #: ../src/backend/filters/filterCommon.cpp:650 #: ../src/backend/filters/filterCommon.cpp:710 msgid "Auto-compute min/max values (colour limits)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:507 #: ../src/backend/filters/filterCommon.cpp:605 #: ../src/backend/filters/filterCommon.cpp:659 #: ../src/backend/filters/filterCommon.cpp:719 msgid "Map end" msgstr "Fin de mapa" #: ../src/backend/filters/filterCommon.cpp:517 msgid "Surf. param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:519 msgid "Isovalue" msgstr "Isovalue" #: ../src/backend/filters/filterCommon.cpp:520 msgid "Scalar value to show as isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:529 msgid "Colour of isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:534 #: ../src/backend/filters/filterCommon.cpp:588 #: ../src/backend/filters/filterCommon.cpp:642 #: ../src/backend/filters/filterCommon.cpp:693 msgid "How \"see through\" each facet is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:544 #: ../src/backend/filters/filterCommon.cpp:616 msgid "Slice param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:552 #: ../src/backend/filters/filterCommon.cpp:553 msgid "Slice Axis" msgstr "" #: ../src/backend/filters/filterCommon.cpp:554 msgid "Normal for the planar slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:559 msgid "Slice Coord" msgstr "" #: ../src/backend/filters/filterCommon.cpp:560 msgid "Fractional coordinate that slice plane passes through" msgstr "" #: ../src/backend/filters/filterCommon.cpp:569 msgid "Interp Mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:570 msgid "Interpolation mode for direction normal to slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:583 #: ../src/backend/filters/filterCommon.cpp:637 #: ../src/backend/filters/filterCommon.cpp:688 msgid "Colour Mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:595 #: ../src/backend/filters/filterCommon.cpp:649 #: ../src/backend/filters/filterCommon.cpp:709 msgid "Auto Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:618 msgid "Slice Origin" msgstr "" #: ../src/backend/filters/filterCommon.cpp:619 msgid "Point on plane for slice, in 0->1 coordinates" msgstr "" #: ../src/backend/filters/filterCommon.cpp:622 msgid "Slice Normal" msgstr "" #: ../src/backend/filters/filterCommon.cpp:623 msgid "Normal vector for slice plane" msgstr "" #: ../src/backend/filters/filterCommon.cpp:664 msgid "Colour mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:674 msgid "Built-in map" msgstr "" #: ../src/backend/filters/filterCommon.cpp:675 msgid "" "True if you want to use a built-in colour map, false to specify your own" msgstr "" #: ../src/backend/filters/filterCommon.cpp:689 #: ../src/backend/filters/filterCommon.cpp:700 msgid "Colour scheme used to assign colours and transparency by value" msgstr "" #: ../src/backend/filters/filterCommon.cpp:733 msgid "Show Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:734 msgid "Display the voxel's bounding box" msgstr "" #: ../src/backend/filters/filterCommon.cpp:739 msgid "Bound Colour" msgstr "" #: ../src/backend/filters/filterCommon.cpp:740 msgid "Set Voxel's bounding box colour" msgstr "" #: ../src/backend/filters/profile.cpp:53 msgid "Cylinder (axial)" msgstr "" #: ../src/backend/filters/profile.cpp:54 msgid "Cylinder (radial)" msgstr "" #: ../src/backend/filters/profile.cpp:626 #: ../src/backend/filters/annotation.cpp:81 msgid "Distance" msgstr "Distancia" #: ../src/backend/filters/profile.cpp:635 msgid "Fraction" msgstr "Fracción" #: ../src/backend/filters/profile.cpp:641 msgid "Density (\\frac{\\#}{len^3})" msgstr "" #: ../src/backend/filters/profile.cpp:712 msgid "Freq. Profile" msgstr "Freq. Perfil" #: ../src/backend/filters/profile.cpp:764 msgid "No data remained in profile - cannot display result" msgstr "" #: ../src/backend/filters/profile.cpp:1063 msgid "Total Density" msgstr "" #: ../src/backend/filters/profile.cpp:1064 msgid "Do not do per-species analysis, perform density computation only" msgstr "" #: ../src/backend/filters/profile.cpp:1078 msgid "Primitive type" msgstr "" #: ../src/backend/filters/profile.cpp:1079 msgid "Basic shape to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1087 msgid "Display the 3D composition profile interaction object" msgstr "" #: ../src/backend/filters/profile.cpp:1098 msgid "Position for centre of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1101 msgid "Vector between ends of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1104 msgid "Lock Axis Mag" msgstr "Eje de cerradura Mag." #: ../src/backend/filters/profile.cpp:1105 msgid "Prevent length of cylinder changing during interaction" msgstr "" #: ../src/backend/filters/profile.cpp:1134 msgid "Fixed Bin Num" msgstr "Cubo fijo Num" #: ../src/backend/filters/profile.cpp:1135 msgid "" "If true, use a fixed number of bins for profile, otherwise use fixed step " "size" msgstr "" #: ../src/backend/filters/profile.cpp:1142 msgid "Number of bins to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1148 #: ../src/backend/filters/spectrumPlot.cpp:636 msgid "Bin Width" msgstr "" #: ../src/backend/filters/profile.cpp:1149 msgid "Size of each bin in profile" msgstr "" #: ../src/backend/filters/profile.cpp:1154 msgid "Convert bin counts into relative frequencies in each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1157 msgid "Min. Events" msgstr "" #: ../src/backend/filters/profile.cpp:1158 msgid "Drop data that does not have this many events" msgstr "" #: ../src/backend/filters/profile.cpp:1163 msgid "Remap Ions" msgstr "" #: ../src/backend/filters/profile.cpp:1164 msgid "Break apart ions into components, using a remap file?" msgstr "" #: ../src/backend/filters/profile.cpp:1170 msgid "Remap file" msgstr "" #: ../src/backend/filters/profile.cpp:1171 msgid "\"Remap\" file that describes how the ions can be broken apart" msgstr "" #: ../src/backend/filters/profile.cpp:1176 msgid "Settings" msgstr "" #: ../src/backend/filters/profile.cpp:1190 #: ../src/backend/filters/spectrumPlot.cpp:693 msgid "Plot Type" msgstr "Tipo de Trazo" #: ../src/backend/filters/profile.cpp:1191 msgid "Visual style for plot" msgstr "" #: ../src/backend/filters/profile.cpp:1198 msgid "Colour of plot" msgstr "" #: ../src/backend/filters/profile.cpp:1213 msgid "Err. Estimator" msgstr "Err. Estimator" #: ../src/backend/filters/profile.cpp:1216 msgid "Method of estimating error associated with each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1223 msgid "Avg. Window" msgstr "Avg. Ventana" #: ../src/backend/filters/profile.cpp:1226 msgid "Number of bins to include in moving average filter" msgstr "" #: ../src/backend/filters/profile.cpp:1231 msgid "Error analysis" msgstr "" #: ../src/backend/filters/transform.cpp:84 msgid "Translate" msgstr "Trasladar" #: ../src/backend/filters/transform.cpp:85 msgid "Scale (isotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:86 msgid "Scale (anisotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:87 msgid "Rotate" msgstr "Girar" #: ../src/backend/filters/transform.cpp:88 msgid "Value Shuffle" msgstr "Valor Shuffle" #: ../src/backend/filters/transform.cpp:89 msgid "Spatial Noise" msgstr "Ruido espacial" #: ../src/backend/filters/transform.cpp:90 msgid "Translate Value" msgstr "Traduce Valor" #: ../src/backend/filters/transform.cpp:91 msgid "Crop Value" msgstr "" #: ../src/backend/filters/transform.cpp:95 msgid "Specify" msgstr "Especifica" #: ../src/backend/filters/transform.cpp:96 msgid "Boundbox Centre" msgstr "Boundbox Centro" #: ../src/backend/filters/transform.cpp:97 msgid "Mass Centre" msgstr "Centro de masa" #: ../src/backend/filters/transform.cpp:1093 msgid "Shuffle" msgstr "Orden aleatorio" #: ../src/backend/filters/transform.cpp:1117 msgid "Splice" msgstr "Reunir" #: ../src/backend/filters/transform.cpp:1159 msgid "Algorithm to use to transform point data" msgstr "" #: ../src/backend/filters/transform.cpp:1174 msgid "Origin mode" msgstr "Modo de origen" #: ../src/backend/filters/transform.cpp:1175 msgid "Select how transform origin is computed" msgstr "" #: ../src/backend/filters/transform.cpp:1180 msgid "Display an interactive object to set transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1182 msgid "Display a small marker to denote transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1184 msgid "Show marker" msgstr "Espectáculo marker" #: ../src/backend/filters/transform.cpp:1199 msgid "Translation" msgstr "Translation" #: ../src/backend/filters/transform.cpp:1200 msgid "Translation vector for transform" msgstr "" #: ../src/backend/filters/transform.cpp:1209 msgid "Offset" msgstr "" #: ../src/backend/filters/transform.cpp:1210 msgid "Scalar to use to offset each point's associated value" msgstr "" #: ../src/backend/filters/transform.cpp:1223 #: ../src/backend/filters/transform.cpp:1241 msgid "Origin of scale transform" msgstr "" #: ../src/backend/filters/transform.cpp:1227 #: ../src/backend/filters/transform.cpp:1245 msgid "Scale Fact." msgstr "Hecho de escala." #: ../src/backend/filters/transform.cpp:1228 #: ../src/backend/filters/transform.cpp:1246 msgid "Enlargement factor for scaling around origin" msgstr "" #: ../src/backend/filters/transform.cpp:1258 msgid "Origin of Rotation" msgstr "" #: ../src/backend/filters/transform.cpp:1262 msgid "Axis around which to revolve" msgstr "" #: ../src/backend/filters/transform.cpp:1265 msgid "Angle (Deg)" msgstr "ángulo (deg)" #: ../src/backend/filters/transform.cpp:1266 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)" msgstr "" #: ../src/backend/filters/transform.cpp:1281 msgid "Noise Type" msgstr "Tipo de ruido" #: ../src/backend/filters/transform.cpp:1282 msgid "Method to use to degrade point data" msgstr "" #: ../src/backend/filters/transform.cpp:1290 msgid "Noise Level" msgstr "" #: ../src/backend/filters/transform.cpp:1291 msgid "Amplitude of applied noise" msgstr "" #: ../src/backend/filters/transform.cpp:1296 msgid "Standard dev." msgstr "Estándar dev." #: ../src/backend/filters/transform.cpp:1297 msgid "Gaussian 1-sigma spread distance" msgstr "" #: ../src/backend/filters/transform.cpp:1313 msgid "Min Value" msgstr "" #: ../src/backend/filters/transform.cpp:1314 msgid "Minimum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1316 msgid "Max Value" msgstr "" #: ../src/backend/filters/transform.cpp:1317 msgid "Maximum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1326 msgid "Transform Params" msgstr "Transforma Params" #: ../src/backend/filters/transform.cpp:1695 msgid "White" msgstr "" #: ../src/backend/filters/transform.cpp:1697 msgid "Gaussian" msgstr "" #: ../src/backend/filters/boundingBox.cpp:64 msgid "Box only" msgstr "" #: ../src/backend/filters/boundingBox.cpp:65 msgid "Tick" msgstr "" #: ../src/backend/filters/boundingBox.cpp:66 msgid "Dimension" msgstr "" #: ../src/backend/filters/boundingBox.cpp:569 msgid "If true, show box, otherwise hide box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:582 msgid "Style" msgstr "" #: ../src/backend/filters/boundingBox.cpp:583 msgid "Box display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:586 msgid "Display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:594 msgid "Fixed Tick Num" msgstr "Fijo Tick Num" #: ../src/backend/filters/boundingBox.cpp:595 msgid "" "If true, evenly use specified number of ticks. Otherwise, use distance to " "determine tick count" msgstr "" #: ../src/backend/filters/boundingBox.cpp:600 msgid "Num X" msgstr "Num X" #: ../src/backend/filters/boundingBox.cpp:600 msgid "Tick count in X direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:603 msgid "Num Y" msgstr "Num Y" #: ../src/backend/filters/boundingBox.cpp:603 msgid "Tick count in Y direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:606 msgid "Num Z" msgstr "Num Z" #: ../src/backend/filters/boundingBox.cpp:606 msgid "Tick count in Z direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Spacing X" msgstr "Espaciando X" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Distance between ticks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Spacing Y" msgstr "Espaciando Y" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Distance between ticks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:617 msgid "Spacing Z" msgstr "Espaciando Z" #: ../src/backend/filters/boundingBox.cpp:617 msgid "Distance between ticks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Ticks X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Display tick marks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Ticks Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Display tick marks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Ticks Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Display tick marks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:633 msgid "Tick marks" msgstr "" #: ../src/backend/filters/boundingBox.cpp:639 msgid "Box Colour" msgstr "Color de caja" #: ../src/backend/filters/boundingBox.cpp:640 msgid "Colour of the bounding box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:644 msgid "Line thickness" msgstr "Grosor de línea" #: ../src/backend/filters/boundingBox.cpp:645 msgid "Thickness of the lines used to draw the box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:651 #: ../src/backend/filters/annotation.cpp:780 msgid "Font Size" msgstr "Tamaño de tipografía" #: ../src/backend/filters/boundingBox.cpp:652 msgid "Relative size for text" msgstr "" #: ../src/backend/filters/boundingBox.cpp:655 msgid "Abs. Coords" msgstr "" #: ../src/backend/filters/boundingBox.cpp:656 msgid "Show labels using absolute co-ordinates" msgstr "" #: ../src/backend/filters/annotation.cpp:80 msgid "Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:86 msgid "Arrow" msgstr "Flecha" #: ../src/backend/filters/annotation.cpp:87 msgid "Text" msgstr "Texto" #: ../src/backend/filters/annotation.cpp:88 msgid "Arrow+Text" msgstr "Texto+de flecha" #: ../src/backend/filters/annotation.cpp:89 msgid "Angle" msgstr "Ángulo" #: ../src/backend/filters/annotation.cpp:90 msgid "Ruler" msgstr "Regla" #: ../src/backend/filters/annotation.cpp:192 ../src/backend/filter.cpp:55 msgid "Draw" msgstr "Sorteo" #: ../src/backend/filters/annotation.cpp:595 msgid "Status" msgstr "" #: ../src/backend/filters/annotation.cpp:608 msgid "Type or style of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 msgid "Text of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:626 msgid "Position of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:629 #: ../src/backend/filters/annotation.cpp:670 #: ../src/backend/filters/annotation.cpp:702 msgid "Up dir" msgstr "Arriba de dir" #: ../src/backend/filters/annotation.cpp:630 #: ../src/backend/filters/annotation.cpp:671 #: ../src/backend/filters/annotation.cpp:703 #: ../src/backend/filters/annotation.cpp:773 msgid "Vector for up direction of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:633 #: ../src/backend/filters/annotation.cpp:673 #: ../src/backend/filters/annotation.cpp:706 msgid "Across dir" msgstr "" #: ../src/backend/filters/annotation.cpp:634 #: ../src/backend/filters/annotation.cpp:674 #: ../src/backend/filters/annotation.cpp:707 #: ../src/backend/filters/annotation.cpp:777 msgid "Reading direction for annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:637 #: ../src/backend/filters/annotation.cpp:666 #: ../src/backend/filters/annotation.cpp:722 msgid "Text size" msgstr "Medida de texto" #: ../src/backend/filters/annotation.cpp:638 #: ../src/backend/filters/annotation.cpp:667 #: ../src/backend/filters/annotation.cpp:723 #: ../src/backend/filters/annotation.cpp:781 msgid "Relative size of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:653 msgid "3D position for tail of arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:658 msgid "3D position to which arrow points" msgstr "" #: ../src/backend/filters/annotation.cpp:663 msgid "Options" msgstr "" #: ../src/backend/filters/annotation.cpp:677 msgid "Arrow radius" msgstr "" #: ../src/backend/filters/annotation.cpp:678 msgid "Size of the arrow head" msgstr "" #: ../src/backend/filters/annotation.cpp:687 msgid "Position A" msgstr "Posición Un" #: ../src/backend/filters/annotation.cpp:688 msgid "Location of first non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:692 msgid "Location of central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:695 msgid "Position B" msgstr "Posición B" #: ../src/backend/filters/annotation.cpp:696 msgid "Location of second non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:710 msgid "Reflexive" msgstr "Reflexive" #: ../src/backend/filters/annotation.cpp:711 msgid "Measure interor (enabled) or exterior angle (disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:714 msgid "Show Angle" msgstr "ángulo de espectáculo" #: ../src/backend/filters/annotation.cpp:715 msgid "Display angle text (when enabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:741 msgid "Digit Format" msgstr "Formato de dígito" #: ../src/backend/filters/annotation.cpp:741 msgid "" "Format of angle text; # for numeral position, '.' for separator, eg ##.## " "gives 12.34" msgstr "" #: ../src/backend/filters/annotation.cpp:747 msgid "Sphere size" msgstr "Sphere Medida" #: ../src/backend/filters/annotation.cpp:748 #: ../src/backend/filters/annotation.cpp:804 msgid "Marker sphere size for manipulating tool" msgstr "" #: ../src/backend/filters/annotation.cpp:760 msgid "Display Style" msgstr "" #: ../src/backend/filters/annotation.cpp:761 msgid "Set the appearance of the ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:765 msgid "Ruler beginning location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:769 msgid "Ruler finish location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:772 msgid "Up direction" msgstr "" #: ../src/backend/filters/annotation.cpp:776 msgid "Across direction" msgstr "" #: ../src/backend/filters/annotation.cpp:784 msgid "Fixed Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:785 msgid "" "Use fixed (enabled) number of text markers, or one every fixed distance " "(disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:790 msgid "Num Ticks" msgstr "Num Ticks" #: ../src/backend/filters/annotation.cpp:791 msgid "Number of tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:796 msgid "Tick Spacing" msgstr "Tick Espaciando" #: ../src/backend/filters/annotation.cpp:797 msgid "Distance between tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:803 msgid "Sphere Size" msgstr "Sphere Medida" #: ../src/backend/filters/annotation.cpp:814 msgid "Colour for ruler and ticks" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:210 msgid "Sampling" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:463 msgid "By Count" msgstr "Por Contar" #: ../src/backend/filters/ionDownsample.cpp:464 msgid "Sample up to a fixed number of ions" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:469 msgid "Per Species" msgstr "Por Especie" #: ../src/backend/filters/ionDownsample.cpp:470 msgid "Use species specific (from ranging) sampling values" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:501 msgid "Sampling value for species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:508 #: ../src/backend/filters/ionInfo.cpp:371 #: ../src/backend/filters/ionInfo.cpp:429 msgid "Unranged" msgstr "Unranged" #: ../src/backend/filters/ionDownsample.cpp:517 #: ../src/backend/filters/ionDownsample.cpp:534 msgid "Sampling rates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:523 msgid "Output Count" msgstr "La Producción Cuenta" #: ../src/backend/filters/ionDownsample.cpp:524 msgid "Sample up to this value of points" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:529 msgid "Out Fraction" msgstr "Fuera de Fracción" #: ../src/backend/filters/ionDownsample.cpp:530 msgid "Sample this fraction of points" msgstr "" #: ../src/backend/filters/ionInfo.cpp:42 msgid "Rectilinear" msgstr "Rectilínea" #: ../src/backend/filters/ionInfo.cpp:43 msgid "Convex hull" msgstr "Convex hull" #: ../src/backend/filters/ionInfo.cpp:226 msgid "No ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:248 msgid "Ion counts" msgstr "" #: ../src/backend/filters/ionInfo.cpp:267 msgid "" "Background fit failed - input data was considered ill formed (gauss-test)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:268 msgid "Following data has not been corrected" msgstr "" #: ../src/backend/filters/ionInfo.cpp:321 msgid "--Counts--" msgstr "--Cuenta--" #: ../src/backend/filters/ionInfo.cpp:333 msgid "Total ranged (without remap)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:335 msgid "Total Ranged\t" msgstr "El Total Abarcó\t" #: ../src/backend/filters/ionInfo.cpp:341 msgid "Total (incl. unranged,without remap)\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:343 msgid "Total (incl. unranged)\t" msgstr "Total (incl. unranged)\t" #: ../src/backend/filters/ionInfo.cpp:361 #: ../src/backend/filters/ionInfo.cpp:415 msgid "n/a" msgstr "" #: ../src/backend/filters/ionInfo.cpp:434 msgid "Unranged ions ignored" msgstr "" #: ../src/backend/filters/ionInfo.cpp:447 msgid "Number of points : " msgstr "Número de puntos : " #: ../src/backend/filters/ionInfo.cpp:459 #: ../src/backend/filters/ionInfo.cpp:661 msgid "Volume" msgstr "Volumen" #: ../src/backend/filters/ionInfo.cpp:480 msgid "Rectilinear Bounds : " msgstr "Rectilinear Bounds : " #: ../src/backend/filters/ionInfo.cpp:485 msgid "Volume (len^3): " msgstr "Volumen (len^3): " #: ../src/backend/filters/ionInfo.cpp:502 msgid "Convex Volume (len^3): " msgstr "Convex Volumen (len^3): " #: ../src/backend/filters/ionInfo.cpp:505 msgid "Unable to compute volume" msgstr "Incapaz de computar volumen" #: ../src/backend/filters/ionInfo.cpp:535 msgid "Ranged Density (pts/vol):" msgstr "Densidad abarcada (pts/vol):" #: ../src/backend/filters/ionInfo.cpp:540 msgid "Total Density (pts/vol):" msgstr "Densidad total (pts/vol):" #: ../src/backend/filters/ionInfo.cpp:568 msgid "Compositions" msgstr "Composiciones" #: ../src/backend/filters/ionInfo.cpp:569 msgid "Display compositional data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:574 msgid "Remap ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:575 msgid "Break up ion counts/compositions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:581 msgid "Remap File" msgstr "" #: ../src/backend/filters/ionInfo.cpp:582 msgid "File describing how ions are to be broken up" msgstr "" #: ../src/backend/filters/ionInfo.cpp:590 msgid "Counts" msgstr "Cuenta" #: ../src/backend/filters/ionInfo.cpp:591 msgid "Display count data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:596 msgid "Ion data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:600 msgid "Normalise count data by totals" msgstr "" #: ../src/backend/filters/ionInfo.cpp:662 msgid "Compute volume for point data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:675 msgid "Select volume counting technique" msgstr "" #: ../src/backend/filters/ionInfo.cpp:678 msgid "Volume data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:63 msgid "Auto" msgstr "" #: ../src/backend/filters/dataLoad.cpp:64 msgid "Little" msgstr "" #: ../src/backend/filters/dataLoad.cpp:65 msgid "Big" msgstr "" #: ../src/backend/filters/dataLoad.cpp:68 msgid "POS Data" msgstr "Dato de POS" #: ../src/backend/filters/dataLoad.cpp:69 msgid "Text Data" msgstr "Dato de texto" #: ../src/backend/filters/dataLoad.cpp:70 msgid "ATO Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:71 msgid "Tapsim Data" msgstr "Tapsim Dato" #: ../src/backend/filters/dataLoad.cpp:72 msgid "3Dap/Posap OPS Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:232 msgid " does not exist" msgstr " No existe" #: ../src/backend/filters/dataLoad.cpp:253 msgid "Reading File" msgstr "" #: ../src/backend/filters/dataLoad.cpp:268 #: ../src/backend/filters/dataLoad.cpp:281 #: ../src/backend/filters/dataLoad.cpp:325 #: ../src/backend/filters/dataLoad.cpp:336 #: ../src/backend/filters/dataLoad.cpp:396 #: ../src/backend/filters/dataLoad.cpp:418 #: ../src/backend/filters/dataLoad.cpp:436 msgid "Error loading file: " msgstr "El Error que carga archivo: " #: ../src/backend/filters/dataLoad.cpp:298 msgid "Sampling is active, loaded " msgstr "" #: ../src/backend/filters/dataLoad.cpp:299 msgid " available." msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 msgid "Loaded entire dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 #: ../src/backend/filters/dataLoad.cpp:406 #: ../src/backend/filters/dataLoad.cpp:428 #: ../src/backend/filters/dataLoad.cpp:446 msgid " points." msgstr "" #: ../src/backend/filters/dataLoad.cpp:351 msgid "" "Data file contained incorrect number of columns -- should be 3 or 4, was " msgstr "" #: ../src/backend/filters/dataLoad.cpp:405 #: ../src/backend/filters/dataLoad.cpp:427 #: ../src/backend/filters/dataLoad.cpp:445 msgid "Loaded dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:477 msgid "" "Warning:One or more bounds of the loaded data approaches the limits of " "numerical stability for the internal data type(magnitude too large). " "Consider rescaling data before loading" msgstr "" "Aviso:Uno o más bounds del dato cargado se acerca los límites de numérico " "stability para el tipo de dato interno(la magnitud demasiado grande). " "Considera rescaling dato antes de cargar" #: ../src/backend/filters/dataLoad.cpp:500 msgid "File from which to load data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:502 msgid "" "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato, *.ops)|*.xml;*.pos;*.txt;*." "csv;*.ato;*.ops|All Files|*" msgstr "" #: ../src/backend/filters/dataLoad.cpp:511 msgid "File type" msgstr "Tipo de fichero" #: ../src/backend/filters/dataLoad.cpp:512 msgid "Type of fil to be loaded" msgstr "" #: ../src/backend/filters/dataLoad.cpp:524 msgid "Entries per point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:525 msgid "Number of decimal values in file per 3D point (normally 4)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:536 msgid "Relative offset of each entry in file for point's X position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:540 msgid "Relative offset of each entry in file for point's Y position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:543 msgid "Z" msgstr "Z" #: ../src/backend/filters/dataLoad.cpp:544 msgid "Relative offset of each entry in file for point's Z position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:548 msgid "" "Relative offset of each entry in file to use for scalar value of 3D point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:564 msgid "File \"Endianness\"" msgstr "" #: ../src/backend/filters/dataLoad.cpp:565 msgid "On-disk data storage format. If file won't load, just try each" msgstr "" #: ../src/backend/filters/dataLoad.cpp:574 msgid "Recon. Width" msgstr "" #: ../src/backend/filters/dataLoad.cpp:575 msgid "" "Width of box onto which to place reconstructed detector hits (similar to tip " "radius)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:579 msgid "Ion Volume" msgstr "" #: ../src/backend/filters/dataLoad.cpp:580 msgid "Effective volume of an ion (incl. free packing volume)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:584 msgid "Det. Efficiency" msgstr "" #: ../src/backend/filters/dataLoad.cpp:585 msgid "" "Effiency of system (ions evaporated towards detector/ions detected by " "detector)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:596 msgid "Value Label" msgstr "Etiqueta de valor" #: ../src/backend/filters/dataLoad.cpp:597 msgid "Name for the scalar value associated with each point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:600 msgid "Format params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Enabled" msgstr "Habilitado" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Load this file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "Sample data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "" "Perform random selection on file contents,instead of loading entire file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:619 msgid "Load Limit (MB)" msgstr "Límite de carga (MB)" #: ../src/backend/filters/dataLoad.cpp:620 msgid "Limit for size of data to load" msgstr "" #: ../src/backend/filters/dataLoad.cpp:626 msgid "Monitor" msgstr "Monitor" #: ../src/backend/filters/dataLoad.cpp:627 msgid "" "Watch file timestamp to track changes to file contents from other programs" msgstr "" #: ../src/backend/filters/dataLoad.cpp:631 msgid "Load params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:638 msgid "Default colour" msgstr "" #: ../src/backend/filters/dataLoad.cpp:639 msgid "Default colour for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/dataLoad.cpp:643 msgid "Draw Size" msgstr "Medida de sorteo" #: ../src/backend/filters/dataLoad.cpp:644 msgid "Default size for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:77 msgid "Maximum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:78 msgid "Max in limit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:171 msgid "Extrema" msgstr "Extrema" #: ../src/backend/filters/spectrumPlot.cpp:220 msgid "count" msgstr "contar" #: ../src/backend/filters/spectrumPlot.cpp:311 msgid "Mixed data" msgstr "Dato mixto" #: ../src/backend/filters/spectrumPlot.cpp:441 msgid "Background fit failed" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:446 msgid "" "Insufficient bins (data points) to perform fit. Try decreasing bin size, or " "expanding range" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:449 msgid "" "Insufficient counts to perform fit. Try expanding range, or increasing " "number of ions" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:452 msgid "Insufficient data to compute Anderson-Darling statistic" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:455 msgid "" "Background noise does not appear to be gaussian-like, ensure range contains " "no peaks" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:472 msgid "Background:" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:529 #: ../src/backend/filters/spectrumPlot.cpp:531 msgid "Relative " msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:534 #: ../src/backend/filters/spectrumPlot.cpp:536 msgid "Probability Density" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:637 msgid "Step size for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:640 msgid "Auto Min/Max" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:641 msgid "Automatically compute spectrum upper and lower bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:647 msgid "Starting position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:651 msgid "Ending position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:658 msgid "Logarithmic" msgstr "Logarítmica" #: ../src/backend/filters/spectrumPlot.cpp:659 msgid "Convert the plot to logarithmic mode" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:669 msgid "Normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:670 msgid "Rescale the plot height, to make inter-spectrum comparisons easier" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:676 msgid "Lower Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:677 msgid "Do not use data below this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:680 msgid "Upper Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:681 msgid "Do not use data above this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:694 msgid "Visual style of plot" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:698 msgid "Colour of plotted spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:713 msgid "Model" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:714 msgid "Background fitting method to use" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:725 msgid "Fit Start" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:726 msgid "Start mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:729 msgid "Fit End" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:730 msgid "End mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:740 msgid "Corr. Only" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:741 msgid "Only show corrected spectrum, not fit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:746 msgid "Background Mode" msgstr "" #: ../src/backend/filters/rangeFile.cpp:121 #: ../src/backend/filters/rangeFile.h:96 msgid "Ranging" msgstr "Abarcando" #: ../src/backend/filters/rangeFile.cpp:562 msgid "File to use for range data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:567 msgid "Drop unranged" msgstr "Gota unranged" #: ../src/backend/filters/rangeFile.cpp:568 msgid "Remove unranged points when generating output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:576 msgid "Legend" msgstr "" #: ../src/backend/filters/rangeFile.cpp:577 msgid "Display colour legend for enabled ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:580 msgid "View" msgstr "" #: ../src/backend/filters/rangeFile.cpp:596 msgid "All Ions" msgstr "Todos los Iones" #: ../src/backend/filters/rangeFile.cpp:597 msgid "Enable/disable all ions at once" msgstr "" #: ../src/backend/filters/rangeFile.cpp:605 msgid "Species" msgstr "" #: ../src/backend/filters/rangeFile.cpp:612 msgid "IonID " msgstr "IonID " #: ../src/backend/filters/rangeFile.cpp:613 msgid "Enable/disable specified ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:625 msgid "Active Ion " msgstr "Ión activo " #: ../src/backend/filters/rangeFile.cpp:627 msgid "If true, ion is used in output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:638 msgid "Colour " msgstr "Colour" #: ../src/backend/filters/rangeFile.cpp:642 msgid "Colour used to represent ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:666 msgid "All Ranges" msgstr "Todas las Gamas" #: ../src/backend/filters/rangeFile.cpp:667 msgid "Enable/disable all ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:682 msgid "Active Rng " msgstr "Activo Rng " #: ../src/backend/filters/rangeFile.cpp:685 msgid "" "Enable/disable specified range (ion must also be enabled to activiate range)" msgstr "" #: ../src/backend/filters/rangeFile.cpp:692 msgid "Ion " msgstr "Ión " #: ../src/backend/filters/rangeFile.cpp:695 msgid "Name of ion associate to this range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:706 msgid "Start rng " msgstr "Inicio rng " #: ../src/backend/filters/rangeFile.cpp:709 msgid "Start value for range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:716 msgid "End rng " msgstr "Fin rng " #: ../src/backend/filters/rangeFile.cpp:719 msgid "Stopping value for range`" msgstr "" #: ../src/backend/state.cpp:170 msgid "" "This file is a \"state\" file for the 3Depict program, and stores " "information about a particular analysis session. This file should be a valid " "\"XML\" file" msgstr "" #: ../src/backend/state.cpp:346 msgid "Failed to allocate parser" msgstr "Fallado a allocate parser" #: ../src/backend/state.cpp:381 msgid "" "Unable to retrieve root node in input state file... Is this really a non-" "empty XML file?" msgstr "" "Incapaz de recuperar nodo de raíz en entrada archivo estatal... Es esto " "realmente un XML no vacío archivo?" #: ../src/backend/state.cpp:388 msgid "Base state node missing. Is this really a state XML file??" msgstr "" "Base el nodo estatal que pierde. Es esto realmente un archivo de XML " "estatal??" #: ../src/backend/state.cpp:417 msgid "State was created by a newer version of this program.. " msgstr "El Estado fue creado por una versión más nueva de este programa.. " #: ../src/backend/state.cpp:418 msgid "file reading will continue, but may fail." msgstr "Lectura de archivo continuará, pero puede fallar." #: ../src/backend/state.cpp:428 msgid "" "Warning, unparseable version number in state file. File reading will " "continue, but may fail" msgstr "" "Aviso, unparseable número de versión en archivo estatal. Lectura de archivo " "continuará, pero puede fallar" #: ../src/backend/state.cpp:437 msgid "Unable to find the \"writer\" node" msgstr "" #: ../src/backend/state.cpp:447 msgid "Unable to find the \"backcolour\" node." msgstr "" #: ../src/backend/state.cpp:455 msgid "\"backcolour\" node missing \"r\" value." msgstr "" #: ../src/backend/state.cpp:460 msgid "Unable to interpret \"backColour\" node's \"r\" value." msgstr "" #: ../src/backend/state.cpp:468 msgid "\"backcolour\" node missing \"g\" value." msgstr "" #: ../src/backend/state.cpp:474 msgid "Unable to interpret \"backColour\" node's \"g\" value." msgstr "" #: ../src/backend/state.cpp:482 msgid "\"backcolour\" node missing \"b\" value." msgstr "" #: ../src/backend/state.cpp:488 msgid "Unable to interpret \"backColour\" node's \"b\" value." msgstr "" #: ../src/backend/state.cpp:495 msgid "\"backcolour\"s rgb values must be in range [0,1]" msgstr "" #: ../src/backend/state.cpp:523 msgid "Unable to find or interpret \"showaxis\" node" msgstr "" #: ../src/backend/state.cpp:567 msgid "Unable to locate \"filtertree\" node." msgstr "" #: ../src/backend/state.cpp:583 msgid "Cameras section missing \"active\" node." msgstr "" #: ../src/backend/state.cpp:591 msgid "Unable to find property \"value\" for \"cameras->active\" node." msgstr "" #: ../src/backend/state.cpp:597 msgid "Unable to interpret property \"value\" for \"cameras->active\" node." msgstr "" #: ../src/backend/state.cpp:617 msgid "Failed to interpret camera state for camera : " msgstr "" #: ../src/backend/state.cpp:625 msgid "Unable to interpret the camera type for camera : " msgstr "" #: ../src/backend/state.cpp:681 msgid "Unable to locate stash name for stash " msgstr "Incapaz de localizar stash nombre para stash " #: ../src/backend/state.cpp:690 msgid "Empty stash name for stash " msgstr "Vacío stash nombre para stash " #: ../src/backend/state.cpp:699 msgid "No filter tree for stash:" msgstr "" #: ../src/backend/state.cpp:705 msgid "For stash " msgstr "Para stash " #: ../src/backend/state.cpp:737 msgid "Unrecognised effect :" msgstr "Unrecognised Efecto :" #: ../src/backend/state.cpp:747 msgid "Duplicate effect found" msgstr "El Efecto duplicado encontró" #: ../src/backend/state.cpp:747 msgid " cannot use." msgstr " No puede utilizar." #: ../src/backend/state.cpp:757 msgid "Error reading effect : " msgstr "Efecto de lectura del error : " #: ../src/backend/state.cpp:977 msgid "-merge" msgstr "-Fusionar" #: ../src/backend/filtertreeAnalyse.cpp:225 msgid "" "Parent filter has no output, but filter requires input -- there is no point " "in placing a child filter here." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:226 msgid "Leaf-only filter with child" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:236 msgid "" "Parent filters' output will be blocked by child, without use. Parent results " "will be dropped." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:237 #: ../src/backend/filtertreeAnalyse.cpp:251 msgid "Bad parent->child pair" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:250 msgid "" "First filter does not output anything useable by child filter. Child filter " "not useful." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:330 msgid "Spatial results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:331 msgid "" "Filters and settings selected that could alter reported results that depend " "upon density. Check to see if spatial sampling may be happening in the " "filter tree - this warning is provisional only." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:399 msgid "Filter needs parent \"" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:400 msgid "" "\" but does not have one. Filter may not function correctly until this " "parent is given." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:401 msgid "Filter missing needed parent" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:432 msgid "Bad range filter settings" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:433 msgid "" "Rangefile set to drop unranged data, however a child filter requires it." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:529 msgid "Filter cannot generate data, but has no input - it is at the tree base." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:530 msgid "Non data-generating filter at root" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:632 msgid "Composition results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:633 msgid "" "Filters and settings selected that could bias reported composition. Check to " "see if species biasing may occcur in the filter tree - this warning is " "provisional only." msgstr "" #: ../src/backend/APT/APTFileIO.cpp:44 ../src/backend/APT/APTFileIO.cpp:79 #: ../src/backend/APT/APTFileIO.cpp:103 ../src/backend/APT/APTFileIO.cpp:123 msgid "Error opening file" msgstr "Error al abrir el archivo" #: ../src/backend/APT/APTFileIO.cpp:45 msgid "Only found header, no data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:46 msgid "Unable to reopen file after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:47 msgid "Error whilst reading file contents" msgstr "Error whilst leyendo contenidos de archivo" #: ../src/backend/APT/APTFileIO.cpp:48 ../src/backend/APT/APTFileIO.cpp:49 msgid "Unexpected file format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:50 msgid "Insufficient memory to continue" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:54 msgid "Memory allocation failure on POS load" msgstr "Fracaso de asignación de la memoria en carga de POS" #: ../src/backend/APT/APTFileIO.cpp:55 msgid "Error opening pos file" msgstr "El Error que abre pos archivo" #: ../src/backend/APT/APTFileIO.cpp:56 msgid "Pos file empty" msgstr "Pos Archiva vacío" #: ../src/backend/APT/APTFileIO.cpp:57 msgid "Pos file size appears to have non-integer number of entries" msgstr "Pos Medida de archivo aparece para tener no-integer número de entradas" #: ../src/backend/APT/APTFileIO.cpp:58 msgid "Error reading from pos file (after open)" msgstr "Lectura de error de pos archivo (después de abierto)" #: ../src/backend/APT/APTFileIO.cpp:59 msgid "Error - Found NaN in pos file" msgstr "Error - Encontrado NaN en pos archivo" #: ../src/backend/APT/APTFileIO.cpp:60 msgid "Error - Found Inf in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:61 msgid "Pos load aborted by interrupt." msgstr "Pos Carga abortado por interrumpir." #: ../src/backend/APT/APTFileIO.cpp:80 msgid "No numerical data found" msgstr "No el dato numérico encontró" #: ../src/backend/APT/APTFileIO.cpp:81 msgid "Error re-opening file, after first scan" msgstr "Error re-abriendo archivo, después de que primer escáner" #: ../src/backend/APT/APTFileIO.cpp:82 msgid "Unable to read file contents after open" msgstr "Incapaz de leer contenidos de archivo después de abierto" #: ../src/backend/APT/APTFileIO.cpp:83 msgid "Error interpreting field in file" msgstr "El Error que interpreta campo en archivo" #: ../src/backend/APT/APTFileIO.cpp:84 msgid "Incorrect number of fields in file" msgstr "Incorrect Número de campos en archivo" #: ../src/backend/APT/APTFileIO.cpp:85 ../src/backend/APT/APTFileIO.cpp:107 msgid "Unable to allocate memory to store data" msgstr "Incapaz a allocate memoria para almacenar dato" #: ../src/backend/APT/APTFileIO.cpp:104 msgid "File is empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:105 msgid "Filesize does not match expected format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:106 msgid "File version number not <4, as expected" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:108 msgid "Unable to detect endian-ness in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:122 #, fuzzy msgid "Error interpreting file contents" msgstr "Error whilst leyendo contenidos de archivo" #: ../src/backend/APT/APTFileIO.cpp:124 #, fuzzy msgid "Aborted opening file" msgstr "Error al abrir el archivo" #: ../src/backend/APT/APTRanges.cpp:48 msgid "Error opening file, check name and permissions." msgstr "Archivo de apertura del error, nombre de control y permisos." #: ../src/backend/APT/APTRanges.cpp:49 msgid "" "Error interpreting range file header, expecting ion count and range count, " "respectively." msgstr "" "El Error que interpreta archivo de gama header, esperando el ión cuenta y la " "gama cuenta, respectivamente." #: ../src/backend/APT/APTRanges.cpp:50 msgid "" "Range file appears to be empty, check file is a proper range file and is not " "empty." msgstr "" "Archivo de gama aparece para ser vacío, archivo de control es un archivo de " "gama propio y no es vacío." #: ../src/backend/APT/APTRanges.cpp:51 msgid "Error reading the long name for ion." msgstr "El Error que lee el nombre largo para ión." #: ../src/backend/APT/APTRanges.cpp:52 msgid "Error reading the short name for ion." msgstr "El Error que lee el nombre corto para ión." #: ../src/backend/APT/APTRanges.cpp:53 msgid "" "Error reading colour data in the file, expecting 3 decimal values, space " "separated." msgstr "" "Dato de color de lectura de error en el archivo, esperando 3 valores " "decimales, el espacio separó." #: ../src/backend/APT/APTRanges.cpp:54 msgid "" "Tried skipping to table separator line (line with dashes), but did not find " "it." msgstr "" "Probado skipping a mesa separator línea (línea con dashes), pero no lo " "encontró." #: ../src/backend/APT/APTRanges.cpp:55 msgid "" "Number of ions in the table header did not match the number specified at the " "start of the file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:56 msgid "" "Unexpected failure whilst trying to skip over range lead-in data (bit before " "range start value)" msgstr "" "Fracaso inesperado whilst probando a skip sobre ventaja de gama-en dato (bit " "antes de valor de inicio de la gama)" #: ../src/backend/APT/APTRanges.cpp:57 msgid "" "Range table had an incorrect number of entries, should be 2 or 3 + number of " "ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:58 msgid "Unable to read range start and end values" msgstr "Incapaz de leer inicio de gama y valores de fin" #: ../src/backend/APT/APTRanges.cpp:59 msgid "Unable to read range table entry" msgstr "Incapaz de leer entrada de mesa de la gama" #: ../src/backend/APT/APTRanges.cpp:60 msgid "" "Error reading file, unexpected format, are you sure it is a proper range " "file?" msgstr "" "Archivo de lectura del error, formato inesperado, te es seguro es un archivo " "de gama propio?" #: ../src/backend/APT/APTRanges.cpp:61 msgid "" "Too many ranges appeared to have range entries with no usable data (eg, all " "blank)" msgstr "" "Demasiadas gamas aparecidas para tener entradas de gama con ningún usable " "dato (eg, todo espacio)" #: ../src/backend/APT/APTRanges.cpp:62 msgid "" "Range file appears to contain malformed data, check things like start and " "ends of m/c are not equal or flipped." msgstr "" "Archivo de gama aparece para contener malformed dato, cosas de control como " "inicio y fines de m/c no es igual o flipped." #: ../src/backend/APT/APTRanges.cpp:63 msgid "Range file appears to be inconsistent (eg, overlapping ranges)" msgstr "Archivo de gama aparece para ser inconsistent (eg, overlapping gamas)" #: ../src/backend/APT/APTRanges.cpp:64 msgid "No ion name mapping found for multiple ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:65 msgid "Polyatomic extension range matches multiple masses in first section" msgstr "" #: ../src/backend/APT/APTRanges.cpp:66 msgid "Range file is exceedingly large. Refusing to open" msgstr "" #: ../src/backend/APT/APTRanges.cpp:68 msgid "Unable to read range table header (aka table separator)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:69 msgid "Unable to read [Ions] contents, should be of form A=B" msgstr "" #: ../src/backend/APT/APTRanges.cpp:70 msgid "Unable to parse number of ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:71 msgid "Number of ions seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:72 msgid "Too many ions in ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:73 msgid "Found ranges block before ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:74 msgid "Number of ranges seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:75 msgid "Unable to read number of ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:76 msgid "Range line was too short, needs 4 entries per line, minimum" msgstr "" #: ../src/backend/APT/APTRanges.cpp:77 msgid "Range line missing required \":\" separator" msgstr "" #: ../src/backend/APT/APTRanges.cpp:79 msgid "Range colour incorrect size, should be 6 bytes" msgstr "" #: ../src/backend/APT/APTRanges.cpp:80 msgid "Range specified as named ion, but ion not found in [Ions] block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:81 msgid "Range had unreadable start value" msgstr "" #: ../src/backend/APT/APTRanges.cpp:82 msgid "Range had unreadable endvalue" msgstr "" #: ../src/backend/APT/APTRanges.cpp:83 msgid "Range name was empty" msgstr "" #: ../src/backend/APT/APTRanges.cpp:84 msgid "Range block had unparsable line, should start with number or range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:85 msgid "Ion block missing" msgstr "" #: ../src/backend/APT/APTRanges.cpp:86 msgid "No ranges found" msgstr "" #: ../src/backend/APT/APTRanges.cpp:87 msgid "Unable to identify the number of basic ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:88 msgid "" "Number of ranges specfied in range block, did not match number of ranges read" msgstr "" #: ../src/backend/APT/APTRanges.cpp:89 msgid "Range block contained line that did not match A=xxx format" msgstr "" #: ../src/backend/APT/APTRanges.cpp:90 msgid "Range had unreadable ion multiplicity" msgstr "" #: ../src/backend/APT/APTRanges.cpp:91 msgid "Unable to read volume from range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:1459 msgid "" "Range headings do not match order of the ions listed in the name " "specifications. The name specification ordering will be used when reading " "the range table, as the range heading section is declared as a comment in " "the file-format specifications, and is not to be intepreted by this program. " "Check range-species associations actually match what you expect." msgstr "" #: ../src/backend/filter.cpp:54 msgid "2D Plot" msgstr "" #: ../src/backend/filter.cpp:56 msgid "Range" msgstr "Rango" #: ../src/backend/filter.cpp:57 msgid "Voxel" msgstr "Voxel" #: ../src/backend/filters/transform.h:71 msgid "Ion. Transform" msgstr "Ión. Transforma" #: ../src/backend/filters/ionColour.h:66 msgid "Spectral Colour" msgstr "" #: ../src/backend/filters/boundingBox.h:76 msgid "Bound box" msgstr "Caja ligada" #: ../src/backend/filters/ionDownsample.h:84 msgid "Ion Sampler" msgstr "Ión Sampler" #: ../src/backend/filters/profile.h:131 msgid "Comp. Prof." msgstr "Comp. Prof." #: ../src/backend/filters/ionInfo.h:117 msgid "Ion info" msgstr "Ión info" #: ../src/backend/filters/dataLoad.h:148 msgid "Pos Data" msgstr "Pos Dato" #: ../src/backend/filters/externalProgram.h:69 msgid "Ext. Program" msgstr "Ext. Programa" #: ../data/startup-tips.txt:5 msgid "" "You can reset the main view by tapping the space bar. Hold down modifier " "keys like shift,ctrl to change the axis. Double tap to switch which axis to " "look the other way (+ve or -ve direction)" msgstr "" #: ../data/startup-tips.txt:6 msgid "" "You can delete filters from the tree by selecting them, then tapping delete?" msgstr "" #: ../data/startup-tips.txt:7 msgid "" "Multiple languages are supported? You can translate the program into your " "own language at https://www.transifex.com/projects/p/3depict/" msgstr "" #: ../data/startup-tips.txt:8 msgid "" "Package files can be easily shared to allow others to view your analysis, " "using the File->Export->Package menu item. This will automatically import " "all referenced files (eg pos/rng files) into a single shareable folder" msgstr "" #: ../data/startup-tips.txt:9 msgid "" "You can export plots to SVG \"Vector\" format, for easier editing - edit " "your plots in inkscape!" msgstr "" #: ../data/startup-tips.txt:10 msgid "You can access the manual from the Help menu" msgstr "" #: ../data/startup-tips.txt:11 msgid "You can change filter defaults using the Edit->Preferences menu item" msgstr "" #: ../data/startup-tips.txt:12 msgid "" "You can overlay multiple plots at once, by selecting more than on plot at a " "time (e.g. using Ctrl)" msgstr "" #: ../data/startup-tips.txt:13 msgid "" "Calculations are much faster (more than linear speedup) when working with " "smaller datasets - try sampling, or clipping out a small region to work " "faster, then remove the sampling when you are ready" msgstr "" #: ../data/startup-tips.txt:14 msgid "" "You can abort most calculations either by pressing Escape (OSX/Linux), or by " "using the Abort button (Windows)" msgstr "" #: ../data/startup-tips.txt:15 msgid "" "That anyone can contribute to improving this program, even without knowing " "about computer programming? Reporting bugs helps us to prioritise our work, " "and directs us to fix real problems for all users" msgstr "" #: ../data/startup-tips.txt:16 msgid "" "You can load more than one file at a time, then either operate on them " "separately, or together" msgstr "" #: ../data/startup-tips.txt:17 msgid "" "You can have more than one range file for different parts of your dataset" msgstr "" #: ../data/startup-tips.txt:18 msgid "" "Cameras can be saved and retrieved whenever you like, using the camera tab" msgstr "" #: ../data/startup-tips.txt:19 msgid "" "Subsections of the filter tree can be saved to the \"Stashed filters\" drop-" "down" msgstr "" #: ../data/startup-tips.txt:20 msgid "" "The console tab along the bottom often shows useful messages from filters. " "When new messages appear, a small symbol is shown on the tab" msgstr "" #: ../data/startup-tips.txt:21 msgid "" "The raw data used for any plot can be accessed from the \"Raw\" tab on the " "bottom panel" msgstr "" #: ../data/startup-tips.txt:22 msgid "" "You can ask questions about the program, or using it on your data via our " "forums (https://sourceforge.net/p/threedepict/discussion/general/)" msgstr "" #: ../data/startup-tips.txt:23 msgid "" "By creating a camera, you can switch between orthographic (parallel) and " "perspective views" msgstr "" #: ../data/startup-tips.txt:24 msgid "" "You can open multiple files at once, and get a side-by-side view by " "translating (shifting) one of the datasets to one side" msgstr "" #: ../data/startup-tips.txt:25 msgid "" "From version 0.0.20, vector values in filter properties (e.g. \"(1,0,0)\") " "can be specified using ISO 31-11 spherical coordinates using the following " "notation , with angles in degrees" msgstr "" #: ../data/startup-tips.txt:26 msgid "" "You can change the behavior of filter dragging by holding Ctrl (mac: cmd) or " "Shift whilst dragging? This switches between move, copy and \"splice" msgstr "" #: ../data/startup-tips.txt:27 msgid "" "We like to know where we are being helpful? Please consider writing the " "program and version number in any work you might publish - whether in print " "or online. Alternatively, link to our website, or write to us to let us know " "we helped!" msgstr "" #: ../data/startup-tips.txt:28 msgid "" "You can merge files by placing two \"Pos Data\" filters in series, then " "saving the result?" msgstr "" #: ../data/startup-tips.txt:29 msgid "" "When using the camera 3D cropping tool, you can hold Shift to only move the " "centre node in one axis (up/down or left/right).)" msgstr "" #~ msgid "Save...\tCtrl+S" #~ msgstr "&Salva\tCtrl+S" #~ msgid "" #~ "3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*." #~ "pos|XML State File (*.xml)|*.xml|All Files (*)|*" #~ msgstr "" #~ "3Describe archivo (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|Archivo de POS " #~ "(*.pos)|*.pos|XML Archivo Estatal (*.xml)|*.xml|Todos los Archivos (*)|*" #~ msgid "POS Data (*.pos)|*.pos|All Files (*)|*" #~ msgstr "Dato de POS (*.pos)|*.pos|Todos los Archivos (*)|*" #~ msgid "Bin width y" #~ msgstr "Ancho de cubo y" #~ msgid "Bin width z" #~ msgstr "Ancho de cubo z" #~ msgid "Num bins x" #~ msgstr "Num Cubos x" #~ msgid "Num bins y" #~ msgstr "Num Cubos y" #~ msgid "Num bins z" #~ msgstr "Num Cubos z" #~ msgid "Mass-to-Charge (amu/e)" #~ msgstr "Masa-a-Cargo (amu/e)" #~ msgid "Origin " #~ msgstr "Origen" #~ msgid "Pre-Allocate" #~ msgstr "Pre-Allocate" 3Depict-0.0.22/translations/3Depict_base.pot0000644000175000017500000043402713414412454020220 0ustar pcuserpcuser# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-06 14:48+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gl/cameras.cpp:585 msgid "Lock" msgstr "" #: ../src/gl/cameras.cpp:592 ../src/backend/filters/ionClip.cpp:516 #: ../src/backend/filters/ionClip.cpp:530 #: ../src/backend/filters/ionClip.cpp:546 #: ../src/backend/filters/ionClip.cpp:567 #: ../src/backend/filters/profile.cpp:1097 #: ../src/backend/filters/profile.cpp:1118 #: ../src/backend/filters/transform.cpp:1222 #: ../src/backend/filters/transform.cpp:1240 #: ../src/backend/filters/transform.cpp:1257 #: ../src/backend/filters/annotation.cpp:625 #: ../src/backend/filters/annotation.cpp:691 msgid "Origin" msgstr "" #: ../src/gl/cameras.cpp:600 ../src/backend/filters/spatialAnalysis.cpp:936 msgid "Target" msgstr "" #: ../src/gl/cameras.cpp:606 msgid "Up Dir." msgstr "" #: ../src/gl/cameras.cpp:614 ../src/gl/cameras.cpp:717 msgid "Perspective" msgstr "" #: ../src/gl/cameras.cpp:616 ../src/gl/cameras.cpp:719 #: ../src/gui/mainFrame.cpp:5762 msgid "Orthogonal" msgstr "" #: ../src/gl/cameras.cpp:620 msgid "Projection" msgstr "" #: ../src/gl/cameras.cpp:629 msgid "Field of View (deg)" msgstr "" #: ../src/gl/cameras.cpp:635 msgid "View size" msgstr "" #: ../src/wx/wxcomponents.cpp:189 msgid "Save Data..." msgstr "" #: ../src/wx/wxcomponents.cpp:190 msgid "Text File (*.txt)|*.txt|All Files (*)|*" msgstr "" #: ../src/wx/wxcomponents.cpp:202 msgid "Error saving file. Check output dir is writable." msgstr "" #: ../src/wx/wxcomponents.cpp:202 ../src/gui/dialogs/ExportRngDialog.cpp:187 #: ../src/gui/mainFrame.cpp:1555 ../src/gui/mainFrame.cpp:1680 #: ../src/gui/mainFrame.cpp:1729 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2410 ../src/gui/mainFrame.cpp:2483 #: ../src/gui/mainFrame.cpp:2586 ../src/gui/mainFrame.cpp:2845 msgid "Save error" msgstr "" #: ../src/common/basics.cpp:183 msgid "in the future?" msgstr "" #: ../src/common/basics.cpp:234 msgid "a decade ago" msgstr "" #: ../src/common/basics.cpp:235 msgid "a year ago" msgstr "" #: ../src/common/basics.cpp:236 msgid "a month ago" msgstr "" #: ../src/common/basics.cpp:237 msgid "a week ago" msgstr "" #: ../src/common/basics.cpp:238 msgid "a day ago" msgstr "" #: ../src/common/basics.cpp:239 msgid "an hour ago" msgstr "" #: ../src/common/basics.cpp:240 msgid "45 minutes ago" msgstr "" #: ../src/common/basics.cpp:241 msgid "30 minutes ago" msgstr "" #: ../src/common/basics.cpp:242 msgid "20 minutes ago" msgstr "" #: ../src/common/basics.cpp:243 msgid "15 minutes ago" msgstr "" #: ../src/common/basics.cpp:244 msgid "10 minutes ago" msgstr "" #: ../src/common/basics.cpp:245 msgid "5 minutes ago" msgstr "" #: ../src/common/basics.cpp:246 msgid "a minute ago" msgstr "" #: ../src/common/basics.cpp:247 msgid "30 seconds ago" msgstr "" #: ../src/common/basics.cpp:248 msgid "10 seconds ago" msgstr "" #: ../src/common/basics.cpp:249 msgid "a second ago" msgstr "" #: ../src/common/basics.cpp:254 msgid "a few decades ago" msgstr "" #: ../src/common/basics.cpp:255 msgid "a few years ago" msgstr "" #: ../src/common/basics.cpp:256 msgid "a few months ago" msgstr "" #: ../src/common/basics.cpp:257 msgid "a few weeks ago" msgstr "" #: ../src/common/basics.cpp:258 msgid "a few days ago" msgstr "" #: ../src/common/basics.cpp:259 msgid "a few hours ago" msgstr "" #: ../src/common/basics.cpp:262 msgid "tens of minutes ago" msgstr "" #: ../src/common/basics.cpp:266 msgid "a few minutes ago" msgstr "" #: ../src/common/basics.cpp:269 msgid "a few seconds ago" msgstr "" #: ../src/common/basics.cpp:296 msgid "moments ago" msgstr "" #: ../src/common/colourmap.cpp:307 msgid "Jet" msgstr "" #: ../src/common/colourmap.cpp:308 msgid "Hot" msgstr "" #: ../src/common/colourmap.cpp:309 msgid "Cold" msgstr "" #: ../src/common/colourmap.cpp:310 msgid "Grey" msgstr "" #: ../src/common/colourmap.cpp:311 msgid "Cyclic" msgstr "" #: ../src/common/colourmap.cpp:312 msgid "General" msgstr "" #: ../src/common/colourmap.cpp:313 #: ../src/gui/dialogs/transferFuncDialog.cpp:765 msgid "Blue" msgstr "" #: ../src/common/colourmap.cpp:314 msgid "Pseudo-Random" msgstr "" #: ../src/common/colourmap.cpp:315 msgid "Inferno" msgstr "" #: ../src/common/colourmap.cpp:316 msgid "Viridis" msgstr "" #: ../src/common/constants.cpp:21 msgid "" "Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG " "File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*." "rrng)|*.rrng;*.RRNG|All Files (*)|*" msgstr "" #: ../src/gui/glPane.cpp:642 msgid "Use shift/ctrl-space or double tap to alter reset axis" msgstr "" #: ../src/gui/glPane.cpp:939 msgid "Image progress" msgstr "" #: ../src/gui/glPane.cpp:940 msgid "Rendering tiles..." msgstr "" #: ../src/gui/glPane.cpp:1133 msgid "Animation progress" msgstr "" #: ../src/gui/glPane.cpp:1134 msgid "Rendering sequence..." msgstr "" #: ../src/gui/glPane.cpp:1172 msgid "Saving Image " msgstr "" #: ../src/gui/glPane.cpp:1172 ../src/gui/mainFrame.cpp:4829 #: ../src/gui/mainFrame.cpp:4833 ../src/gui/mainFrame.cpp:4846 #: ../src/backend/filters/dataLoad.cpp:299 msgid " of " msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:40 msgid "Range Sources" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:42 msgid "Details" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:53 msgid "Source Filter" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:54 #: ../src/backend/filters/spatialAnalysis.cpp:1059 #: ../src/backend/filters/rangeFile.cpp:649 msgid "Ions" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:55 #: ../src/gui/dialogs/rangeEditDialog.cpp:1585 #: ../src/backend/filters/voxelise.cpp:781 #: ../src/backend/filters/rangeFile.cpp:725 msgid "Ranges" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:88 msgid "Param" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:89 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352 #: ../src/gui/dialogs/animateFilterDialog.cpp:1199 #: ../src/backend/filters/dataLoad.cpp:547 msgid "Value" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:90 msgid "Value2" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:97 msgid "Ion Name" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:98 msgid "Num Ranges" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:116 #: ../src/gui/dialogs/rangeEditDialog.cpp:694 ../src/backend/filter.cpp:52 msgid "Ion" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:117 msgid "Range Start" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:118 msgid "Range end" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2521 msgid "Save pos..." msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:152 msgid "" "Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV " "(*.env)|*.env|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:184 ../src/gui/mainFrame.cpp:1555 #: ../src/gui/mainFrame.cpp:1730 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2411 ../src/gui/mainFrame.cpp:2587 #: ../src/gui/mainFrame.cpp:2846 msgid "Unable to save. Check output destination can be written to." msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:253 msgid "Export Range" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:258 msgid "List of rangefiles in filter tree" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:260 msgid "Detailed view of selected range" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:221 msgid "Show Overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:246 msgid "e.g. H2O" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:559 #: ../src/gui/dialogs/rangeEditDialog.cpp:693 ../src/gui/mainFrame.cpp:6428 #: ../src/backend/filter.cpp:53 msgid "Plot" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:560 msgid "Short Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:561 msgid "Long Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:562 #: ../src/gui/dialogs/transferFuncDialog.cpp:767 #: ../src/backend/filters/filterCommon.cpp:528 #: ../src/backend/filters/filterCommon.cpp:531 #: ../src/backend/filters/profile.cpp:1197 #: ../src/backend/filters/annotation.cpp:813 #: ../src/backend/filters/spectrumPlot.cpp:697 msgid "Colour" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:695 #: ../src/backend/filters/annotation.cpp:652 #: ../src/backend/filters/annotation.cpp:764 msgid "Start" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:696 #: ../src/backend/filters/annotation.cpp:657 #: ../src/backend/filters/annotation.cpp:768 msgid "End" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1258 msgid "Range or ion?" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1259 msgid "Select type to add" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1540 msgid "Range Editor" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1544 msgid "Enable or disable all overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1545 msgid "Entered overlays, use delete to remove" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1546 msgid "Available plots for ranging" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1547 msgid "Enter species to display as overlay, e.g. SiO2" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1548 msgid "Editable ranges" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1549 msgid "Editable ions" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1584 #: ../src/gui/dialogs/animateFilterDialog.cpp:177 msgid "Plots" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1586 msgid "Overlay" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:39 msgid "Remove &All" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:123 msgid "Restore state?" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:133 msgid "Multiple autosave states were found; would you like to restore one?" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:37 ../src/backend/filter.cpp:618 #: ../src/backend/filter.cpp:621 msgid "Error" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:39 msgid "Warning" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:42 #: ../src/gui/dialogs/filterErrorDialog.cpp:52 msgid "Filter Errors" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:759 #: ../src/backend/filters/spectrumPlot.cpp:650 msgid "Max" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:760 #: ../src/backend/filters/spectrumPlot.cpp:646 msgid "Min" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:762 msgid "Traces" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:763 msgid "Red" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:764 msgid "Green" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:766 #: ../src/backend/filters/ionColour.cpp:314 msgid "Opacity" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:770 #: ../src/backend/filters/filterCommon.cpp:699 msgid "Transfer Function" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:823 msgid "Transfer Function Editor" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:826 msgid "Colour chosen by moving selected node up-down" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:828 msgid "Drag nodes to move, click to add nodes" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:830 msgid "Final colour scale" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:835 msgid "Adjust node group's colour" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:836 msgid "Remove the selected node" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:847 msgid "Node Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:49 msgid "Stashes" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:52 msgid "Stashed Tree" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:54 msgid "Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:60 msgid "Stash Name" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:61 msgid "Filter Count" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:94 msgid "Stashed Trees" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:97 msgid "Erase stashed item" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:98 msgid "Filter view for current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:99 msgid "Settings for selected filter in current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:100 msgid "Available stashes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:45 msgid "Start Frame: " msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:47 msgid "From File" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:50 msgid "From Table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350 #: ../src/gui/dialogs/animateFilterDialog.cpp:197 msgid "Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240 msgid "Select text file..." msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241 msgid "Text files (*.txt)|*.txt;|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342 msgid "String Keyframes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344 msgid "Frame at which to start string sequence" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345 msgid "Frame offset for data start" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346 msgid "File to use as string data source, one value per row" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347 msgid "Select file to use as data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348 msgid "Use table below for data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355 msgid "Remove selected strings from table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356 msgid "Abort value selection and return to previous window" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357 msgid "Accept data values" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:60 msgid "Keyframe Data" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:61 msgid "Transition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64 msgid "Step" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:65 msgid "Ramp" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:68 #: ../src/gui/dialogs/animateFilterDialog.cpp:1181 msgid "Start Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:70 #: ../src/gui/dialogs/animateFilterDialog.cpp:1182 msgid "End Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:73 msgid "Initial Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:74 msgid "startColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:75 msgid "Final Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:76 msgid "endColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:250 msgid "Key Frame : Colour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:252 msgid "Colour at the start of the transtition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:253 msgid "Colour at end of transition" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:92 msgid "Cameca/Ametek RRNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:93 msgid "Oak-Ridge RNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:94 msgid "Cameca/Ametek ENV" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:156 msgid "Key frames" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:157 msgid "Output Data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:158 msgid "Filters and properties" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:164 msgid "Dir : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:167 msgid "Output only when refresh required" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:169 msgid "Data Types:" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:170 msgid "3D Images" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:171 msgid "File Prefix: " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:173 msgid "Size : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:175 msgid "..." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:176 msgid "Point data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:178 msgid "Voxel data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:179 msgid "Range files" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:180 msgid "Format" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 msgid "transition frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 ../src/gui/mainFrame.cpp:1782 msgid "Frame count" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:771 msgid "Key frame : Colour" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:826 msgid "File existed, but was unable to read or interpret file contents." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:827 msgid "String load failed" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:848 msgid "Keyframe : decimal" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:857 msgid "Keyframe : integer" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:866 msgid "Keyframe : 3D Point" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:994 msgid "Select or create new folder" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1174 msgid "Export Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1175 msgid "Select filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1176 msgid "Select property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1178 #: ../src/gui/dialogs/animateFilterDialog.cpp:1197 msgid "Filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1179 #: ../src/gui/dialogs/animateFilterDialog.cpp:1198 msgid "Property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1180 #: ../src/backend/filters/spatialAnalysis.cpp:1103 #: ../src/backend/filters/transform.cpp:1158 #: ../src/backend/filters/annotation.cpp:607 #: ../src/backend/filters/annotation.cpp:611 #: ../src/backend/filters/ionDownsample.cpp:475 msgid "Mode" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1183 msgid "Keyframe table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1184 msgid "Remove the selected keyframe from the table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1185 msgid "Enter where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1186 msgid "Browse to directory where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1188 msgid "" "Title for files, result will be saved as #-name.png, where # is image number." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1189 msgid "Target resolution (image size)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1190 msgid "Select frame for property display" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1191 msgid "Enter frame number to change frame (eg 1/20)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1192 msgid "Save point data (POS files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1193 msgid "Save plots (as text files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1194 msgid "Save voxel data (raw files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1195 msgid "Save range files in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1200 msgid "Animation parameters for current frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1201 msgid "Abort animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1202 msgid "Run Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1273 msgid "Filter view" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1274 msgid "Frame view" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:45 msgid "Width :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:47 msgid "Height :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:50 #: ../src/gui/dialogs/prefDialog.cpp:85 msgid "Reset" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:336 msgid "Resolution Selection" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:63 msgid "Export:" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:64 #: ../src/backend/filters/boundingBox.cpp:568 msgid "Visible" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:65 msgid "Selected Data" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:67 msgid "Available Data" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:73 msgid "Selection" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:98 ../src/gui/dialogs/ExportPos.cpp:101 msgid "Index" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:99 ../src/gui/dialogs/ExportPos.cpp:102 #: ../src/backend/filters/spatialAnalysis.cpp:2653 #: ../src/backend/filters/spatialAnalysis.cpp:2749 #: ../src/backend/filters/spatialAnalysis.cpp:2812 #: ../src/backend/filters/spatialAnalysis.cpp:3608 #: ../src/backend/filters/spatialAnalysis.cpp:3894 #: ../src/backend/filters/profile.cpp:644 #: ../src/backend/filters/spectrumPlot.cpp:65 msgid "Count" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:444 msgid "Export Pos Data" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:447 msgid "Tree of filters, select leaves to show ion data." msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:449 msgid "Add all data from all filters" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:450 msgid "Add all data from currently selected filter" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:451 msgid "Add selected data from currently selected filter" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:73 msgid "Panel Display" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:75 msgid "Online Updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:77 ../src/gui/dialogs/prefDialog.cpp:577 msgid "Startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:78 msgid "Camera Speed" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:79 msgid "Available Filters" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:84 msgid "Reset All" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:87 msgid "Show all panels" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:88 msgid "Remember last" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:89 msgid "Show Selected" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:92 msgid "Control Pane" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:93 msgid "Raw Data Panel" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:94 ../src/gui/mainFrame.cpp:744 msgid "Plot List" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:96 msgid "Periodically notify about available updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:98 msgid "Prefer orthographic at startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:99 msgid "Move Rate" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104 msgid "(slow)" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:102 ../src/gui/dialogs/prefDialog.cpp:106 msgid "(fast)" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:103 msgid "Zoom Rate" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:433 msgid "Show all panels when starting program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:436 msgid "Show panels visible at last shutdown when starting program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:443 msgid "Show selected panels when starting program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:492 msgid "Preferences" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:494 msgid "Set the method of panel layout when starting the program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:497 msgid "" "Lets the program check the internet to see if updates to the program version " "are available, then notifies you about updates now and again." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:499 msgid "" "By default, use an orthographic camera at startup. State files will override " "this preference." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:500 msgid "Camera translation, orbit and swivel rates. " msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:501 msgid "Camera zooming rate." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:503 msgid "Reset the filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:504 msgid "Reset all filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:576 msgid "Filt. Default" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:578 msgid "Camera" msgstr "" #: ../src/gui/mainFrame.cpp:123 msgid "New camera name..." msgstr "" #: ../src/gui/mainFrame.cpp:124 msgid "New stash name..." msgstr "" #: ../src/gui/mainFrame.cpp:129 msgid "New Filter..." msgstr "" #: ../src/gui/mainFrame.cpp:146 ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 #: ../src/backend/filters/annotation.h:102 msgid "Annotation" msgstr "" #: ../src/gui/mainFrame.cpp:147 msgid "Bounding Box" msgstr "" #: ../src/gui/mainFrame.cpp:148 ../src/backend/filters/ionClip.cpp:581 #: ../src/backend/filters/ionClip.h:66 msgid "Clipping" msgstr "" #: ../src/gui/mainFrame.cpp:149 ../src/backend/filters/clusterAnalysis.h:151 msgid "Cluster Analysis" msgstr "" #: ../src/gui/mainFrame.cpp:150 msgid "Compos. Profiles" msgstr "" #: ../src/gui/mainFrame.cpp:151 msgid "Downsampling" msgstr "" #: ../src/gui/mainFrame.cpp:152 msgid "Extern. Prog." msgstr "" #: ../src/gui/mainFrame.cpp:153 msgid "Ion Colour" msgstr "" #: ../src/gui/mainFrame.cpp:154 msgid "Ion Info" msgstr "" #: ../src/gui/mainFrame.cpp:155 msgid "Ion Transform" msgstr "" #: ../src/gui/mainFrame.cpp:156 ../src/backend/filters/spectrumPlot.h:78 msgid "Spectrum" msgstr "" #: ../src/gui/mainFrame.cpp:157 msgid "Range File" msgstr "" #: ../src/gui/mainFrame.cpp:158 ../src/backend/filters/spatialAnalysis.h:228 msgid "Spat. Analysis" msgstr "" #: ../src/gui/mainFrame.cpp:159 ../src/backend/filters/voxelise.h:102 msgid "Voxelisation" msgstr "" #: ../src/gui/mainFrame.cpp:160 ../src/backend/filters/voxelLoad.h:86 msgid "Voxel Load" msgstr "" #: ../src/gui/mainFrame.cpp:411 msgid "XML State File (*.xml)" msgstr "" #: ../src/gui/mainFrame.cpp:412 msgid "POS File (*.pos)" msgstr "" #: ../src/gui/mainFrame.cpp:413 msgid "LAWATAP ATO File (*.ato)" msgstr "" #: ../src/gui/mainFrame.cpp:414 msgid "Text File (*.txt, *.csv)" msgstr "" #: ../src/gui/mainFrame.cpp:415 msgid "3Dap Files (*.ops)" msgstr "" #: ../src/gui/mainFrame.cpp:416 msgid "VTK rectangular grids (*.vtk)" msgstr "" #: ../src/gui/mainFrame.cpp:417 msgid "Raw Binary files (*.raw)" msgstr "" #: ../src/gui/mainFrame.cpp:418 msgid "All Files (*)" msgstr "" #: ../src/gui/mainFrame.cpp:496 msgid "OpenGL Failed" msgstr "" #: ../src/gui/mainFrame.cpp:497 ../src/gui/mainFrame.cpp:499 msgid "" "Unable to initialise the openGL (3D) panel. Program cannot start. Please " "check your video drivers." msgstr "" #: ../src/gui/mainFrame.cpp:522 msgid "&Open...\tCtrl+O" msgstr "" #: ../src/gui/mainFrame.cpp:522 msgid "Open state file" msgstr "" #: ../src/gui/mainFrame.cpp:523 msgid "&Merge...\tCtrl+Shift+O" msgstr "" #: ../src/gui/mainFrame.cpp:523 msgid "Merge other file" msgstr "" #: ../src/gui/mainFrame.cpp:527 msgid "&Recent" msgstr "" #: ../src/gui/mainFrame.cpp:528 msgid "&Save\tCtrl+S" msgstr "" #: ../src/gui/mainFrame.cpp:528 msgid "Save state to file" msgstr "" #: ../src/gui/mainFrame.cpp:530 msgid "Save &As...\tCtrl+Shift+S" msgstr "" #: ../src/gui/mainFrame.cpp:530 msgid "Save current state to new file" msgstr "" #: ../src/gui/mainFrame.cpp:533 msgid "&Plot...\tCtrl+P" msgstr "" #: ../src/gui/mainFrame.cpp:533 msgid "Export Current Plot" msgstr "" #: ../src/gui/mainFrame.cpp:534 msgid "&Image...\tCtrl+I" msgstr "" #: ../src/gui/mainFrame.cpp:534 msgid "Export Current 3D View" msgstr "" #: ../src/gui/mainFrame.cpp:535 msgid "Ion&s...\tCtrl+N" msgstr "" #: ../src/gui/mainFrame.cpp:535 msgid "Export Ion Data" msgstr "" #: ../src/gui/mainFrame.cpp:536 msgid "Ran&ges...\tCtrl+G" msgstr "" #: ../src/gui/mainFrame.cpp:536 msgid "Export Range Data" msgstr "" #: ../src/gui/mainFrame.cpp:537 msgid "&Voxels...\tCtrl+Shift+V" msgstr "" #: ../src/gui/mainFrame.cpp:537 msgid "Export Voxel Data" msgstr "" #: ../src/gui/mainFrame.cpp:539 msgid "&Animate Filters...\tCtrl+T" msgstr "" #: ../src/gui/mainFrame.cpp:539 msgid "Export Animated Filter" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Ani&mate Camera...\tCtrl+M" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Export Animated Camera" msgstr "" #: ../src/gui/mainFrame.cpp:541 msgid "Pac&kage...\tCtrl+K" msgstr "" #: ../src/gui/mainFrame.cpp:541 msgid "Export analysis package" msgstr "" #: ../src/gui/mainFrame.cpp:543 msgid "&Export" msgstr "" #: ../src/gui/mainFrame.cpp:546 msgid "&Quit\tCtrl+Q" msgstr "" #: ../src/gui/mainFrame.cpp:546 ../src/gui/mainFrame.cpp:548 msgid "Exit Program" msgstr "" #: ../src/gui/mainFrame.cpp:548 msgid "E&xit" msgstr "" #: ../src/gui/mainFrame.cpp:550 msgid "&File" msgstr "" #: ../src/gui/mainFrame.cpp:554 msgid "&Background Colour...\tCtrl+B" msgstr "" #: ../src/gui/mainFrame.cpp:554 msgid "Change background colour" msgstr "" #: ../src/gui/mainFrame.cpp:558 msgid "&Control Pane\tF2" msgstr "" #: ../src/gui/mainFrame.cpp:558 ../src/gui/mainFrame.cpp:561 msgid "Toggle left control pane" msgstr "" #: ../src/gui/mainFrame.cpp:561 msgid "&Control Pane\tAlt+C" msgstr "" #: ../src/gui/mainFrame.cpp:567 msgid "&Raw Data Pane\tF3" msgstr "" #: ../src/gui/mainFrame.cpp:567 ../src/gui/mainFrame.cpp:570 msgid "Toggle raw data pane (bottom)" msgstr "" #: ../src/gui/mainFrame.cpp:570 msgid "&Raw Data Pane\tAlt+R" msgstr "" #: ../src/gui/mainFrame.cpp:574 msgid "&Plot List\tF4" msgstr "" #: ../src/gui/mainFrame.cpp:574 ../src/gui/mainFrame.cpp:576 msgid "Toggle plot list" msgstr "" #: ../src/gui/mainFrame.cpp:576 msgid "&Plot List\tAlt+P" msgstr "" #: ../src/gui/mainFrame.cpp:582 msgid "&Legend\tCtrl+L" msgstr "" #: ../src/gui/mainFrame.cpp:582 msgid "Toggle Legend display" msgstr "" #: ../src/gui/mainFrame.cpp:584 msgid "P&lot..." msgstr "" #: ../src/gui/mainFrame.cpp:585 msgid "&Axis\tCtrl+Shift+I" msgstr "" #: ../src/gui/mainFrame.cpp:585 msgid "Toggle World Axis display" msgstr "" #: ../src/gui/mainFrame.cpp:590 msgid "&Fullscreen mode\tF11" msgstr "" #: ../src/gui/mainFrame.cpp:590 ../src/gui/mainFrame.cpp:592 msgid "Next fullscreen mode: with toolbars" msgstr "" #: ../src/gui/mainFrame.cpp:592 msgid "&Fullscreen mode\tCtrl+Shift+F" msgstr "" #: ../src/gui/mainFrame.cpp:597 msgid "&Undo\tCtrl+Z" msgstr "" #: ../src/gui/mainFrame.cpp:599 msgid "&Redo\tCtrl+Y" msgstr "" #: ../src/gui/mainFrame.cpp:602 msgid "&Range" msgstr "" #: ../src/gui/mainFrame.cpp:605 msgid "&Preferences" msgstr "" #: ../src/gui/mainFrame.cpp:607 msgid "&Edit" msgstr "" #: ../src/gui/mainFrame.cpp:610 msgid "&View" msgstr "" #: ../src/gui/mainFrame.cpp:612 msgid "&Help...\tCtrl+H" msgstr "" #: ../src/gui/mainFrame.cpp:612 msgid "Show help files and documentation" msgstr "" #: ../src/gui/mainFrame.cpp:613 msgid "&Contact..." msgstr "" #: ../src/gui/mainFrame.cpp:613 msgid "Open contact page" msgstr "" #: ../src/gui/mainFrame.cpp:615 msgid "&About..." msgstr "" #: ../src/gui/mainFrame.cpp:615 msgid "Information about this program" msgstr "" #: ../src/gui/mainFrame.cpp:616 msgid "&Help" msgstr "" #: ../src/gui/mainFrame.cpp:618 msgid "Stashed Filters" msgstr "" #: ../src/gui/mainFrame.cpp:623 msgid "New Filters" msgstr "" #: ../src/gui/mainFrame.cpp:653 msgid "Auto Refresh" msgstr "" #: ../src/gui/mainFrame.cpp:659 msgid "Filter settings" msgstr "" #: ../src/gui/mainFrame.cpp:662 msgid "Camera Name" msgstr "" #: ../src/gui/mainFrame.cpp:674 msgid "Resize to Fit" msgstr "" #: ../src/gui/mainFrame.cpp:675 msgid "Rotate View" msgstr "" #: ../src/gui/mainFrame.cpp:676 msgid "Rotate +" msgstr "" #: ../src/gui/mainFrame.cpp:677 msgid "Rotate-" msgstr "" #: ../src/gui/mainFrame.cpp:680 msgid "3D Post-processing" msgstr "" #: ../src/gui/mainFrame.cpp:682 msgid "Enable Cropping" msgstr "" #: ../src/gui/mainFrame.cpp:684 ../src/gui/mainFrame.cpp:695 msgid "x-y" msgstr "" #: ../src/gui/mainFrame.cpp:685 ../src/gui/mainFrame.cpp:696 msgid "x-z" msgstr "" #: ../src/gui/mainFrame.cpp:686 ../src/gui/mainFrame.cpp:697 msgid "y-x" msgstr "" #: ../src/gui/mainFrame.cpp:687 ../src/gui/mainFrame.cpp:698 msgid "y-z" msgstr "" #: ../src/gui/mainFrame.cpp:688 ../src/gui/mainFrame.cpp:699 msgid "z-x" msgstr "" #: ../src/gui/mainFrame.cpp:689 ../src/gui/mainFrame.cpp:700 msgid "z-y" msgstr "" #: ../src/gui/mainFrame.cpp:704 msgid "Use camera coordinates" msgstr "" #: ../src/gui/mainFrame.cpp:705 msgid "dX" msgstr "" #: ../src/gui/mainFrame.cpp:707 msgid "dY" msgstr "" #: ../src/gui/mainFrame.cpp:709 msgid "dZ" msgstr "" #: ../src/gui/mainFrame.cpp:711 msgid "Enable Anaglyphic Stereo" msgstr "" #: ../src/gui/mainFrame.cpp:712 msgid "Flip Channels" msgstr "" #: ../src/gui/mainFrame.cpp:713 msgid "Anaglyph Mode" msgstr "" #: ../src/gui/mainFrame.cpp:715 msgid "Red-Blue" msgstr "" #: ../src/gui/mainFrame.cpp:716 msgid "Red-Green" msgstr "" #: ../src/gui/mainFrame.cpp:717 msgid "Red-Cyan" msgstr "" #: ../src/gui/mainFrame.cpp:718 msgid "Green-Magenta" msgstr "" #: ../src/gui/mainFrame.cpp:722 msgid "Baseline Separation" msgstr "" #: ../src/gui/mainFrame.cpp:724 ../src/backend/filters/filterCommon.cpp:744 #: ../src/backend/filters/profile.cpp:1203 #: ../src/backend/filters/boundingBox.cpp:660 #: ../src/backend/filters/dataLoad.cpp:647 #: ../src/backend/filters/spectrumPlot.cpp:701 msgid "Appearance" msgstr "" #: ../src/gui/mainFrame.cpp:725 msgid "Smooth && translucent objects" msgstr "" #: ../src/gui/mainFrame.cpp:727 msgid "3D lighting" msgstr "" #: ../src/gui/mainFrame.cpp:730 msgid "Performance" msgstr "" #: ../src/gui/mainFrame.cpp:731 msgid "Fast and weak randomisation." msgstr "" #: ../src/gui/mainFrame.cpp:733 msgid "Limit Output Pts" msgstr "" #: ../src/gui/mainFrame.cpp:738 msgid "Filter caching" msgstr "" #: ../src/gui/mainFrame.cpp:740 msgid "Max. Ram usage (%)" msgstr "" #: ../src/gui/mainFrame.cpp:812 msgid "Warning: Your configuration file appears to be invalid:\n" msgstr "" #: ../src/gui/mainFrame.cpp:813 msgid "\tConfig Load: " msgstr "" #: ../src/gui/mainFrame.cpp:1127 msgid "Current state has not been saved, would you like to save it now?" msgstr "" #: ../src/gui/mainFrame.cpp:1128 msgid "State changed" msgstr "" #: ../src/gui/mainFrame.cpp:1150 ../src/gui/mainFrame.cpp:1202 msgid "Select Data or State File..." msgstr "" #: ../src/gui/mainFrame.cpp:1214 msgid "Merged file." msgstr "" #: ../src/gui/mainFrame.cpp:1317 msgid "Tip: You can use ⌘ (command) to merge" msgstr "" #: ../src/gui/mainFrame.cpp:1319 msgid "Tip: You can use ctrl to merge" msgstr "" #: ../src/gui/mainFrame.cpp:1353 msgid "Load error" msgstr "" #: ../src/gui/mainFrame.cpp:1354 msgid "" "Error loading state file.\n" "See console for more info." msgstr "" #: ../src/gui/mainFrame.cpp:1362 msgid "" "This state file contains filters that can be unsafe to run\n" "Do you wish to remove these before continuing?." msgstr "" #: ../src/gui/mainFrame.cpp:1363 msgid "Security warning" msgstr "" #: ../src/gui/mainFrame.cpp:1576 ../src/gui/mainFrame.cpp:1672 #: ../src/gui/mainFrame.cpp:2125 msgid "Unable to save" msgstr "" #: ../src/gui/mainFrame.cpp:1577 msgid "No plot available. Please create a plot before exporting." msgstr "" #: ../src/gui/mainFrame.cpp:1581 msgid "Save plot..." msgstr "" #: ../src/gui/mainFrame.cpp:1582 msgid "" "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*." "svg|PNG File (*.png)|*.png|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:1636 msgid "Select type for save" msgstr "" #: ../src/gui/mainFrame.cpp:1637 msgid "Choose file type" msgstr "" #: ../src/gui/mainFrame.cpp:1657 ../src/gui/mainFrame.cpp:1714 #: ../src/gui/mainFrame.cpp:1750 msgid "Choose resolution" msgstr "" #: ../src/gui/mainFrame.cpp:1673 msgid "Unknown file extension. Please use \"svg\" or \"png\"" msgstr "" #: ../src/gui/mainFrame.cpp:1684 msgid "Saved plot: " msgstr "" #: ../src/gui/mainFrame.cpp:1691 ../src/gui/mainFrame.cpp:1743 msgid "Save Image..." msgstr "" #: ../src/gui/mainFrame.cpp:1692 ../src/gui/mainFrame.cpp:1744 msgid "PNG File (*.png)|*.png|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:1706 msgid "File already exists. Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1707 ../src/gui/mainFrame.cpp:2551 #: ../src/gui/mainFrame.cpp:2803 ../src/gui/mainFrame.cpp:2826 msgid "Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1734 ../src/gui/mainFrame.cpp:1810 msgid "Saved 3D View :" msgstr "" #: ../src/gui/mainFrame.cpp:1764 msgid "Program limitation" msgstr "" #: ../src/gui/mainFrame.cpp:1765 msgid "" "Limitation on the screenshot dimension; please ensure that both width and " "height exceed the initial values,\n" " or that they are smaller than the initial values.\n" " If this bothers, please submit a bug." msgstr "" #: ../src/gui/mainFrame.cpp:1782 msgid "Number of frames" msgstr "" #: ../src/gui/mainFrame.cpp:1839 msgid "Abo&rt" msgstr "" #: ../src/gui/mainFrame.cpp:1841 msgid "&Refresh" msgstr "" #: ../src/gui/mainFrame.cpp:1966 msgid "Cannot animate with no filters." msgstr "" #: ../src/gui/mainFrame.cpp:2048 msgid "Animating" msgstr "" #: ../src/gui/mainFrame.cpp:2049 msgid "Performing refresh" msgstr "" #: ../src/gui/mainFrame.cpp:2075 msgid "Filter property change failed" msgstr "" #: ../src/gui/mainFrame.cpp:2097 msgid "Refresh failed on frame :" msgstr "" #: ../src/gui/mainFrame.cpp:2126 msgid "Image save failed for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2151 msgid "Ion save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2152 msgid "Unable to save ions for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2187 ../src/gui/mainFrame.cpp:2205 msgid "Plot save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2188 ../src/gui/mainFrame.cpp:2206 msgid "Unable to save plot or frame " msgstr "" #: ../src/gui/mainFrame.cpp:2255 msgid "Range save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2256 msgid "Unable to save range for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2285 msgid "Voxel save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2286 msgid "Unable to save voxels for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2315 msgid "Animate failed" msgstr "" #: ../src/gui/mainFrame.cpp:2339 ../src/gui/mainFrame.cpp:2505 #: ../src/gui/mainFrame.cpp:2612 ../src/gui/mainFrame.cpp:2639 msgid "No filters means no data to export" msgstr "" #: ../src/gui/mainFrame.cpp:2353 msgid "Package name" msgstr "" #: ../src/gui/mainFrame.cpp:2354 msgid "Package directory name" msgstr "" #: ../src/gui/mainFrame.cpp:2356 msgid "AnalysisPackage" msgstr "" #: ../src/gui/mainFrame.cpp:2369 msgid "Package folder already exists, won't overwrite." msgstr "" #: ../src/gui/mainFrame.cpp:2370 msgid "Not available" msgstr "" #: ../src/gui/mainFrame.cpp:2395 msgid "" "Package folder creation failed\n" "check writing to this location is possible." msgstr "" #: ../src/gui/mainFrame.cpp:2396 msgid "Folder creation failed" msgstr "" #: ../src/gui/mainFrame.cpp:2416 msgid "Copying" msgstr "" #: ../src/gui/mainFrame.cpp:2417 msgid "Copying referenced files" msgstr "" #: ../src/gui/mainFrame.cpp:2483 msgid "Error copying file" msgstr "" #: ../src/gui/mainFrame.cpp:2492 msgid "Saved package: " msgstr "" #: ../src/gui/mainFrame.cpp:2516 msgid "Export" msgstr "" #: ../src/gui/mainFrame.cpp:2522 msgid "" "POS Data (*.pos)|*.pos|Text File (*.txt)|*.txt|VTK Legacy (*.vtk)|*.vtk|All " "Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2550 ../src/gui/mainFrame.cpp:2802 msgid "File already exists, overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:2591 msgid "Saved ions: " msgstr "" #: ../src/gui/mainFrame.cpp:2616 msgid "Export Ranges" msgstr "" #: ../src/gui/mainFrame.cpp:2652 msgid "No voxel filters" msgstr "" #: ../src/gui/mainFrame.cpp:2698 msgid "Select voxels..." msgstr "" #: ../src/gui/mainFrame.cpp:2705 msgid "Save voxels..." msgstr "" #: ../src/gui/mainFrame.cpp:2706 msgid "" "Raw Binary Data (float32) (*.raw)|*.raw|VTK Legacy (*.vtk)|*.vtk|All Files " "(*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2763 msgid "Exported voxels" msgstr "" #: ../src/gui/mainFrame.cpp:2767 msgid " (VTK format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2772 msgid " (RAW format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2784 msgid "Save state..." msgstr "" #: ../src/gui/mainFrame.cpp:2785 msgid "XML state file (*.xml)|*.xml|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2825 msgid "Files have been referred to using relative paths. Keep relative paths?" msgstr "" #: ../src/gui/mainFrame.cpp:2858 msgid "Saved state: " msgstr "" #: ../src/gui/mainFrame.cpp:2934 msgid "Range editor" msgstr "" #: ../src/gui/mainFrame.cpp:3202 msgid "Manual not found locally. Launching web browser" msgstr "" #: ../src/gui/mainFrame.cpp:3211 msgid "Opening contact page in external web browser" msgstr "" #: ../src/gui/mainFrame.cpp:3219 msgid "No filter stashes to edit." msgstr "" #: ../src/gui/mainFrame.cpp:3223 msgid "Filter Stashes" msgstr "" #: ../src/gui/mainFrame.cpp:3240 msgid "Quick and dirty analysis for point data." msgstr "" #: ../src/gui/mainFrame.cpp:3250 msgid "Compiled with wx Version: " msgstr "" #: ../src/gui/mainFrame.cpp:3271 msgid "Press enter to store new stash" msgstr "" #: ../src/gui/mainFrame.cpp:3277 msgid "Press enter to restore stash" msgstr "" #: ../src/gui/mainFrame.cpp:3310 msgid "Unable to create stash, selection invalid" msgstr "" #: ../src/gui/mainFrame.cpp:3317 msgid "Created new filter tree stash" msgstr "" #: ../src/gui/mainFrame.cpp:3426 msgid "Filter type not a data source - can't be at tree base" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete\tDel" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3639 msgid "Moving - Hold ⌘ (command) to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3641 msgid "Moving - Hold control to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3835 ../src/gui/mainFrame.cpp:4234 msgid "" "Filter settings are experimental. Program may be unstable when using this " "filter." msgstr "" #: ../src/gui/mainFrame.cpp:3994 msgid "Press enter to store new camera" msgstr "" #: ../src/gui/mainFrame.cpp:3996 msgid "Press enter to restore camera" msgstr "" #: ../src/gui/mainFrame.cpp:4021 ../src/gui/mainFrame.cpp:4062 msgid "Restored camera: " msgstr "" #: ../src/gui/mainFrame.cpp:4039 msgid "Stored camera: " msgstr "" #: ../src/gui/mainFrame.cpp:4144 msgid "Select an item from the filter tree before choosing a new filter" msgstr "" #: ../src/gui/mainFrame.cpp:4146 msgid "Load data source (file->open) before choosing a new filter" msgstr "" #: ../src/gui/mainFrame.cpp:4161 msgid "Select RNG File..." msgstr "" #: ../src/gui/mainFrame.cpp:4182 msgid "Failed reading range file." msgstr "" #: ../src/gui/mainFrame.cpp:4186 msgid "Error loading file" msgstr "" #: ../src/gui/mainFrame.cpp:4254 ../src/gui/mainFrame.cpp:4354 #: ../src/gui/mainFrame.cpp:5900 ../src/gui/mainFrame.cpp:6430 msgid "Cons." msgstr "" #: ../src/gui/mainFrame.cpp:4318 msgid "Refresh Aborted." msgstr "" #: ../src/gui/mainFrame.cpp:4358 msgid "*Cons." msgstr "" #: ../src/gui/mainFrame.cpp:4360 msgid "§Cons." msgstr "" #: ../src/gui/mainFrame.cpp:4422 msgid "Complete" msgstr "" #: ../src/gui/mainFrame.cpp:4520 msgid "msgs" msgstr "" #: ../src/gui/mainFrame.cpp:4561 msgid "Autosave complete." msgstr "" #: ../src/gui/mainFrame.cpp:4775 msgid "Aborting...." msgstr "" #: ../src/gui/mainFrame.cpp:4844 msgid "Updated." msgstr "" #: ../src/gui/mainFrame.cpp:4853 msgid "Calculating..." msgstr "" #: ../src/gui/mainFrame.cpp:4856 msgid "% Done (Esc aborts)" msgstr "" #: ../src/gui/mainFrame.cpp:4858 msgid "% Done" msgstr "" #: ../src/gui/mainFrame.cpp:5133 msgid "Tip: You can shift-click to force full refresh, if required" msgstr "" #: ../src/gui/mainFrame.cpp:5195 msgid "No data to save" msgstr "" #: ../src/gui/mainFrame.cpp:5383 msgid "Aborting..." msgstr "" #: ../src/gui/mainFrame.cpp:5389 msgid "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " msgstr "" #: ../src/gui/mainFrame.cpp:5390 ../src/gui/mainFrame.cpp:5410 msgid "Confirmation request" msgstr "" #: ../src/gui/mainFrame.cpp:5409 msgid "Are you sure you wish to exit 3Depict?" msgstr "" #: ../src/gui/mainFrame.cpp:5928 msgid "Update Notice: New version " msgstr "" #: ../src/gui/mainFrame.cpp:5928 msgid " found online." msgstr "" #: ../src/gui/mainFrame.cpp:5932 msgid "Online Check: " msgstr "" #: ../src/gui/mainFrame.cpp:5932 msgid " is up-to-date." msgstr "" #: ../src/gui/mainFrame.cpp:6022 msgid "An auto-save state was found, would you like to restore it?." msgstr "" #: ../src/gui/mainFrame.cpp:6023 msgid "Autosave" msgstr "" #: ../src/gui/mainFrame.cpp:6030 msgid "Unable to load autosave file.." msgstr "" #: ../src/gui/mainFrame.cpp:6221 msgid "List of available filters" msgstr "" #: ../src/gui/mainFrame.cpp:6223 msgid "" "Tree - drag to move items, hold ⌘ for copy, shift for splice. Tap delete to " "remove items, multi-click to rename" msgstr "" #: ../src/gui/mainFrame.cpp:6225 msgid "" "Tree - drag to move items, hold Ctrl for copy, shift for splice. Tap delete " "to remove items, multi-click to rename." msgstr "" #: ../src/gui/mainFrame.cpp:6227 msgid "" "Enable/Disable automatic updates of data when filter change takes effect" msgstr "" #: ../src/gui/mainFrame.cpp:6230 msgid "" "Enable/Disable \"Alpha blending\" (transparency) in rendering system. " "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") " "and to make transparent surfaces. Disabling will provide faster rendering " "but look more blocky" msgstr "" #: ../src/gui/mainFrame.cpp:6231 msgid "" "Enable/Disable lighting calculations in rendering, for objects that request " "this. Lighting provides important depth cues for objects comprised of 3D " "surfaces. Disabling may allow faster rendering in complex scenes" msgstr "" #: ../src/gui/mainFrame.cpp:6232 msgid "" "Enable/Disable weak randomisation (Galois linear feedback shift register). " "Strong randomisation uses a much slower random selection method, but " "provides better protection against inadvertent correlations, and is " "recommended for final analyses" msgstr "" #: ../src/gui/mainFrame.cpp:6234 msgid "" "Limit the number of points that can be displayed in the 3D scene. Does not " "affect filter tree calculations. Disabling this can severely reduce " "performance, due to large numbers of points being visible at once." msgstr "" #: ../src/gui/mainFrame.cpp:6235 msgid "" "Enable/Disable caching of intermediate results during filter updates. " "Disabling caching will use less system RAM, though changes to any filter " "property will cause the entire filter tree to be recomputed, greatly slowing " "computations" msgstr "" #: ../src/gui/mainFrame.cpp:6237 msgid "Camera data information" msgstr "" #: ../src/gui/mainFrame.cpp:6238 ../src/gui/mainFrame.cpp:6239 #: ../src/gui/mainFrame.cpp:6240 ../src/gui/mainFrame.cpp:6241 #: ../src/gui/mainFrame.cpp:6242 ../src/gui/mainFrame.cpp:6243 msgid "Align camera view to this axis" msgstr "" #: ../src/gui/mainFrame.cpp:6244 msgid "Resize view to fit 3D data" msgstr "" #: ../src/gui/mainFrame.cpp:6245 msgid "Rotate view in the +ve direction (anti-clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6246 msgid "Rotate view cin the -ve direction (clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6247 msgid "Step size in degrees for rotation" msgstr "" #: ../src/gui/mainFrame.cpp:6251 msgid "Enable/disable visual effects on final 3D output" msgstr "" #: ../src/gui/mainFrame.cpp:6253 msgid "Enable cropping post-process effect" msgstr "" #: ../src/gui/mainFrame.cpp:6256 msgid "" "Colour based 3D effect enable/disable - requires appropriate colour filter " "3D glasses." msgstr "" #: ../src/gui/mainFrame.cpp:6257 msgid "Glasses colour mode" msgstr "" #: ../src/gui/mainFrame.cpp:6259 msgid "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" msgstr "" #: ../src/gui/mainFrame.cpp:6263 ../src/backend/filters/dataLoad.cpp:535 msgid "X" msgstr "" #: ../src/gui/mainFrame.cpp:6264 ../src/backend/filters/dataLoad.cpp:539 msgid "Y" msgstr "" #: ../src/gui/mainFrame.cpp:6265 msgid "Save raw data to file" msgstr "" #: ../src/gui/mainFrame.cpp:6266 msgid "Copy raw data to clipboard" msgstr "" #: ../src/gui/mainFrame.cpp:6267 msgid "Manage \"stashed\" data." msgstr "" #: ../src/gui/mainFrame.cpp:6268 msgid "Program text output" msgstr "" #: ../src/gui/mainFrame.cpp:6269 msgid "Select active camera, or type to create new named camera" msgstr "" #: ../src/gui/mainFrame.cpp:6270 msgid "Remove the selected camera" msgstr "" #: ../src/gui/mainFrame.cpp:6271 msgid "Perform cropping from coordinate frame of camera" msgstr "" #: ../src/gui/mainFrame.cpp:6272 msgid "" "Set the maximum amount of RAM to use in order to speed repeat computations" msgstr "" #: ../src/gui/mainFrame.cpp:6273 msgid "Collapse the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:6274 msgid "Expand the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:6275 msgid "Process the filter tree, hold shift to purge cached filter data" msgstr "" #: ../src/gui/mainFrame.cpp:6390 msgid "Crop" msgstr "" #: ../src/gui/mainFrame.cpp:6391 msgid "Stereo" msgstr "" #: ../src/gui/mainFrame.cpp:6408 ../src/backend/filters/externalProgram.cpp:586 #: ../src/backend/filters/ionColour.cpp:336 #: ../src/backend/filters/spectrumPlot.cpp:655 msgid "Data" msgstr "" #: ../src/gui/mainFrame.cpp:6409 msgid "Cam" msgstr "" #: ../src/gui/mainFrame.cpp:6410 msgid "Post" msgstr "" #: ../src/gui/mainFrame.cpp:6411 msgid "Tools" msgstr "" #: ../src/gui/mainFrame.cpp:6429 msgid "Raw" msgstr "" #: ../src/gui/mainFrame.cpp:6473 msgid "Align Camera" msgstr "" #: ../src/gui/mathglPane.cpp:263 msgid "No plots selected." msgstr "" #: ../src/gui/mathglPane.cpp:1233 msgid "" "Unable to allocate requested memory.\n" " Try a lower resolution, or save as vector (SVG)." msgstr "" #: ../src/gui/mathglPane.cpp:1235 msgid "Plotting functions returned an error:\n" msgstr "" #: ../src/gui/mathglPane.cpp:1237 msgid "File readback check failed" msgstr "" #: ../src/gui/mathglPane.cpp:1239 msgid "Filesize during readback appears to be zero." msgstr "" #: ../src/3Depict.cpp:424 msgid "File : " msgstr "" #: ../src/3Depict.cpp:424 msgid " does not exist. Skipping" msgstr "" #: ../src/backend/configFile.cpp:188 msgid "Config file present, but is not valid (root node test)" msgstr "" #: ../src/backend/configFile.cpp:229 msgid "Unable to interpret recent file entry" msgstr "" #: ../src/backend/configFile.cpp:269 msgid "Unable to determine filter type in defaults listing." msgstr "" #: ../src/backend/configFile.cpp:630 msgid "Online access for non win32/apple platforms is intentionally disabled, " msgstr "" #: ../src/backend/configFile.cpp:631 msgid "" "regardless of the settings you use here. Use your package manager to keep up-" "to-date" msgstr "" #: ../src/backend/plot.cpp:28 ../src/backend/filters/algorithms/mass.cpp:27 #: ../src/backend/filters/voxelise.cpp:104 #: ../src/backend/filters/filterCommon.cpp:66 #: ../src/backend/filters/spectrumPlot.cpp:76 msgid "None" msgstr "" #: ../src/backend/plot.cpp:29 msgid "Moving avg." msgstr "" #: ../src/backend/plot.cpp:33 msgid "Lines" msgstr "" #: ../src/backend/plot.cpp:34 msgid "Bars" msgstr "" #: ../src/backend/plot.cpp:35 msgid "Steps" msgstr "" #: ../src/backend/plot.cpp:36 msgid "Stem" msgstr "" #: ../src/backend/plot.cpp:37 msgid "Points" msgstr "" #: ../src/backend/plot.cpp:39 msgid "Density" msgstr "" #: ../src/backend/plot.cpp:40 msgid "Scatter" msgstr "" #: ../src/backend/plot.cpp:788 ../src/backend/plot.cpp:796 msgid "Multiple data types" msgstr "" #: ../src/backend/plot.cpp:1662 msgid "error" msgstr "" #: ../src/backend/plot.cpp:1967 msgid "Amplitude" msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid "WARNING: Skipping node " msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid " as it was not recognised" msgstr "" #: ../src/backend/filtertree.cpp:1189 msgid "Error processing node: " msgstr "" #: ../src/backend/filters/externalProgram.cpp:264 msgid "Collate Input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:353 msgid "Execute" msgstr "" #: ../src/backend/filters/externalProgram.cpp:394 msgid "Collate output" msgstr "" #: ../src/backend/filters/externalProgram.cpp:567 #: ../src/backend/filters/externalProgram.cpp:575 msgid "Command" msgstr "" #: ../src/backend/filters/externalProgram.cpp:568 msgid "" "Full command to send to operating system. See manual for escape sequence " "meanings" msgstr "" #: ../src/backend/filters/externalProgram.cpp:571 msgid "Work Dir" msgstr "" #: ../src/backend/filters/externalProgram.cpp:572 msgid "Directory to run the command in" msgstr "" #: ../src/backend/filters/externalProgram.cpp:578 msgid "Cleanup input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:579 msgid "Erase input files when command completed" msgstr "" #: ../src/backend/filters/externalProgram.cpp:582 msgid "Cache" msgstr "" #: ../src/backend/filters/externalProgram.cpp:583 msgid "" "Assume program does not alter its output, unless inputs from 3Depict are " "altered" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:41 msgid "VTK (ascii)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:42 msgid "raw binary (float32)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:86 #: ../src/backend/filters/spatialAnalysis.cpp:584 msgid "Load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:150 #: ../src/backend/filters/dataLoad.cpp:499 #: ../src/backend/filters/dataLoad.cpp:515 #: ../src/backend/filters/rangeFile.cpp:561 #: ../src/backend/filters/rangeFile.cpp:571 msgid "File" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:151 msgid "Set the data file to load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:153 msgid "VTK Files (*.vtk)|*.vtk" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:165 msgid "File Type" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:166 msgid "Type of data that file contains" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:169 #: ../src/backend/filters/annotation.cpp:588 msgid "Enable" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:170 #: ../src/backend/filters/annotation.cpp:589 msgid "Enable/disable annotation" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:173 msgid "Data source" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:179 msgid "Specify bounds" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:180 msgid "Manually specify the bounding box" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:185 msgid "Lower corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:186 msgid "Position of lower bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:189 msgid "Upper corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:190 msgid "Position of upper bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:193 #: ../src/backend/filters/annotation.cpp:699 msgid "Positioning" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:28 msgid "Flat TOF" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:35 msgid "INsufficient bins to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:36 msgid "Insufficient counts to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:37 msgid "Insufficient data to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:38 msgid "Data did not appear to be random noise - cannot fit noise level" msgstr "" #: ../src/backend/filters/ionClip.cpp:65 ../src/backend/filters/profile.cpp:55 msgid "Sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:66 msgid "Plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:67 msgid "Cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:68 msgid "Aligned box" msgstr "" #: ../src/backend/filters/ionClip.cpp:497 #: ../src/backend/filters/profile.cpp:1081 msgid "Primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:498 msgid "Shape of clipping object" msgstr "" #: ../src/backend/filters/ionClip.cpp:501 #: ../src/backend/filters/profile.cpp:1086 msgid "Show Primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:502 msgid "Display the 3D interaction object" msgstr "" #: ../src/backend/filters/ionClip.cpp:505 msgid "Invert Clip" msgstr "" #: ../src/backend/filters/ionClip.cpp:506 msgid "" "Switch between retaining points inside (disabled) and outside (enabled) of " "primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:517 #: ../src/backend/filters/profile.cpp:1119 msgid "Position for centre of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:520 #: ../src/backend/filters/spatialAnalysis.cpp:144 #: ../src/backend/filters/profile.cpp:1107 #: ../src/backend/filters/profile.cpp:1122 msgid "Radius" msgstr "" #: ../src/backend/filters/ionClip.cpp:521 #: ../src/backend/filters/profile.cpp:1123 msgid "Radius of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:531 msgid "Position that plane passes through" msgstr "" #: ../src/backend/filters/ionClip.cpp:534 msgid "Plane Normal" msgstr "" #: ../src/backend/filters/ionClip.cpp:535 msgid "Perpendicular direction for plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:547 msgid "Centre of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:550 #: ../src/backend/filters/spatialAnalysis.cpp:989 #: ../src/backend/filters/profile.cpp:1100 #: ../src/backend/filters/transform.cpp:1261 msgid "Axis" msgstr "" #: ../src/backend/filters/ionClip.cpp:551 msgid "Positive vector for cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:554 msgid "Lock Axis Mag." msgstr "" #: ../src/backend/filters/ionClip.cpp:555 msgid "Prevent changing length of cylinder during 3D interaction" msgstr "" #: ../src/backend/filters/ionClip.cpp:558 msgid "Radius." msgstr "" #: ../src/backend/filters/ionClip.cpp:559 #: ../src/backend/filters/profile.cpp:1108 msgid "Radius of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:568 msgid "Centre of Aligned Box" msgstr "" #: ../src/backend/filters/ionClip.cpp:571 msgid "Corner offset" msgstr "" #: ../src/backend/filters/ionClip.cpp:572 msgid "Vector to corner of box" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:84 #: ../src/backend/filters/clusterAnalysis.cpp:1025 msgid "Size Distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:85 msgid "Chemistry Distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:504 msgid "No range data. Can't cluster." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:515 msgid "" "No ranges selected for cluster \"core\". Cannot continue with clustering." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:524 msgid "" "No ranges selected for cluster \"bulk\". Cannot continue with clustering." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:696 msgid "Morphology Plot" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:697 msgid "\\lambda_1:\\lambda_2 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:698 msgid "\\lambda_2:\\lambda_3 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:699 msgid "Cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:744 msgid "No clusters had sufficient dimensionality to compute singular values" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:802 msgid "Found :" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:804 msgid " clusters" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:899 msgid "Compositions (fractional, core+bulk)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:901 msgid "Compositions (fractional, core only)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:919 msgid "Frequencies (core+bulk)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:950 msgid "Core Link + Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:953 #: ../src/backend/filters/clusterAnalysis.cpp:957 #: ../src/backend/filters/spatialAnalysis.cpp:804 #: ../src/backend/filters/spatialAnalysis.cpp:809 #: ../src/backend/filters/transform.cpp:1163 #: ../src/backend/filters/ionInfo.cpp:674 msgid "Algorithm" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:954 msgid "Cluster algorithm mode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:964 msgid "Core Classify" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:965 msgid "" "Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:970 msgid "Core Classify Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:971 msgid "Restrict only atoms joind by this distance to be cluster sources" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:974 msgid "Classify Knn Max" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:975 msgid "" "Require that the kth NN (this number) is within the classify distance, to be " "a cluster source" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:979 msgid "Core Link Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:980 msgid "Distance between clusters to allow linking" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:983 msgid "Bulk Link" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:984 msgid "Enable linking of non-cluster species - eg for composition analysis" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:989 msgid "Bulk Link (Envelope) dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:990 msgid "" "Distance from core points, that form a cluster, used to grab surrounding " "bulk points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:993 msgid "Erosion" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:994 msgid "" "Enable removal of edge bulk atoms, to remove \"cloud\" of atoms beyond the " "nominal cluster limits (hole-closing halo)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:999 msgid "Erode Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1000 msgid "" "Distance from unclustered material in which bulk points are eroded from " "cluster" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1006 msgid "Clustering Params" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1010 msgid "Size Cropping" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1011 msgid "Remove clusters based upon size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1016 msgid "Min Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1017 msgid "Remove clusters below this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1020 msgid "Max Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1021 msgid "Remove clusters above this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1026 msgid "Show number of clusters as a function of cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1031 msgid "Dist. Log Scale" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1032 msgid "Use logarithmic scale for size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1037 msgid "Morphology Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1038 msgid "Create a plot showing cluster aspect ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1041 msgid "Cluster Id" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1042 msgid "Assign cluster output a unique per-cluster value (id)." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1047 msgid "Chemistry Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1048 msgid "Create a plot showing chemistry for each cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1053 msgid "Normalise Comp." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1054 msgid "Convert cluster counts to composition" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1059 msgid "Postprocess" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1078 msgid "If selected, use as \"core\" ion type (can make clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1083 msgid "Core Ranges" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1090 msgid "Enable/Disable All" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1091 msgid "Enable/disable all ions for bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1103 msgid "" "If selected, use as \"bulk\" ion type (can be included in existing clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1108 msgid "Bulk Ranges" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1124 msgid "Max. Sep + Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1881 msgid " --------------------------- Parameter selection notice ------------- " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1882 msgid "You have specified a bulk distance larger than half your link distance." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1883 msgid "" "You can do this; thats OK, but the output is no longer independent of the " "computational process;" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1884 msgid "" "This will be a problem in the case where two or more clusters can equally " "lay claim to a \"bulk\" ion. " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1885 msgid "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1886 msgid "" " In theory it is possible to \"join\" the clusters, but this has not been " "implemented for speed reasons." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1887 msgid "" "If you want this, please contact the author, or just use the source to add " "this in yourself." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1888 msgid "---------------------------------------------------------------------- " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1898 #: ../src/backend/filters/spatialAnalysis.cpp:576 #: ../src/backend/filters/spatialAnalysis.cpp:2428 #: ../src/backend/filters/spatialAnalysis.cpp:2914 #: ../src/backend/filters/spatialAnalysis.cpp:3203 #: ../src/backend/filters/spatialAnalysis.cpp:3505 #: ../src/backend/filters/spatialAnalysis.cpp:3656 #: ../src/backend/filters/spatialAnalysis.cpp:3744 #: ../src/backend/filters/spatialAnalysis.cpp:4016 #: ../src/backend/filters/spatialAnalysis.cpp:4238 #: ../src/backend/filters/spatialAnalysis.cpp:4431 #: ../src/backend/filters/spatialAnalysis.cpp:4661 #: ../src/backend/filters/transform.cpp:1028 msgid "Collate" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1917 msgid "Build Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1945 msgid "Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2068 msgid "Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2146 msgid "Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2224 msgid "Re-Collate" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2279 msgid "Classify Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2370 msgid "Build Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2618 #: ../src/backend/filters/clusterAnalysis.cpp:2832 msgid "Cluster Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2619 #: ../src/backend/filters/clusterAnalysis.cpp:2836 msgid "Frequency" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2834 msgid "Composition" msgstr "" #: ../src/backend/filters/voxelise.cpp:96 msgid "None (Raw count)" msgstr "" #: ../src/backend/filters/voxelise.cpp:97 msgid "Volume (Density)" msgstr "" #: ../src/backend/filters/voxelise.cpp:98 msgid "All Ions (conc)" msgstr "" #: ../src/backend/filters/voxelise.cpp:99 msgid "Ratio (Num/Denom)" msgstr "" #: ../src/backend/filters/voxelise.cpp:105 msgid "Gaussian (blur)" msgstr "" #: ../src/backend/filters/voxelise.cpp:106 msgid "Lapl. of Gauss. (edges)" msgstr "" #: ../src/backend/filters/voxelise.cpp:341 msgid "Counting" msgstr "" #: ../src/backend/filters/voxelise.cpp:552 msgid "Gauss Smooth" msgstr "" #: ../src/backend/filters/voxelise.cpp:558 msgid "Calc. Laplace" msgstr "" #: ../src/backend/filters/voxelise.cpp:584 msgid "Voxel Limits (min,max): (" msgstr "" #: ../src/backend/filters/voxelise.cpp:594 #: ../src/backend/filters/filterCommon.cpp:475 msgid "Representation" msgstr "" #: ../src/backend/filters/voxelise.cpp:688 msgid "Fixed Width" msgstr "" #: ../src/backend/filters/voxelise.cpp:689 msgid "If true, use fixed size voxels, otherwise use fixed count" msgstr "" #: ../src/backend/filters/voxelise.cpp:694 msgid "Bin Width, X" msgstr "" #: ../src/backend/filters/voxelise.cpp:695 msgid "Voxel size in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:698 msgid "Bin Width, Y" msgstr "" #: ../src/backend/filters/voxelise.cpp:699 msgid "Voxel size in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:702 msgid "Bin Width, Z" msgstr "" #: ../src/backend/filters/voxelise.cpp:703 msgid "Voxel size in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:708 msgid "Num Bins , X" msgstr "" #: ../src/backend/filters/voxelise.cpp:709 msgid "Number of bins in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:712 msgid "Num Bins, Y" msgstr "" #: ../src/backend/filters/voxelise.cpp:713 msgid "Number of bins in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:716 msgid "Num Bins, Z" msgstr "" #: ../src/backend/filters/voxelise.cpp:717 msgid "Number of bins Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:747 msgid "Normalise by" msgstr "" #: ../src/backend/filters/voxelise.cpp:748 msgid "Method to use to normalise scalar value in each voxel" msgstr "" #: ../src/backend/filters/voxelise.cpp:751 msgid "Computation" msgstr "" #: ../src/backend/filters/voxelise.cpp:758 #: ../src/backend/filters/spatialAnalysis.cpp:1172 #: ../src/backend/filters/spatialAnalysis.cpp:1191 msgid "Numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:759 msgid "Parameter \"a\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:776 msgid "Enable this ion for numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:789 #: ../src/backend/filters/voxelise.cpp:808 #: ../src/backend/filters/spatialAnalysis.cpp:1197 #: ../src/backend/filters/spatialAnalysis.cpp:1214 msgid "Denominator" msgstr "" #: ../src/backend/filters/voxelise.cpp:790 msgid "Parameter \"b\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:804 msgid "Enable this ion for denominator contribution" msgstr "" #: ../src/backend/filters/voxelise.cpp:824 msgid "Threshold Mask" msgstr "" #: ../src/backend/filters/voxelise.cpp:825 msgid "Enable threshold based exclusion of values." msgstr "" #: ../src/backend/filters/voxelise.cpp:830 msgid "Count threshold" msgstr "" #: ../src/backend/filters/voxelise.cpp:831 msgid "Threshold counts above which to keep data (if normalising, denominator)" msgstr "" #: ../src/backend/filters/voxelise.cpp:834 msgid "Mask to Max" msgstr "" #: ../src/backend/filters/voxelise.cpp:835 msgid "" "If enabled, masked values are set to the voxel maximum. If disabled, minimum" msgstr "" #: ../src/backend/filters/voxelise.cpp:839 #: ../src/backend/filters/voxelise.cpp:857 msgid "Filtering" msgstr "" #: ../src/backend/filters/voxelise.cpp:840 msgid "Smoothing method to use on voxels" msgstr "" #: ../src/backend/filters/voxelise.cpp:844 msgid "Processing" msgstr "" #: ../src/backend/filters/voxelise.cpp:848 msgid "Standard Dev" msgstr "" #: ../src/backend/filters/voxelise.cpp:849 msgid "Filtering Scale (standard deviation)" msgstr "" #: ../src/backend/filters/voxelise.cpp:852 msgid "Kernel Size" msgstr "" #: ../src/backend/filters/voxelise.cpp:853 msgid "" "Filter radius, in multiples of std. dev. Larger -> slower, more accurate" msgstr "" #: ../src/backend/filters/ionColour.cpp:144 msgid "Unable to determine colour limits" msgstr "" #: ../src/backend/filters/ionColour.cpp:302 #: ../src/backend/filters/spatialAnalysis.cpp:1238 msgid "Colour Map" msgstr "" #: ../src/backend/filters/ionColour.cpp:303 #: ../src/backend/filters/filterCommon.cpp:584 #: ../src/backend/filters/filterCommon.cpp:638 msgid "Colour scheme used to assign points colours by value" msgstr "" #: ../src/backend/filters/ionColour.cpp:306 msgid "Reverse map" msgstr "" #: ../src/backend/filters/ionColour.cpp:307 msgid "Reverse the colour scale" msgstr "" #: ../src/backend/filters/ionColour.cpp:310 #: ../src/backend/filters/filterCommon.cpp:493 #: ../src/backend/filters/filterCommon.cpp:591 #: ../src/backend/filters/filterCommon.cpp:645 #: ../src/backend/filters/filterCommon.cpp:705 msgid "Show Bar" msgstr "" #: ../src/backend/filters/ionColour.cpp:311 msgid "Display the colour legend in the 3D view" msgstr "" #: ../src/backend/filters/ionColour.cpp:315 msgid "How see-through to make the legend (0- transparent, 1- solid)" msgstr "" #: ../src/backend/filters/ionColour.cpp:318 msgid "Num Colours" msgstr "" #: ../src/backend/filters/ionColour.cpp:319 msgid "Number of unique colours to use in colour map" msgstr "" #: ../src/backend/filters/ionColour.cpp:322 msgid "Auto bounds" msgstr "" #: ../src/backend/filters/ionColour.cpp:323 msgid "Automatically scale colour to min/max of data range" msgstr "" #: ../src/backend/filters/ionColour.cpp:328 #: ../src/backend/filters/filterCommon.cpp:503 #: ../src/backend/filters/filterCommon.cpp:601 #: ../src/backend/filters/filterCommon.cpp:655 #: ../src/backend/filters/filterCommon.cpp:715 msgid "Map start" msgstr "" #: ../src/backend/filters/ionColour.cpp:329 #: ../src/backend/filters/filterCommon.cpp:504 #: ../src/backend/filters/filterCommon.cpp:602 #: ../src/backend/filters/filterCommon.cpp:656 #: ../src/backend/filters/filterCommon.cpp:716 msgid "Assign points with this value to the first colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:332 msgid "Map End" msgstr "" #: ../src/backend/filters/ionColour.cpp:333 #: ../src/backend/filters/filterCommon.cpp:508 #: ../src/backend/filters/filterCommon.cpp:606 #: ../src/backend/filters/filterCommon.cpp:660 #: ../src/backend/filters/filterCommon.cpp:720 msgid "Assign points with this value to the last colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:444 ../src/backend/filter.cpp:198 msgid "Aborted" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:131 msgid "Local Density" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:132 msgid "Density Filtering" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:133 msgid "Radial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:134 msgid "Axial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:135 msgid "Binomial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:136 msgid "Point Em/Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:137 msgid "Local Chemistry" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:138 msgid "Local Chem. Filter" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:139 msgid "Axial DF Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:143 msgid "Neighbour Count" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:639 #: ../src/backend/filters/spatialAnalysis.cpp:2462 #: ../src/backend/filters/spatialAnalysis.cpp:2515 #: ../src/backend/filters/spatialAnalysis.cpp:2919 #: ../src/backend/filters/spatialAnalysis.cpp:3208 #: ../src/backend/filters/spatialAnalysis.cpp:3516 #: ../src/backend/filters/spatialAnalysis.cpp:3662 #: ../src/backend/filters/spatialAnalysis.cpp:4263 #: ../src/backend/filters/spatialAnalysis.cpp:4686 msgid "Build" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:688 #: ../src/backend/filters/spatialAnalysis.cpp:3538 #: ../src/backend/filters/spatialAnalysis.cpp:4146 #: ../src/backend/filters/spatialAnalysis.cpp:4280 #: ../src/backend/filters/spatialAnalysis.cpp:4562 #: ../src/backend/filters/spatialAnalysis.cpp:4703 msgid "Compute" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:805 msgid "Spatial analysis algorithm to use" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:830 #: ../src/backend/filters/spatialAnalysis.cpp:861 msgid "Stop Mode" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:831 msgid "Method to use to terminate algorithm when examining each point" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:837 msgid "NN Max" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:838 msgid "Maximum number of neighbours to examine" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:844 msgid "Normalise bins" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:845 msgid "" "Normalise counts by binwidth. Needed when comparing NN histograms against " "one another" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:848 msgid "Show Random" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:849 msgid "Show a fitted (density matched) theoretical distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:856 msgid "Dist Max" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:857 #: ../src/backend/filters/spatialAnalysis.cpp:1226 msgid "Maximum distance from each point for search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:869 #: ../src/backend/filters/spatialAnalysis.cpp:981 #: ../src/backend/filters/profile.cpp:1141 msgid "Num Bins" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:870 #: ../src/backend/filters/spatialAnalysis.cpp:982 msgid "Number of bins for output 1D RDF plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:873 msgid "Surface Remove" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:874 msgid "" "Exclude surface as part of source to minimise bias in RDF (at cost of " "increased noise)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:880 msgid "Remove Dist" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:881 msgid "Minimum distance to remove from surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:887 #: ../src/backend/filters/spatialAnalysis.cpp:1028 #: ../src/backend/filters/profile.cpp:1153 #: ../src/backend/filters/ionInfo.cpp:599 msgid "Normalise" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:888 msgid "Perform normalisation of the RDF, rather than raw counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:892 msgid "Plot colour" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:893 #: ../src/backend/filters/spatialAnalysis.cpp:986 msgid "Colour of output plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:897 #: ../src/backend/filters/spatialAnalysis.cpp:971 #: ../src/backend/filters/spatialAnalysis.cpp:976 #: ../src/backend/filters/spatialAnalysis.cpp:993 #: ../src/backend/filters/spatialAnalysis.cpp:1018 #: ../src/backend/filters/spatialAnalysis.cpp:1132 #: ../src/backend/filters/spatialAnalysis.cpp:1229 msgid "Alg. Params." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:908 #: ../src/backend/filters/spatialAnalysis.cpp:1147 msgid "Source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:909 msgid "Ions to use for initiating RDF search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:924 #: ../src/backend/filters/spatialAnalysis.cpp:1161 #: ../src/backend/filters/spatialAnalysis.cpp:1186 msgid "Enable/disable ion as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:929 #: ../src/backend/filters/spatialAnalysis.cpp:1166 msgid "Source Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:937 msgid "Enable/disable all ions as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:951 #: ../src/backend/filters/spatialAnalysis.cpp:1210 msgid "Enable/disable this ion as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:955 msgid "Target Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:963 #: ../src/backend/filters/spatialAnalysis.cpp:1124 msgid "Cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:964 msgid "Remove points with local density above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:967 #: ../src/backend/filters/spatialAnalysis.cpp:1128 msgid "Retain Upper" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:968 msgid "Retain either points with density above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:985 msgid "Plot Colour" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:990 msgid "Vector along which to calculate distribution function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:998 msgid "Block size" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:999 msgid "Number of ions to use per block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1002 msgid "Max Block Aspect" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1003 msgid "" "Maximum allowable block aspect ratio. Blocks above this aspect are " "discarded. Setting too high decreases correlation strength. Too low causes " "loss of statistical power." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1013 msgid "Extrusion Direction" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1014 msgid "Direction in which blocks are extended during construction." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1022 msgid "Plot Counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1023 msgid "Show the counts in the binomial histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1029 msgid "" "Normalise the counts in the binomial histogram to a probability density " "function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1033 msgid "Expected Freq" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1034 msgid "" "Show the theoretically expected probability density function for a random " "dataset with the same mean" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1042 msgid "Display Grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1043 msgid "Show the extruded grid in the 3D view. This may be slow" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1046 msgid "View Options" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1060 msgid "Ions to use when counting" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1073 msgid "Enable/disable ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1078 msgid "Enabled Ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Data File" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Pos file of points to subtract/replace/etc" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1091 msgid "Match Tol." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1092 msgid "Tolerance to allow for matching" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1104 msgid "Replacment condition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1109 msgid "Replace value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1110 msgid "Use value data from file when replacing ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1114 msgid "Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1125 msgid "Remove points with local concentration above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1129 msgid "Retain either points with concentration above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1148 msgid "Enable/disable all ions as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1173 msgid "Enable/Disable all ions to use as Numerator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1198 msgid "Enable/Disable all ions to use as Denominator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1221 msgid "Angular step (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1222 msgid "Step in degrees between calculations for angular histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1225 msgid "Dist. Max" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1232 msgid "Log scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1233 msgid "Show 2D plot in logarithmic scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1239 msgid "Colour scheme in 2D plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1241 #: ../src/backend/filters/annotation.cpp:816 msgid "Display" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1841 msgid "Spatial analysis aborted by user" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1842 msgid "Insufficient memory for binomial. Reduce input size?" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1843 msgid "Required range data not present" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1844 msgid "Unable to generate usable binomial grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1846 msgid "Insufficient points to continue" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1847 msgid "Unable to load file" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2476 #: ../src/backend/filters/spatialAnalysis.cpp:2529 #: ../src/backend/filters/filterCommon.cpp:524 #: ../src/backend/filters/filterCommon.cpp:574 #: ../src/backend/filters/filterCommon.cpp:627 msgid "Surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2569 #: ../src/backend/filters/spatialAnalysis.cpp:2941 #: ../src/backend/filters/spatialAnalysis.cpp:3232 msgid "Analyse" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2648 #: ../src/backend/filters/spatialAnalysis.cpp:2742 #: ../src/backend/filters/spatialAnalysis.cpp:2811 msgid "Radial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2650 #: ../src/backend/filters/spatialAnalysis.cpp:2747 msgid "Count/Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2659 #: ../src/backend/filters/spatialAnalysis.cpp:2755 msgid "NN Freq." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2802 msgid "Warning, " msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2803 msgid "" " points were unable to find neighbour points that exceeded the search " "radius, and thus terminated prematurely" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2813 msgid " RDF" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid "Found " msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid " points with no neighbours - these have been dropped" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3139 #: ../src/backend/filters/spatialAnalysis.cpp:3440 msgid "Number Density (\\#/Vol^3)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3164 #: ../src/backend/filters/spatialAnalysis.cpp:3462 msgid "Warning," msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3165 #: ../src/backend/filters/spatialAnalysis.cpp:3463 msgid " points were un-analysable. These have been dropped" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3187 #: ../src/backend/filters/spatialAnalysis.cpp:3485 msgid "And so on..." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3584 msgid "Insufficient points to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3607 msgid "Axial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3609 msgid " 1D Dist. Func." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3675 msgid "Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3717 msgid "Axial DF power" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3718 msgid "Theta - Azimuthal angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3719 msgid "Phi - Elevation angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3753 msgid "Binomial" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3890 #: ../src/backend/filters/spatialAnalysis.cpp:3958 msgid "Ions in Block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3892 #: ../src/backend/filters/spatialAnalysis.cpp:3960 #: ../src/backend/filters/spectrumPlot.cpp:79 msgid "Probability" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3962 msgid "Count (blocks)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4037 #: ../src/backend/filters/spatialAnalysis.cpp:4452 msgid "Build Numerator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4051 #: ../src/backend/filters/spatialAnalysis.cpp:4466 msgid "Build Denominator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4395 #: ../src/backend/filters/spatialAnalysis.cpp:4817 msgid "Relative Conc. (%)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:55 msgid "Point Cloud" msgstr "" #: ../src/backend/filters/filterCommon.cpp:56 msgid "Isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:57 msgid "Axial slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:58 msgid "Slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:60 msgid "Volume Render" msgstr "" #: ../src/backend/filters/filterCommon.cpp:67 msgid "Linear" msgstr "" #: ../src/backend/filters/filterCommon.cpp:476 msgid "3D display method" msgstr "" #: ../src/backend/filters/filterCommon.cpp:484 msgid "Spot size" msgstr "" #: ../src/backend/filters/filterCommon.cpp:485 msgid "Size of the spots to use for display" msgstr "" #: ../src/backend/filters/filterCommon.cpp:489 #: ../src/backend/filters/filterCommon.cpp:533 #: ../src/backend/filters/filterCommon.cpp:587 #: ../src/backend/filters/filterCommon.cpp:641 #: ../src/backend/filters/filterCommon.cpp:692 msgid "Transparency" msgstr "" #: ../src/backend/filters/filterCommon.cpp:490 msgid "How \"see through\" each point is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:494 #: ../src/backend/filters/filterCommon.cpp:592 #: ../src/backend/filters/filterCommon.cpp:646 #: ../src/backend/filters/filterCommon.cpp:706 msgid "Display colour bar in 3D view?" msgstr "" #: ../src/backend/filters/filterCommon.cpp:497 msgid "Auto Scale" msgstr "" #: ../src/backend/filters/filterCommon.cpp:498 #: ../src/backend/filters/filterCommon.cpp:596 #: ../src/backend/filters/filterCommon.cpp:650 #: ../src/backend/filters/filterCommon.cpp:710 msgid "Auto-compute min/max values (colour limits)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:507 #: ../src/backend/filters/filterCommon.cpp:605 #: ../src/backend/filters/filterCommon.cpp:659 #: ../src/backend/filters/filterCommon.cpp:719 msgid "Map end" msgstr "" #: ../src/backend/filters/filterCommon.cpp:517 msgid "Surf. param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:519 msgid "Isovalue" msgstr "" #: ../src/backend/filters/filterCommon.cpp:520 msgid "Scalar value to show as isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:529 msgid "Colour of isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:534 #: ../src/backend/filters/filterCommon.cpp:588 #: ../src/backend/filters/filterCommon.cpp:642 #: ../src/backend/filters/filterCommon.cpp:693 msgid "How \"see through\" each facet is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:544 #: ../src/backend/filters/filterCommon.cpp:616 msgid "Slice param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:552 #: ../src/backend/filters/filterCommon.cpp:553 msgid "Slice Axis" msgstr "" #: ../src/backend/filters/filterCommon.cpp:554 msgid "Normal for the planar slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:559 msgid "Slice Coord" msgstr "" #: ../src/backend/filters/filterCommon.cpp:560 msgid "Fractional coordinate that slice plane passes through" msgstr "" #: ../src/backend/filters/filterCommon.cpp:569 msgid "Interp Mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:570 msgid "Interpolation mode for direction normal to slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:583 #: ../src/backend/filters/filterCommon.cpp:637 #: ../src/backend/filters/filterCommon.cpp:688 msgid "Colour Mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:595 #: ../src/backend/filters/filterCommon.cpp:649 #: ../src/backend/filters/filterCommon.cpp:709 msgid "Auto Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:618 msgid "Slice Origin" msgstr "" #: ../src/backend/filters/filterCommon.cpp:619 msgid "Point on plane for slice, in 0->1 coordinates" msgstr "" #: ../src/backend/filters/filterCommon.cpp:622 msgid "Slice Normal" msgstr "" #: ../src/backend/filters/filterCommon.cpp:623 msgid "Normal vector for slice plane" msgstr "" #: ../src/backend/filters/filterCommon.cpp:664 msgid "Colour mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:674 msgid "Built-in map" msgstr "" #: ../src/backend/filters/filterCommon.cpp:675 msgid "" "True if you want to use a built-in colour map, false to specify your own" msgstr "" #: ../src/backend/filters/filterCommon.cpp:689 #: ../src/backend/filters/filterCommon.cpp:700 msgid "Colour scheme used to assign colours and transparency by value" msgstr "" #: ../src/backend/filters/filterCommon.cpp:733 msgid "Show Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:734 msgid "Display the voxel's bounding box" msgstr "" #: ../src/backend/filters/filterCommon.cpp:739 msgid "Bound Colour" msgstr "" #: ../src/backend/filters/filterCommon.cpp:740 msgid "Set Voxel's bounding box colour" msgstr "" #: ../src/backend/filters/profile.cpp:53 msgid "Cylinder (axial)" msgstr "" #: ../src/backend/filters/profile.cpp:54 msgid "Cylinder (radial)" msgstr "" #: ../src/backend/filters/profile.cpp:626 #: ../src/backend/filters/annotation.cpp:81 msgid "Distance" msgstr "" #: ../src/backend/filters/profile.cpp:635 msgid "Fraction" msgstr "" #: ../src/backend/filters/profile.cpp:641 msgid "Density (\\frac{\\#}{len^3})" msgstr "" #: ../src/backend/filters/profile.cpp:712 msgid "Freq. Profile" msgstr "" #: ../src/backend/filters/profile.cpp:764 msgid "No data remained in profile - cannot display result" msgstr "" #: ../src/backend/filters/profile.cpp:1063 msgid "Total Density" msgstr "" #: ../src/backend/filters/profile.cpp:1064 msgid "Do not do per-species analysis, perform density computation only" msgstr "" #: ../src/backend/filters/profile.cpp:1078 msgid "Primitive type" msgstr "" #: ../src/backend/filters/profile.cpp:1079 msgid "Basic shape to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1087 msgid "Display the 3D composition profile interaction object" msgstr "" #: ../src/backend/filters/profile.cpp:1098 msgid "Position for centre of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1101 msgid "Vector between ends of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1104 msgid "Lock Axis Mag" msgstr "" #: ../src/backend/filters/profile.cpp:1105 msgid "Prevent length of cylinder changing during interaction" msgstr "" #: ../src/backend/filters/profile.cpp:1134 msgid "Fixed Bin Num" msgstr "" #: ../src/backend/filters/profile.cpp:1135 msgid "" "If true, use a fixed number of bins for profile, otherwise use fixed step " "size" msgstr "" #: ../src/backend/filters/profile.cpp:1142 msgid "Number of bins to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1148 #: ../src/backend/filters/spectrumPlot.cpp:636 msgid "Bin Width" msgstr "" #: ../src/backend/filters/profile.cpp:1149 msgid "Size of each bin in profile" msgstr "" #: ../src/backend/filters/profile.cpp:1154 msgid "Convert bin counts into relative frequencies in each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1157 msgid "Min. Events" msgstr "" #: ../src/backend/filters/profile.cpp:1158 msgid "Drop data that does not have this many events" msgstr "" #: ../src/backend/filters/profile.cpp:1163 msgid "Remap Ions" msgstr "" #: ../src/backend/filters/profile.cpp:1164 msgid "Break apart ions into components, using a remap file?" msgstr "" #: ../src/backend/filters/profile.cpp:1170 msgid "Remap file" msgstr "" #: ../src/backend/filters/profile.cpp:1171 msgid "\"Remap\" file that describes how the ions can be broken apart" msgstr "" #: ../src/backend/filters/profile.cpp:1176 msgid "Settings" msgstr "" #: ../src/backend/filters/profile.cpp:1190 #: ../src/backend/filters/spectrumPlot.cpp:693 msgid "Plot Type" msgstr "" #: ../src/backend/filters/profile.cpp:1191 msgid "Visual style for plot" msgstr "" #: ../src/backend/filters/profile.cpp:1198 msgid "Colour of plot" msgstr "" #: ../src/backend/filters/profile.cpp:1213 msgid "Err. Estimator" msgstr "" #: ../src/backend/filters/profile.cpp:1216 msgid "Method of estimating error associated with each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1223 msgid "Avg. Window" msgstr "" #: ../src/backend/filters/profile.cpp:1226 msgid "Number of bins to include in moving average filter" msgstr "" #: ../src/backend/filters/profile.cpp:1231 msgid "Error analysis" msgstr "" #: ../src/backend/filters/transform.cpp:84 msgid "Translate" msgstr "" #: ../src/backend/filters/transform.cpp:85 msgid "Scale (isotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:86 msgid "Scale (anisotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:87 msgid "Rotate" msgstr "" #: ../src/backend/filters/transform.cpp:88 msgid "Value Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:89 msgid "Spatial Noise" msgstr "" #: ../src/backend/filters/transform.cpp:90 msgid "Translate Value" msgstr "" #: ../src/backend/filters/transform.cpp:91 msgid "Crop Value" msgstr "" #: ../src/backend/filters/transform.cpp:95 msgid "Specify" msgstr "" #: ../src/backend/filters/transform.cpp:96 msgid "Boundbox Centre" msgstr "" #: ../src/backend/filters/transform.cpp:97 msgid "Mass Centre" msgstr "" #: ../src/backend/filters/transform.cpp:1093 msgid "Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:1117 msgid "Splice" msgstr "" #: ../src/backend/filters/transform.cpp:1159 msgid "Algorithm to use to transform point data" msgstr "" #: ../src/backend/filters/transform.cpp:1174 msgid "Origin mode" msgstr "" #: ../src/backend/filters/transform.cpp:1175 msgid "Select how transform origin is computed" msgstr "" #: ../src/backend/filters/transform.cpp:1180 msgid "Display an interactive object to set transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1182 msgid "Display a small marker to denote transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1184 msgid "Show marker" msgstr "" #: ../src/backend/filters/transform.cpp:1199 msgid "Translation" msgstr "" #: ../src/backend/filters/transform.cpp:1200 msgid "Translation vector for transform" msgstr "" #: ../src/backend/filters/transform.cpp:1209 msgid "Offset" msgstr "" #: ../src/backend/filters/transform.cpp:1210 msgid "Scalar to use to offset each point's associated value" msgstr "" #: ../src/backend/filters/transform.cpp:1223 #: ../src/backend/filters/transform.cpp:1241 msgid "Origin of scale transform" msgstr "" #: ../src/backend/filters/transform.cpp:1227 #: ../src/backend/filters/transform.cpp:1245 msgid "Scale Fact." msgstr "" #: ../src/backend/filters/transform.cpp:1228 #: ../src/backend/filters/transform.cpp:1246 msgid "Enlargement factor for scaling around origin" msgstr "" #: ../src/backend/filters/transform.cpp:1258 msgid "Origin of Rotation" msgstr "" #: ../src/backend/filters/transform.cpp:1262 msgid "Axis around which to revolve" msgstr "" #: ../src/backend/filters/transform.cpp:1265 msgid "Angle (Deg)" msgstr "" #: ../src/backend/filters/transform.cpp:1266 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)" msgstr "" #: ../src/backend/filters/transform.cpp:1281 msgid "Noise Type" msgstr "" #: ../src/backend/filters/transform.cpp:1282 msgid "Method to use to degrade point data" msgstr "" #: ../src/backend/filters/transform.cpp:1290 msgid "Noise Level" msgstr "" #: ../src/backend/filters/transform.cpp:1291 msgid "Amplitude of applied noise" msgstr "" #: ../src/backend/filters/transform.cpp:1296 msgid "Standard dev." msgstr "" #: ../src/backend/filters/transform.cpp:1297 msgid "Gaussian 1-sigma spread distance" msgstr "" #: ../src/backend/filters/transform.cpp:1313 msgid "Min Value" msgstr "" #: ../src/backend/filters/transform.cpp:1314 msgid "Minimum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1316 msgid "Max Value" msgstr "" #: ../src/backend/filters/transform.cpp:1317 msgid "Maximum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1326 msgid "Transform Params" msgstr "" #: ../src/backend/filters/transform.cpp:1695 msgid "White" msgstr "" #: ../src/backend/filters/transform.cpp:1697 msgid "Gaussian" msgstr "" #: ../src/backend/filters/boundingBox.cpp:64 msgid "Box only" msgstr "" #: ../src/backend/filters/boundingBox.cpp:65 msgid "Tick" msgstr "" #: ../src/backend/filters/boundingBox.cpp:66 msgid "Dimension" msgstr "" #: ../src/backend/filters/boundingBox.cpp:569 msgid "If true, show box, otherwise hide box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:582 msgid "Style" msgstr "" #: ../src/backend/filters/boundingBox.cpp:583 msgid "Box display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:586 msgid "Display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:594 msgid "Fixed Tick Num" msgstr "" #: ../src/backend/filters/boundingBox.cpp:595 msgid "" "If true, evenly use specified number of ticks. Otherwise, use distance to " "determine tick count" msgstr "" #: ../src/backend/filters/boundingBox.cpp:600 msgid "Num X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:600 msgid "Tick count in X direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:603 msgid "Num Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:603 msgid "Tick count in Y direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:606 msgid "Num Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:606 msgid "Tick count in Z direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Spacing X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Distance between ticks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Spacing Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Distance between ticks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:617 msgid "Spacing Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:617 msgid "Distance between ticks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Ticks X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Display tick marks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Ticks Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Display tick marks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Ticks Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Display tick marks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:633 msgid "Tick marks" msgstr "" #: ../src/backend/filters/boundingBox.cpp:639 msgid "Box Colour" msgstr "" #: ../src/backend/filters/boundingBox.cpp:640 msgid "Colour of the bounding box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:644 msgid "Line thickness" msgstr "" #: ../src/backend/filters/boundingBox.cpp:645 msgid "Thickness of the lines used to draw the box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:651 #: ../src/backend/filters/annotation.cpp:780 msgid "Font Size" msgstr "" #: ../src/backend/filters/boundingBox.cpp:652 msgid "Relative size for text" msgstr "" #: ../src/backend/filters/boundingBox.cpp:655 msgid "Abs. Coords" msgstr "" #: ../src/backend/filters/boundingBox.cpp:656 msgid "Show labels using absolute co-ordinates" msgstr "" #: ../src/backend/filters/annotation.cpp:80 msgid "Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:86 msgid "Arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:87 msgid "Text" msgstr "" #: ../src/backend/filters/annotation.cpp:88 msgid "Arrow+Text" msgstr "" #: ../src/backend/filters/annotation.cpp:89 msgid "Angle" msgstr "" #: ../src/backend/filters/annotation.cpp:90 msgid "Ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:192 ../src/backend/filter.cpp:55 msgid "Draw" msgstr "" #: ../src/backend/filters/annotation.cpp:595 msgid "Status" msgstr "" #: ../src/backend/filters/annotation.cpp:608 msgid "Type or style of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 msgid "Text of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:626 msgid "Position of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:629 #: ../src/backend/filters/annotation.cpp:670 #: ../src/backend/filters/annotation.cpp:702 msgid "Up dir" msgstr "" #: ../src/backend/filters/annotation.cpp:630 #: ../src/backend/filters/annotation.cpp:671 #: ../src/backend/filters/annotation.cpp:703 #: ../src/backend/filters/annotation.cpp:773 msgid "Vector for up direction of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:633 #: ../src/backend/filters/annotation.cpp:673 #: ../src/backend/filters/annotation.cpp:706 msgid "Across dir" msgstr "" #: ../src/backend/filters/annotation.cpp:634 #: ../src/backend/filters/annotation.cpp:674 #: ../src/backend/filters/annotation.cpp:707 #: ../src/backend/filters/annotation.cpp:777 msgid "Reading direction for annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:637 #: ../src/backend/filters/annotation.cpp:666 #: ../src/backend/filters/annotation.cpp:722 msgid "Text size" msgstr "" #: ../src/backend/filters/annotation.cpp:638 #: ../src/backend/filters/annotation.cpp:667 #: ../src/backend/filters/annotation.cpp:723 #: ../src/backend/filters/annotation.cpp:781 msgid "Relative size of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:653 msgid "3D position for tail of arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:658 msgid "3D position to which arrow points" msgstr "" #: ../src/backend/filters/annotation.cpp:663 msgid "Options" msgstr "" #: ../src/backend/filters/annotation.cpp:677 msgid "Arrow radius" msgstr "" #: ../src/backend/filters/annotation.cpp:678 msgid "Size of the arrow head" msgstr "" #: ../src/backend/filters/annotation.cpp:687 msgid "Position A" msgstr "" #: ../src/backend/filters/annotation.cpp:688 msgid "Location of first non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:692 msgid "Location of central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:695 msgid "Position B" msgstr "" #: ../src/backend/filters/annotation.cpp:696 msgid "Location of second non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:710 msgid "Reflexive" msgstr "" #: ../src/backend/filters/annotation.cpp:711 msgid "Measure interor (enabled) or exterior angle (disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:714 msgid "Show Angle" msgstr "" #: ../src/backend/filters/annotation.cpp:715 msgid "Display angle text (when enabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:741 msgid "Digit Format" msgstr "" #: ../src/backend/filters/annotation.cpp:741 msgid "" "Format of angle text; # for numeral position, '.' for separator, eg ##.## " "gives 12.34" msgstr "" #: ../src/backend/filters/annotation.cpp:747 msgid "Sphere size" msgstr "" #: ../src/backend/filters/annotation.cpp:748 #: ../src/backend/filters/annotation.cpp:804 msgid "Marker sphere size for manipulating tool" msgstr "" #: ../src/backend/filters/annotation.cpp:760 msgid "Display Style" msgstr "" #: ../src/backend/filters/annotation.cpp:761 msgid "Set the appearance of the ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:765 msgid "Ruler beginning location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:769 msgid "Ruler finish location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:772 msgid "Up direction" msgstr "" #: ../src/backend/filters/annotation.cpp:776 msgid "Across direction" msgstr "" #: ../src/backend/filters/annotation.cpp:784 msgid "Fixed Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:785 msgid "" "Use fixed (enabled) number of text markers, or one every fixed distance " "(disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:790 msgid "Num Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:791 msgid "Number of tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:796 msgid "Tick Spacing" msgstr "" #: ../src/backend/filters/annotation.cpp:797 msgid "Distance between tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:803 msgid "Sphere Size" msgstr "" #: ../src/backend/filters/annotation.cpp:814 msgid "Colour for ruler and ticks" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:210 msgid "Sampling" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:463 msgid "By Count" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:464 msgid "Sample up to a fixed number of ions" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:469 msgid "Per Species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:470 msgid "Use species specific (from ranging) sampling values" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:501 msgid "Sampling value for species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:508 #: ../src/backend/filters/ionInfo.cpp:371 #: ../src/backend/filters/ionInfo.cpp:429 msgid "Unranged" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:517 #: ../src/backend/filters/ionDownsample.cpp:534 msgid "Sampling rates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:523 msgid "Output Count" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:524 msgid "Sample up to this value of points" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:529 msgid "Out Fraction" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:530 msgid "Sample this fraction of points" msgstr "" #: ../src/backend/filters/ionInfo.cpp:42 msgid "Rectilinear" msgstr "" #: ../src/backend/filters/ionInfo.cpp:43 msgid "Convex hull" msgstr "" #: ../src/backend/filters/ionInfo.cpp:226 msgid "No ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:248 msgid "Ion counts" msgstr "" #: ../src/backend/filters/ionInfo.cpp:267 msgid "" "Background fit failed - input data was considered ill formed (gauss-test)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:268 msgid "Following data has not been corrected" msgstr "" #: ../src/backend/filters/ionInfo.cpp:321 msgid "--Counts--" msgstr "" #: ../src/backend/filters/ionInfo.cpp:333 msgid "Total ranged (without remap)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:335 msgid "Total Ranged\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:341 msgid "Total (incl. unranged,without remap)\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:343 msgid "Total (incl. unranged)\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:361 #: ../src/backend/filters/ionInfo.cpp:415 msgid "n/a" msgstr "" #: ../src/backend/filters/ionInfo.cpp:434 msgid "Unranged ions ignored" msgstr "" #: ../src/backend/filters/ionInfo.cpp:447 msgid "Number of points : " msgstr "" #: ../src/backend/filters/ionInfo.cpp:459 #: ../src/backend/filters/ionInfo.cpp:661 msgid "Volume" msgstr "" #: ../src/backend/filters/ionInfo.cpp:480 msgid "Rectilinear Bounds : " msgstr "" #: ../src/backend/filters/ionInfo.cpp:485 msgid "Volume (len^3): " msgstr "" #: ../src/backend/filters/ionInfo.cpp:502 msgid "Convex Volume (len^3): " msgstr "" #: ../src/backend/filters/ionInfo.cpp:505 msgid "Unable to compute volume" msgstr "" #: ../src/backend/filters/ionInfo.cpp:535 msgid "Ranged Density (pts/vol):" msgstr "" #: ../src/backend/filters/ionInfo.cpp:540 msgid "Total Density (pts/vol):" msgstr "" #: ../src/backend/filters/ionInfo.cpp:568 msgid "Compositions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:569 msgid "Display compositional data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:574 msgid "Remap ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:575 msgid "Break up ion counts/compositions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:581 msgid "Remap File" msgstr "" #: ../src/backend/filters/ionInfo.cpp:582 msgid "File describing how ions are to be broken up" msgstr "" #: ../src/backend/filters/ionInfo.cpp:590 msgid "Counts" msgstr "" #: ../src/backend/filters/ionInfo.cpp:591 msgid "Display count data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:596 msgid "Ion data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:600 msgid "Normalise count data by totals" msgstr "" #: ../src/backend/filters/ionInfo.cpp:662 msgid "Compute volume for point data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:675 msgid "Select volume counting technique" msgstr "" #: ../src/backend/filters/ionInfo.cpp:678 msgid "Volume data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:63 msgid "Auto" msgstr "" #: ../src/backend/filters/dataLoad.cpp:64 msgid "Little" msgstr "" #: ../src/backend/filters/dataLoad.cpp:65 msgid "Big" msgstr "" #: ../src/backend/filters/dataLoad.cpp:68 msgid "POS Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:69 msgid "Text Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:70 msgid "ATO Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:71 msgid "Tapsim Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:72 msgid "3Dap/Posap OPS Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:232 msgid " does not exist" msgstr "" #: ../src/backend/filters/dataLoad.cpp:253 msgid "Reading File" msgstr "" #: ../src/backend/filters/dataLoad.cpp:268 #: ../src/backend/filters/dataLoad.cpp:281 #: ../src/backend/filters/dataLoad.cpp:325 #: ../src/backend/filters/dataLoad.cpp:336 #: ../src/backend/filters/dataLoad.cpp:396 #: ../src/backend/filters/dataLoad.cpp:418 #: ../src/backend/filters/dataLoad.cpp:436 msgid "Error loading file: " msgstr "" #: ../src/backend/filters/dataLoad.cpp:298 msgid "Sampling is active, loaded " msgstr "" #: ../src/backend/filters/dataLoad.cpp:299 msgid " available." msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 msgid "Loaded entire dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 #: ../src/backend/filters/dataLoad.cpp:406 #: ../src/backend/filters/dataLoad.cpp:428 #: ../src/backend/filters/dataLoad.cpp:446 msgid " points." msgstr "" #: ../src/backend/filters/dataLoad.cpp:351 msgid "" "Data file contained incorrect number of columns -- should be 3 or 4, was " msgstr "" #: ../src/backend/filters/dataLoad.cpp:405 #: ../src/backend/filters/dataLoad.cpp:427 #: ../src/backend/filters/dataLoad.cpp:445 msgid "Loaded dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:477 msgid "" "Warning:One or more bounds of the loaded data approaches the limits of " "numerical stability for the internal data type(magnitude too large). " "Consider rescaling data before loading" msgstr "" #: ../src/backend/filters/dataLoad.cpp:500 msgid "File from which to load data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:502 msgid "" "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato, *.ops)|*.xml;*.pos;*.txt;*." "csv;*.ato;*.ops|All Files|*" msgstr "" #: ../src/backend/filters/dataLoad.cpp:511 msgid "File type" msgstr "" #: ../src/backend/filters/dataLoad.cpp:512 msgid "Type of fil to be loaded" msgstr "" #: ../src/backend/filters/dataLoad.cpp:524 msgid "Entries per point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:525 msgid "Number of decimal values in file per 3D point (normally 4)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:536 msgid "Relative offset of each entry in file for point's X position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:540 msgid "Relative offset of each entry in file for point's Y position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:543 msgid "Z" msgstr "" #: ../src/backend/filters/dataLoad.cpp:544 msgid "Relative offset of each entry in file for point's Z position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:548 msgid "" "Relative offset of each entry in file to use for scalar value of 3D point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:564 msgid "File \"Endianness\"" msgstr "" #: ../src/backend/filters/dataLoad.cpp:565 msgid "On-disk data storage format. If file won't load, just try each" msgstr "" #: ../src/backend/filters/dataLoad.cpp:574 msgid "Recon. Width" msgstr "" #: ../src/backend/filters/dataLoad.cpp:575 msgid "" "Width of box onto which to place reconstructed detector hits (similar to tip " "radius)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:579 msgid "Ion Volume" msgstr "" #: ../src/backend/filters/dataLoad.cpp:580 msgid "Effective volume of an ion (incl. free packing volume)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:584 msgid "Det. Efficiency" msgstr "" #: ../src/backend/filters/dataLoad.cpp:585 msgid "" "Effiency of system (ions evaporated towards detector/ions detected by " "detector)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:596 msgid "Value Label" msgstr "" #: ../src/backend/filters/dataLoad.cpp:597 msgid "Name for the scalar value associated with each point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:600 msgid "Format params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Enabled" msgstr "" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Load this file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "Sample data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "" "Perform random selection on file contents,instead of loading entire file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:619 msgid "Load Limit (MB)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:620 msgid "Limit for size of data to load" msgstr "" #: ../src/backend/filters/dataLoad.cpp:626 msgid "Monitor" msgstr "" #: ../src/backend/filters/dataLoad.cpp:627 msgid "" "Watch file timestamp to track changes to file contents from other programs" msgstr "" #: ../src/backend/filters/dataLoad.cpp:631 msgid "Load params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:638 msgid "Default colour" msgstr "" #: ../src/backend/filters/dataLoad.cpp:639 msgid "Default colour for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/dataLoad.cpp:643 msgid "Draw Size" msgstr "" #: ../src/backend/filters/dataLoad.cpp:644 msgid "Default size for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:77 msgid "Maximum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:78 msgid "Max in limit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:171 msgid "Extrema" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:220 msgid "count" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:311 msgid "Mixed data" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:441 msgid "Background fit failed" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:446 msgid "" "Insufficient bins (data points) to perform fit. Try decreasing bin size, or " "expanding range" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:449 msgid "" "Insufficient counts to perform fit. Try expanding range, or increasing " "number of ions" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:452 msgid "Insufficient data to compute Anderson-Darling statistic" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:455 msgid "" "Background noise does not appear to be gaussian-like, ensure range contains " "no peaks" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:472 msgid "Background:" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:529 #: ../src/backend/filters/spectrumPlot.cpp:531 msgid "Relative " msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:534 #: ../src/backend/filters/spectrumPlot.cpp:536 msgid "Probability Density" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:637 msgid "Step size for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:640 msgid "Auto Min/Max" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:641 msgid "Automatically compute spectrum upper and lower bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:647 msgid "Starting position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:651 msgid "Ending position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:658 msgid "Logarithmic" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:659 msgid "Convert the plot to logarithmic mode" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:669 msgid "Normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:670 msgid "Rescale the plot height, to make inter-spectrum comparisons easier" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:676 msgid "Lower Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:677 msgid "Do not use data below this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:680 msgid "Upper Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:681 msgid "Do not use data above this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:694 msgid "Visual style of plot" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:698 msgid "Colour of plotted spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:713 msgid "Model" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:714 msgid "Background fitting method to use" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:725 msgid "Fit Start" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:726 msgid "Start mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:729 msgid "Fit End" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:730 msgid "End mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:740 msgid "Corr. Only" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:741 msgid "Only show corrected spectrum, not fit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:746 msgid "Background Mode" msgstr "" #: ../src/backend/filters/rangeFile.cpp:121 #: ../src/backend/filters/rangeFile.h:96 msgid "Ranging" msgstr "" #: ../src/backend/filters/rangeFile.cpp:562 msgid "File to use for range data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:567 msgid "Drop unranged" msgstr "" #: ../src/backend/filters/rangeFile.cpp:568 msgid "Remove unranged points when generating output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:576 msgid "Legend" msgstr "" #: ../src/backend/filters/rangeFile.cpp:577 msgid "Display colour legend for enabled ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:580 msgid "View" msgstr "" #: ../src/backend/filters/rangeFile.cpp:596 msgid "All Ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:597 msgid "Enable/disable all ions at once" msgstr "" #: ../src/backend/filters/rangeFile.cpp:605 msgid "Species" msgstr "" #: ../src/backend/filters/rangeFile.cpp:612 msgid "IonID " msgstr "" #: ../src/backend/filters/rangeFile.cpp:613 msgid "Enable/disable specified ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:625 msgid "Active Ion " msgstr "" #: ../src/backend/filters/rangeFile.cpp:627 msgid "If true, ion is used in output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:638 msgid "Colour " msgstr "" #: ../src/backend/filters/rangeFile.cpp:642 msgid "Colour used to represent ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:666 msgid "All Ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:667 msgid "Enable/disable all ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:682 msgid "Active Rng " msgstr "" #: ../src/backend/filters/rangeFile.cpp:685 msgid "" "Enable/disable specified range (ion must also be enabled to activiate range)" msgstr "" #: ../src/backend/filters/rangeFile.cpp:692 msgid "Ion " msgstr "" #: ../src/backend/filters/rangeFile.cpp:695 msgid "Name of ion associate to this range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:706 msgid "Start rng " msgstr "" #: ../src/backend/filters/rangeFile.cpp:709 msgid "Start value for range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:716 msgid "End rng " msgstr "" #: ../src/backend/filters/rangeFile.cpp:719 msgid "Stopping value for range`" msgstr "" #: ../src/backend/state.cpp:170 msgid "" "This file is a \"state\" file for the 3Depict program, and stores " "information about a particular analysis session. This file should be a valid " "\"XML\" file" msgstr "" #: ../src/backend/state.cpp:346 msgid "Failed to allocate parser" msgstr "" #: ../src/backend/state.cpp:381 msgid "" "Unable to retrieve root node in input state file... Is this really a non-" "empty XML file?" msgstr "" #: ../src/backend/state.cpp:388 msgid "Base state node missing. Is this really a state XML file??" msgstr "" #: ../src/backend/state.cpp:417 msgid "State was created by a newer version of this program.. " msgstr "" #: ../src/backend/state.cpp:418 msgid "file reading will continue, but may fail." msgstr "" #: ../src/backend/state.cpp:428 msgid "" "Warning, unparseable version number in state file. File reading will " "continue, but may fail" msgstr "" #: ../src/backend/state.cpp:437 msgid "Unable to find the \"writer\" node" msgstr "" #: ../src/backend/state.cpp:447 msgid "Unable to find the \"backcolour\" node." msgstr "" #: ../src/backend/state.cpp:455 msgid "\"backcolour\" node missing \"r\" value." msgstr "" #: ../src/backend/state.cpp:460 msgid "Unable to interpret \"backColour\" node's \"r\" value." msgstr "" #: ../src/backend/state.cpp:468 msgid "\"backcolour\" node missing \"g\" value." msgstr "" #: ../src/backend/state.cpp:474 msgid "Unable to interpret \"backColour\" node's \"g\" value." msgstr "" #: ../src/backend/state.cpp:482 msgid "\"backcolour\" node missing \"b\" value." msgstr "" #: ../src/backend/state.cpp:488 msgid "Unable to interpret \"backColour\" node's \"b\" value." msgstr "" #: ../src/backend/state.cpp:495 msgid "\"backcolour\"s rgb values must be in range [0,1]" msgstr "" #: ../src/backend/state.cpp:523 msgid "Unable to find or interpret \"showaxis\" node" msgstr "" #: ../src/backend/state.cpp:567 msgid "Unable to locate \"filtertree\" node." msgstr "" #: ../src/backend/state.cpp:583 msgid "Cameras section missing \"active\" node." msgstr "" #: ../src/backend/state.cpp:591 msgid "Unable to find property \"value\" for \"cameras->active\" node." msgstr "" #: ../src/backend/state.cpp:597 msgid "Unable to interpret property \"value\" for \"cameras->active\" node." msgstr "" #: ../src/backend/state.cpp:617 msgid "Failed to interpret camera state for camera : " msgstr "" #: ../src/backend/state.cpp:625 msgid "Unable to interpret the camera type for camera : " msgstr "" #: ../src/backend/state.cpp:681 msgid "Unable to locate stash name for stash " msgstr "" #: ../src/backend/state.cpp:690 msgid "Empty stash name for stash " msgstr "" #: ../src/backend/state.cpp:699 msgid "No filter tree for stash:" msgstr "" #: ../src/backend/state.cpp:705 msgid "For stash " msgstr "" #: ../src/backend/state.cpp:737 msgid "Unrecognised effect :" msgstr "" #: ../src/backend/state.cpp:747 msgid "Duplicate effect found" msgstr "" #: ../src/backend/state.cpp:747 msgid " cannot use." msgstr "" #: ../src/backend/state.cpp:757 msgid "Error reading effect : " msgstr "" #: ../src/backend/state.cpp:977 msgid "-merge" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:225 msgid "" "Parent filter has no output, but filter requires input -- there is no point " "in placing a child filter here." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:226 msgid "Leaf-only filter with child" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:236 msgid "" "Parent filters' output will be blocked by child, without use. Parent results " "will be dropped." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:237 #: ../src/backend/filtertreeAnalyse.cpp:251 msgid "Bad parent->child pair" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:250 msgid "" "First filter does not output anything useable by child filter. Child filter " "not useful." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:330 msgid "Spatial results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:331 msgid "" "Filters and settings selected that could alter reported results that depend " "upon density. Check to see if spatial sampling may be happening in the " "filter tree - this warning is provisional only." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:399 msgid "Filter needs parent \"" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:400 msgid "" "\" but does not have one. Filter may not function correctly until this " "parent is given." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:401 msgid "Filter missing needed parent" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:432 msgid "Bad range filter settings" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:433 msgid "" "Rangefile set to drop unranged data, however a child filter requires it." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:529 msgid "Filter cannot generate data, but has no input - it is at the tree base." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:530 msgid "Non data-generating filter at root" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:632 msgid "Composition results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:633 msgid "" "Filters and settings selected that could bias reported composition. Check to " "see if species biasing may occcur in the filter tree - this warning is " "provisional only." msgstr "" #: ../src/backend/APT/APTFileIO.cpp:44 ../src/backend/APT/APTFileIO.cpp:79 #: ../src/backend/APT/APTFileIO.cpp:103 ../src/backend/APT/APTFileIO.cpp:123 msgid "Error opening file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:45 msgid "Only found header, no data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:46 msgid "Unable to reopen file after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:47 msgid "Error whilst reading file contents" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:48 ../src/backend/APT/APTFileIO.cpp:49 msgid "Unexpected file format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:50 msgid "Insufficient memory to continue" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:54 msgid "Memory allocation failure on POS load" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:55 msgid "Error opening pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:56 msgid "Pos file empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:57 msgid "Pos file size appears to have non-integer number of entries" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:58 msgid "Error reading from pos file (after open)" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:59 msgid "Error - Found NaN in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:60 msgid "Error - Found Inf in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:61 msgid "Pos load aborted by interrupt." msgstr "" #: ../src/backend/APT/APTFileIO.cpp:80 msgid "No numerical data found" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:81 msgid "Error re-opening file, after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:82 msgid "Unable to read file contents after open" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:83 msgid "Error interpreting field in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:84 msgid "Incorrect number of fields in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:85 ../src/backend/APT/APTFileIO.cpp:107 msgid "Unable to allocate memory to store data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:104 msgid "File is empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:105 msgid "Filesize does not match expected format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:106 msgid "File version number not <4, as expected" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:108 msgid "Unable to detect endian-ness in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:122 msgid "Error interpreting file contents" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:124 msgid "Aborted opening file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:48 msgid "Error opening file, check name and permissions." msgstr "" #: ../src/backend/APT/APTRanges.cpp:49 msgid "" "Error interpreting range file header, expecting ion count and range count, " "respectively." msgstr "" #: ../src/backend/APT/APTRanges.cpp:50 msgid "" "Range file appears to be empty, check file is a proper range file and is not " "empty." msgstr "" #: ../src/backend/APT/APTRanges.cpp:51 msgid "Error reading the long name for ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:52 msgid "Error reading the short name for ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:53 msgid "" "Error reading colour data in the file, expecting 3 decimal values, space " "separated." msgstr "" #: ../src/backend/APT/APTRanges.cpp:54 msgid "" "Tried skipping to table separator line (line with dashes), but did not find " "it." msgstr "" #: ../src/backend/APT/APTRanges.cpp:55 msgid "" "Number of ions in the table header did not match the number specified at the " "start of the file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:56 msgid "" "Unexpected failure whilst trying to skip over range lead-in data (bit before " "range start value)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:57 msgid "" "Range table had an incorrect number of entries, should be 2 or 3 + number of " "ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:58 msgid "Unable to read range start and end values" msgstr "" #: ../src/backend/APT/APTRanges.cpp:59 msgid "Unable to read range table entry" msgstr "" #: ../src/backend/APT/APTRanges.cpp:60 msgid "" "Error reading file, unexpected format, are you sure it is a proper range " "file?" msgstr "" #: ../src/backend/APT/APTRanges.cpp:61 msgid "" "Too many ranges appeared to have range entries with no usable data (eg, all " "blank)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:62 msgid "" "Range file appears to contain malformed data, check things like start and " "ends of m/c are not equal or flipped." msgstr "" #: ../src/backend/APT/APTRanges.cpp:63 msgid "Range file appears to be inconsistent (eg, overlapping ranges)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:64 msgid "No ion name mapping found for multiple ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:65 msgid "Polyatomic extension range matches multiple masses in first section" msgstr "" #: ../src/backend/APT/APTRanges.cpp:66 msgid "Range file is exceedingly large. Refusing to open" msgstr "" #: ../src/backend/APT/APTRanges.cpp:68 msgid "Unable to read range table header (aka table separator)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:69 msgid "Unable to read [Ions] contents, should be of form A=B" msgstr "" #: ../src/backend/APT/APTRanges.cpp:70 msgid "Unable to parse number of ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:71 msgid "Number of ions seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:72 msgid "Too many ions in ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:73 msgid "Found ranges block before ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:74 msgid "Number of ranges seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:75 msgid "Unable to read number of ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:76 msgid "Range line was too short, needs 4 entries per line, minimum" msgstr "" #: ../src/backend/APT/APTRanges.cpp:77 msgid "Range line missing required \":\" separator" msgstr "" #: ../src/backend/APT/APTRanges.cpp:79 msgid "Range colour incorrect size, should be 6 bytes" msgstr "" #: ../src/backend/APT/APTRanges.cpp:80 msgid "Range specified as named ion, but ion not found in [Ions] block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:81 msgid "Range had unreadable start value" msgstr "" #: ../src/backend/APT/APTRanges.cpp:82 msgid "Range had unreadable endvalue" msgstr "" #: ../src/backend/APT/APTRanges.cpp:83 msgid "Range name was empty" msgstr "" #: ../src/backend/APT/APTRanges.cpp:84 msgid "Range block had unparsable line, should start with number or range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:85 msgid "Ion block missing" msgstr "" #: ../src/backend/APT/APTRanges.cpp:86 msgid "No ranges found" msgstr "" #: ../src/backend/APT/APTRanges.cpp:87 msgid "Unable to identify the number of basic ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:88 msgid "" "Number of ranges specfied in range block, did not match number of ranges read" msgstr "" #: ../src/backend/APT/APTRanges.cpp:89 msgid "Range block contained line that did not match A=xxx format" msgstr "" #: ../src/backend/APT/APTRanges.cpp:90 msgid "Range had unreadable ion multiplicity" msgstr "" #: ../src/backend/APT/APTRanges.cpp:91 msgid "Unable to read volume from range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:1459 msgid "" "Range headings do not match order of the ions listed in the name " "specifications. The name specification ordering will be used when reading " "the range table, as the range heading section is declared as a comment in " "the file-format specifications, and is not to be intepreted by this program. " "Check range-species associations actually match what you expect." msgstr "" #: ../src/backend/filter.cpp:54 msgid "2D Plot" msgstr "" #: ../src/backend/filter.cpp:56 msgid "Range" msgstr "" #: ../src/backend/filter.cpp:57 msgid "Voxel" msgstr "" #: ../src/backend/filters/transform.h:71 msgid "Ion. Transform" msgstr "" #: ../src/backend/filters/ionColour.h:66 msgid "Spectral Colour" msgstr "" #: ../src/backend/filters/boundingBox.h:76 msgid "Bound box" msgstr "" #: ../src/backend/filters/ionDownsample.h:84 msgid "Ion Sampler" msgstr "" #: ../src/backend/filters/profile.h:131 msgid "Comp. Prof." msgstr "" #: ../src/backend/filters/ionInfo.h:117 msgid "Ion info" msgstr "" #: ../src/backend/filters/dataLoad.h:148 msgid "Pos Data" msgstr "" #: ../src/backend/filters/externalProgram.h:69 msgid "Ext. Program" msgstr "" #: ../data/startup-tips.txt:5 msgid "" "You can reset the main view by tapping the space bar. Hold down modifier " "keys like shift,ctrl to change the axis. Double tap to switch which axis to " "look the other way (+ve or -ve direction)" msgstr "" #: ../data/startup-tips.txt:6 msgid "" "You can delete filters from the tree by selecting them, then tapping delete?" msgstr "" #: ../data/startup-tips.txt:7 msgid "" "Multiple languages are supported? You can translate the program into your " "own language at https://www.transifex.com/projects/p/3depict/" msgstr "" #: ../data/startup-tips.txt:8 msgid "" "Package files can be easily shared to allow others to view your analysis, " "using the File->Export->Package menu item. This will automatically import " "all referenced files (eg pos/rng files) into a single shareable folder" msgstr "" #: ../data/startup-tips.txt:9 msgid "" "You can export plots to SVG \"Vector\" format, for easier editing - edit " "your plots in inkscape!" msgstr "" #: ../data/startup-tips.txt:10 msgid "You can access the manual from the Help menu" msgstr "" #: ../data/startup-tips.txt:11 msgid "You can change filter defaults using the Edit->Preferences menu item" msgstr "" #: ../data/startup-tips.txt:12 msgid "" "You can overlay multiple plots at once, by selecting more than on plot at a " "time (e.g. using Ctrl)" msgstr "" #: ../data/startup-tips.txt:13 msgid "" "Calculations are much faster (more than linear speedup) when working with " "smaller datasets - try sampling, or clipping out a small region to work " "faster, then remove the sampling when you are ready" msgstr "" #: ../data/startup-tips.txt:14 msgid "" "You can abort most calculations either by pressing Escape (OSX/Linux), or by " "using the Abort button (Windows)" msgstr "" #: ../data/startup-tips.txt:15 msgid "" "That anyone can contribute to improving this program, even without knowing " "about computer programming? Reporting bugs helps us to prioritise our work, " "and directs us to fix real problems for all users" msgstr "" #: ../data/startup-tips.txt:16 msgid "" "You can load more than one file at a time, then either operate on them " "separately, or together" msgstr "" #: ../data/startup-tips.txt:17 msgid "" "You can have more than one range file for different parts of your dataset" msgstr "" #: ../data/startup-tips.txt:18 msgid "" "Cameras can be saved and retrieved whenever you like, using the camera tab" msgstr "" #: ../data/startup-tips.txt:19 msgid "" "Subsections of the filter tree can be saved to the \"Stashed filters\" drop-" "down" msgstr "" #: ../data/startup-tips.txt:20 msgid "" "The console tab along the bottom often shows useful messages from filters. " "When new messages appear, a small symbol is shown on the tab" msgstr "" #: ../data/startup-tips.txt:21 msgid "" "The raw data used for any plot can be accessed from the \"Raw\" tab on the " "bottom panel" msgstr "" #: ../data/startup-tips.txt:22 msgid "" "You can ask questions about the program, or using it on your data via our " "forums (https://sourceforge.net/p/threedepict/discussion/general/)" msgstr "" #: ../data/startup-tips.txt:23 msgid "" "By creating a camera, you can switch between orthographic (parallel) and " "perspective views" msgstr "" #: ../data/startup-tips.txt:24 msgid "" "You can open multiple files at once, and get a side-by-side view by " "translating (shifting) one of the datasets to one side" msgstr "" #: ../data/startup-tips.txt:25 msgid "" "From version 0.0.20, vector values in filter properties (e.g. \"(1,0,0)\") " "can be specified using ISO 31-11 spherical coordinates using the following " "notation , with angles in degrees" msgstr "" #: ../data/startup-tips.txt:26 msgid "" "You can change the behavior of filter dragging by holding Ctrl (mac: cmd) or " "Shift whilst dragging? This switches between move, copy and \"splice" msgstr "" #: ../data/startup-tips.txt:27 msgid "" "We like to know where we are being helpful? Please consider writing the " "program and version number in any work you might publish - whether in print " "or online. Alternatively, link to our website, or write to us to let us know " "we helped!" msgstr "" #: ../data/startup-tips.txt:28 msgid "" "You can merge files by placing two \"Pos Data\" filters in series, then " "saving the result?" msgstr "" #: ../data/startup-tips.txt:29 msgid "" "When using the camera 3D cropping tool, you can hold Shift to only move the " "centre node in one axis (up/down or left/right).)" msgstr "" 3Depict-0.0.22/translations/3Depict_fr_FR.mo0000644000175000017500000012530213451742525020114 0ustar pcuserpcuserh\5&p3q3F33fH444 4 44455.5335mg555 55 6 *666J6P6X6^6|666666666 7 7)7>7 F7 S7 `7m7s7z7G7 7777788&858 H8T8 c8q8 y8 88 8 8 8 888 8<8 09>9F9 V9 c9o99 9&99 9 9 999::/: A:M:R::W::: :: : :: : ::: ;$;u-;;;; ; ;;;&;!<:<J<a< s<< <<<<<<<<< =V =c= k=w== =$=$=6=1>F> L>Y> q>}>>>>>>> > > ???7?ToTlUUUUUU U UUUU U V V V ,V8VSViV|VV VVVVVVV V VV W )W 6WBWXW kWyWW WW W W W WWWX@+XlX }X X8X XXX XX%Y!5Y WY:cY*YY YYYZ Z $Z .Z 8ZBZ QZ_ZgZwZZ ZZ Z ZZ ZZ ZZ ZZZZ [[ [ /[;[B[ G['Q[ y[[j\\'\\\\]']RF]]]] ]] ]] ^ ^O"^'r^V^^) _+4_%`_b_2_2`2O`A`%`` a#a&Aa'ha)a aXa4b;Cb_b1bcc0c8c?c[cdc6{cc c cc cccc dd ,d9d\Qdd d[d8eVe_eae`cee e e eeeff*f;fMf]f mf zf f f f ffffff)ff gTgdghglgpgtgxg|gxghOi`iEi1j'7j_j vjjjj jjFjkkkkkk kl #l -l7l@l_lul{llllllmm #m1m Mm Wmemtm m mmIm m mnn'n8nInZnlnnnn n nnn n n o oo+oBoEUoooo o o oo p% p2p:pLp\pmp$pppppppGqKq\qaqsqqq qqqqq r rrrrrrr%rs..s]s |sss sss sstt%tDtWt`titu{tt tu#u 4u,Bu'ouPuuv vv 4v Avbvqvvvvvvv vw%w 4w>wGwPwXw kw&ywww w www wwwxx4x=xZxux'xbxyD%zjzrz vzz zzz&zz*{|+{${&{Q{%F|Bl| ||;|l+}!}c}3~&R~'y~F~,~%*PW!p"2"M p| $ǀ $,(Qzf5'9IYqz ˂ ق  (2N Safdlу( # 6CGK Z do ń΄ Ԅ z '.VWmŇڇ  7' _ lz Ĉ5و*@ DP_dm& 3 #TPxɊ)))9 cqw  ‹ Ћ ܋ & =I`^uԌ9PX hr 6 -)\W Ž ߎ   1A3S ?( & 3? G T+b):/#)B ` kw.ȑݑ'8}HJƒ ēГ  4 @ L Xcw ˔ޔ( 1 ;E(Lu(֕ !.?Nct̖1R0 V(:Qo8.ĘN=T ܙ  & 6BJR Zgo ~ Țؚ ޚ-=CI;[ v|:8Ӝ 'Cb%y^<Q do  S3} 18,&S;֠;;NQ9ܡ@@W.33.I{xO ]3 4H%\ "Y '7 @MTgy y¦< DoN;  ] ik {Ψ1Lf x̩өש۩ߩ4 (^: Oh ;jI{x0r58d-Vp z\ <'H-s5N ,+V032Dd~~< ]0 WTu6WQ6y=muA9R18  %ZZY^t*1aQ1b@U])EG]QgA(a!e,%zWIjNscH ?qC[[6`+E8K__*D.I?4Yao!{B2Pf4kS_?rJCwn=R(& )4}`O%$+h*CwJ;>tL,(>U39/.' n7F|$/:#=Ni FX:'y[e.KPqk@MX<f!Th:3cAlM7lJS| dRSEYGM G&LxBBfi9Z^ H>K$7oO@#p&`\}P2g"^eDmL;"FT\"V v X- b5)bc#Ug/v Config Load: --------------------------- Parameter selection notice ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this. In theory it is possible to "join" the clusters, but this has not been implemented for speed reasons. RDF as it was not recognised cannot use. clusters does not exist does not exist. Skipping found online. is up-to-date. of points were un-analysable. These have been dropped points were unable to find neighbour points that exceeded the search radius, and thus terminated prematurely% Done% Done (Esc aborts)&About...&Axis Ctrl+Shift+I&Background Colour... Ctrl+B&Contact...&Control Pane Alt+C&Edit&Export&File&Fullscreen mode Ctrl+Shift+F&Fullscreen mode F11&Help&Help... Ctrl+H&Image... Ctrl+I&Legend Ctrl+L&Merge... Ctrl+Shift+O&Open... Ctrl+O&Plot List Alt+P&Plot... Ctrl+P&Preferences&Quit Ctrl+Q&Raw Data Pane Alt+R&Recent&Redo Ctrl+Y&Save Ctrl+S&Undo Ctrl+Z&View(fast)(slow)---------------------------------------------------------------------- --Counts---merge10 minutes ago10 seconds ago15 minutes ago20 minutes ago30 minutes ago30 seconds ago3D Post-processing3D lighting45 minutes ago5 minutes agoAbortedAborting...Across dirAcross directionActive Ion Active Rng AlgorithmAligned boxAll IonsAll Ions (conc)All RangesAn auto-save state was found, would you like to restore it?.Anaglyph ModeAnalyseAnalysisPackageAnd so on...Angle (Deg)Angular step (deg)Animation progressAnnotationAre you sure you wish to exit 3Depict?ArrowArrow+TextAuto Min/MaxAuto RefreshAutosaveAutosave complete.Available DataAvailable FiltersAvailable stashesAvg. WindowAxisBarsBase state node missing. Is this really a state XML file??Baseline SeparationBlueBound boxBoundbox CentreBounding BoxBox ColourBuildBuild BulkBuild CoreBulkBulk Link (Envelope) distBulk RangesBy CountBy Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*.svg|PNG File (*.png)|*.png|All Files (*)|*CacheCamCameraCamera NameCamera SpeedCamera data informationCamera zooming rate.Cameras section missing "active" node.Change background colourChemistry Dist.Chemistry DistributionChoose resolutionClassify CoreClassify Knn MaxCleanup inputClippingCluster AnalysisClustering ParamsColdCollapse the filter treeCollateColourColour Colour MapColour based 3D effect enable/disable - requires appropriate colour filter 3D glasses.CommandComp. Prof.Compiled with wx Version: Compos. ProfilesCompositionsCompositions (fractional, core only)Compositions (fractional, core+bulk)Config file present, but is not valid (root node test)Confirmation requestCons.Control PaneConvex Volume (len^3): Convex hullCopy raw data to clipboardCopyingCopying referenced filesCoreCore Classify DistCore Link + ErodeCore Link DistCore RangesCorner offsetCountCountsCreated new filter tree stashCropCyclicCylinderDataDefault colourDenominatorDetailed view of selected rangeDetailsDigit FormatDist MaxDist. Log ScaleDist. MaxDistanceDownsamplingDrawDraw SizeDrop unrangedDuplicate effect foundE&xitEmpty stash name for stash Enable Anaglyphic StereoEnable CroppingEnable cropping post-process effectEnable/Disable automatic updates of data when filter change takes effectEnable/Disable lighting calculations in rendering, for objects that request this. Lighting provides important depth cues for objects comprised of 3D surfaces. Disabling may allow faster rendering in complex scenesEnable/disable visual effects on final 3D outputEnabledEndEnd rng Erase stashed itemErodeErode DistErr. EstimatorError - Found NaN in pos fileError copying fileError interpreting field in fileError interpreting range file header, expecting ion count and range count, respectively.Error loading fileError loading file: Error loading state file. See console for more info.Error opening fileError opening file, check name and permissions.Error opening pos fileError processing node: Error re-opening file, after first scanError reading colour data in the file, expecting 3 decimal values, space separated.Error reading effect : Error reading file, unexpected format, are you sure it is a proper range file?Error reading from pos file (after open)Error reading the long name for ion.Error reading the short name for ion.Error saving file. Check output dir is writable.Error whilst reading file contentsExit ProgramExpand the filter treeExportExport AnimationExport Current 3D ViewExport Current PlotExport Ion DataExport Pos DataExport RangeExport Range DataExport RangesExport Voxel DataExport analysis packageExport:Ext. ProgramExtern. Prog.ExtremaFailed reading range file.Failed to allocate parserFast and weak randomisation.Field of View (deg)FileFile : File already exists, overwrite?File readback check failedFile typeFiles have been referred to using relative paths. Keep relative paths?Filesize during readback appears to be zero.Filter CountFilter StashesFilter cachingFilter settingsFilteringFixed Bin NumFlip ChannelsFolder creation failedFont SizeFor stash Found :FractionFrame countFreq. ProfileFrequencies (core+bulk)GeneralGlasses colour modeGreenGreen-MagentaGreyHotIf you want this, please contact the author, or just use the source to add this in yourself.Image progressIncorrect number of fields in fileIndexInformation about this programInvert ClipIonIon Ion ColourIon InfoIon NameIon SamplerIon TransformIon infoIon&s... Ctrl+NIon. TransformIonID IonsIsosurfaceIsovalueJetLets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffLimitation on the screenshot dimension; please ensure that both width and height exceed the initial values, or that they are smaller than the initial values. If this bothers, please submit a bug.Line thicknessLinesList of available filtersList of rangefiles in filter treeLoad Limit (MB)Load data source (file->open) before choosing a new filterLoad errorLocal DensityLockLock Axis MagLock Axis Mag.LogarithmicManual not found locally. Launching web browserMap EndMap endMap startMass CentreMaxMax SizeMax. Ram usage (%)Max. Sep + ErodeMemory allocation failure on POS loadMerge other fileMerged file.MinMin SizeMixed dataModeMonitorMove RateMoving avg.NN Freq.NN MaxNew camera name...Next fullscreen mode: with toolbarsNo data to saveNo filter stashes to edit.No filters means no data to exportNo numerical data foundNo plot available. Please create a plot before exporting.No plots selected.No range data. Can't cluster.No ranges selected for cluster "bulk". Cannot continue with clustering.No ranges selected for cluster "core". Cannot continue with clustering.Noise TypeNoneNone (Raw count)NormaliseNormalise byNot availableNum BinsNum ColoursNum RangesNum XNum YNum ZNumber Density (\#/Vol^3)Number of framesNumber of points : NumeratorOnline Check: Online UpdatesOnline access for non win32/apple platforms is intentionally disabled, Open contact pageOpen state fileOpenGL FailedOpening contact page in external web browserOriginOrigin modeOrthogonalOut FractionOutput CountOverwrite?P&lot...PNG File (*.png)|*.png|All Files (*)|*POS DataPac&kage... Ctrl+KPackage directory namePackage folder already exists, won't overwrite.Package folder creation failed check writing to this location is possible.Package namePanel DisplayParamPer SpeciesPerspectivePlanePlane NormalPlotPlot ColourPlot ListPlot TypePlotting functions returned an error: Point CloudPointsPos DataPos file emptyPos file size appears to have non-integer number of entriesPos load aborted by interrupt.Position APosition BPostPostprocessPreferencesPress enter to restore cameraPress enter to restore stashPress enter to store new cameraPress enter to store new stashPrimitiveProgram limitationProgram text outputProjectionPropertyPseudo-RandomQuick and dirty analysis for point data.Radial DistanceRadial DistributionRadiusRan&ges... Ctrl+GRangeRange FileRange SourcesRange StartRange endRange file appears to be empty, check file is a proper range file and is not empty.Range file appears to be inconsistent (eg, overlapping ranges)Range file appears to contain malformed data, check things like start and ends of m/c are not equal or flipped.Ranged Density (pts/vol):RangesRangingRatio (Num/Denom)RawRaw Data PanelRe-CollateRectilinearRectilinear Bounds : Red-BlueRed-CyanRed-GreenReflexiveRefresh Aborted.Remember lastRemove DistRemove the selected cameraRendering sequence...Rendering tiles...RepresentationResetReset AllRestored camera: RotateRotate +Rotate-RulerSave &As... Ctrl+Shift+SSave Data...Save Image...Save current state to new fileSave errorSave plot...Save pos...Save raw data to fileSave state to fileSave state...Save voxels...Saved 3D View :Saved ions: Saved package: Saved plot: Saved state: Saving Image Scale Fact.Security warningSelect Data or State File...Select RNG File...Select an item from the filter tree before choosing a new filterSelect voxels...Selected DataSelectionSet the method of panel layout when starting the programShow AngleShow BarShow PrimitiveShow SelectedShow all panelsShow all panels when starting programShow help files and documentationShow markerShow panels visible at last shutdown when starting programShow selected panels when starting programShuffleSize CroppingSize DistributionSmooth && translucent objectsSourceSource FilterSpacing XSpacing YSpacing ZSpat. AnalysisSpatial NoiseSpecifySpectral ColourSpectrumSphereSphere sizeSpliceSpot sizeStandard dev.StartStart rng StartupStash NameStashed FiltersStashed TreesStemStepsStereoStop ModeStored camera: Surface RemoveTapsim DataTargetTextText DataText File (*.txt)|*.txt|All Files (*)|*Text sizeThis file is a "state" file for the 3Depict program, and stores information about a particular analysis session. This file should be a valid "XML" fileThis state file contains filters that can be unsafe to run Do you wish to remove these before continuing?.Tip: You can use ctrl to mergeTip: You can use ⌘ (command) to mergeToggle Legend displayToggle World Axis displayToggle left control paneToggle plot listToggle raw data pane (bottom)Too many ranges appeared to have range entries with no usable data (eg, all blank)ToolsTotal (incl. unranged) Total Density (pts/vol):Total Ranged Transform ParamsTranslateTranslate ValueTranslationTransparencyTried skipping to table separator line (line with dashes), but did not find it.Unable to allocate memory to store dataUnable to allocate requested memory. Try a lower resolution, or save as vector (SVG).Unable to compute volumeUnable to create stash, selection invalidUnable to find or interpret "showaxis" nodeUnable to find the "backcolour" node.Unable to initialise the openGL (3D) panel. Program cannot start. Please check your video drivers.Unable to interpret "backColour" node's "b" value.Unable to interpret "backColour" node's "g" value.Unable to interpret "backColour" node's "r" value.Unable to interpret property "value" for "cameras->active" node.Unable to interpret recent file entryUnable to load autosave file..Unable to load fileUnable to locate "filtertree" node.Unable to locate stash name for stash Unable to read file contents after openUnable to read range start and end valuesUnable to read range table entryUnable to retrieve root node in input state file... Is this really a non-empty XML file?Unable to saveUnable to save. Check output destination can be written to.Unexpected failure whilst trying to skip over range lead-in data (bit before range start value)Unknown file extension. Please use "svg" or "png"UnrangedUnrecognised effect :Up Dir.Up dirUpdate Notice: New version Updated.Use camera coordinatesUse shift/ctrl-space or double tap to alter reset axisValueValue LabelValue ShuffleValue2View sizeVolumeVolume (Density)Volume (len^3): VoxelVoxel Limits (min,max): (VoxelisationWARNING: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warning,Warning, Warning, unparseable version number in state file. File reading will continue, but may failWarning: Your configuration file appears to be invalid: Work DirXYYou can do this; thats OK, but the output is no longer independent of the computational process;ZZoom Ratea day agoa decade agoa few days agoa few decades agoa few hours agoa few minutes agoa few months agoa few seconds agoa few weeks agoa few years agoa minute agoa month agoa second agoa week agoa year agoan hour agocountdXdYdZerrorfile reading will continue, but may fail.in the future?moments agoregardless of the settings you use here. Use your package manager to keep up-to-datex-yx-zy-xy-zz-xz-y§Cons.Project-Id-Version: 3Depict Report-Msgid-Bugs-To: POT-Creation-Date: 2019-01-06 14:48+0000 PO-Revision-Date: 2017-09-19 12:00+0000 Last-Translator: mycae Language-Team: French (http://www.transifex.com/mycae/3depict/language/fr/) Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); Config Charge:. --------------------------- Avís de sélection du paramètre -------------. Si votre inter-distance de groupe est suficientment grand (plus grand que votre bulk raccordant distance), alors te peux escapar avec ce. En théorie est possible à implementat pour des raisons de vitesse. RDF Tandis que ne va pas être recognised Ne peut pas utiliser. Groupes N'existe pas N'existe pas. Skipping Trouvé en ligne. Est actuel.sur Les Points étaient un-analysable. Ceux-ci ont été laissés tomber Les Points étaient incapaços de trouver des points de voisin qu'ont surpassé la recerca radius, et pour ce terminated prematurely \% Fait\% Fait (Esc avorta)À &propos de...&Axe Ctrl+Shift+je &Couleur de fond... Ctrl+B. &Contact...&Contrôle Pane Grand+Cème É&dition&Exporter&Fichier&Fullscreen Mode Ctrl+Shift+F &Fullscreen Mode F11 Aid&e&Aide... Ctrl+H. &Image... Ctrl+Je. &Légende Ctrl+L &Fusionne... Ctrl+Shift+O. &Ouvert... Ctrl+O. &Liste de trama Grand+P &Trama... Ctrl+P. &Préférences&Quit Ctrl+Q &Donnée crue Pane Grand+R &Récent &Redo Ctrl+Y &Sauve Ctrl+S &Défait Ctrl+Z &Affichage(Rapide) (Lent) ----------------------------------------------------------------------. --Compte-- -Fusionner Fait 10 minutes Fait 10 secondes Fait 15 minutes Fait 20 minutes Fait 30 minutes Fait 30 secondes Post-traitement 3D3D enllumenat Fait 45 minutes Fait 5 minutes InterrompuAbandon...à travers dire à travers dire Ió actif. Actif Rng. AlgorithmeAligned Caisse Tous les Ions Tous les Ions (conc) Toutes les Gammes Une voiture-sauver l'état a été trouvé, te plaît le restaurer?.Anaglyph Mode Analyse AnalysisPackage Etcètera...Angle (deg) Angle (deg) Progrès d'animation AnnotationT'est sûr souhaites sortir 3Depict? FlècheTexte+de flèche Voiture Min/maxVoiture Refresh Enregistrement automatiqueEnregistrement automatique terminé.Donnée disponible Filtres disponiblesDonnée disponible Avg. Fenêtre AxeBarresNoeud d'état de base manquant. Est-ce vraiment un fichier d'état XML?Baseline écart BleuCaisse attachée Boundbox Centre Tracé selon enveloppeCouleur de caisse ConstructionComplexió Bulk Noyau de complexió Bulk Bulk Lien (Enveloppe) Dist Bulk Gammes Pour Compter Pour Extension (svg,png)|*.svg;*.png|Scalable Archives de Graphiques du vector (*.svg)|*.svg|PNG Archives (*.png)|*.png|Toutes les Archives (*)|* CacheLève Appareil photoNom de càmera Vitesse de càmera Information de donnée de la càmera Taux de caméra zoom Impossible de localiser le "filtertree" noeud.Couleur de fond du changement Chimie Dist.Distribution de chimie écueil résolution Classe Noyau Classe Knn Max Cleanup Rentrée SaturationAnàlisi de groupe Clustering Params FroidArbre de filtre nouveau créé stash Copies assembléesCouleursCouleursCarte de couleur Couleur basée sur les effets 3D d'activer / désactiver - exige appropriées de filtrage de couleur des lunettes 3D.CommandeComp. Prof.Compilat avec wx Version:. Compos. Profils Compositions Compositions (fraccionari, le noyau unique) Compositions (fraccionari, noyau+bulk) Fichier de configuration présente, mais n'est pas valide (test de nœud racine)Petició de confirmació Contres.Contrôle Pane Convex Volume (len^3): Convex hull Copie donnée crue à clipboard Copie en coursCopie de fichiers référencésNoyauLe Noyau Classe Dist Lien de noyau + Erosiona Lien de noyau Dist Gammes de noyau Offset de coin DécompteCompte Arbre de filtre nouveau créé stash DécouperCycliqueCylindreContenuDefault Couleur. DénominateurVue detallada de gamme sélectionnée DétailsFormat de dígitDist Max Log échelle Dist MaxDistanceDownsampling NulMida de sorteig Goutte unranged Effet de doublé a trouvé &QuitterVide stash nom pour stash. Activer stéréo anaglypheActiver recadrageActiver culture post-traitement d'effetHabilitar/Impossibilitar automatique actualitza de donnée quand changement de filtre prend effet Activer / Désactiver les calculs d'éclairage dans le rendu, pour les objets qui demandent cela. Eclairage fournit des indices importants pour la profondeur des objets constitués de surfaces 3D. Désactivation peut permettre un rendu plus rapide dans des scènes complexesActiver / désactiver les effets visuels sur la production 3D finaleActivéFinFin rng. Stashed Filtres ContracterErosiona Dist Err. Estimador Erreur - Trouvée NaN en pos archives L'Erreur que copia archives L'Erreur qu'interprète champ en archives L'Erreur qu'interprète encapçalament d'archives de la gamme, en attendant l'ió compte et la gamme compte, respectivement.Erreur lors du chargement du fichierErreur lors du chargement du fichier :Fichier d'état d'erreur de chargement. Voir la console pour plus d'informations.Erreur lors de l'ouverture du fichierArchives d'ouverture de l'erreur, nom de contrôle et permissions.L'Erreur qu'oeuvre pos archives L'Erreur que processa node:. Erreur re-archives d'ouverture, après que premier scanner Donnée de couleur de lecture d'erreur en le archives, en attendant 3 valeurs decimals, l'espace a séparé.Effet de lecture de l'erreur :. Archives de lecture de l'erreur, format inattendu, t'est sûr est un archives de gamme approprié? Erreur de lecture du fichier pos (après ouverture)L'Erreur que lit le nom long pour ió.L'Erreur que lit le nom court pour ió.Archives d'estalvi de l'erreur. Sortie de contrôle dire est writable.Erreur whilst en lisant contenus d'archives Programme de sortie Arbre de filtre nouveau créé stash ExportAnimation d'exportation Courant d'exportation 3Dème Vue Exportation Trama Actuelle Donnée d'Ió de l'exportation Exportation Pos Donnée Exporter la plageDonnée de Gamme de l'exportation Gammes d'exportation Exportation Voxel Donnée Colis d'anàlisi de l'exportation Exporter :Ext. Programme Extern. Prog.ExtremaArchives de gamme de lecture failli.Failli à allocate parser Randomisation rapide et faible.Champ de Vue (deg) FichierArchives :. Le Archives déjà existe, écraser?Archives readback le contrôle a failli Type de fichierLes Archives ont été referred à utiliser des chemins relatifs. Il entretient des chemins relatifs? Filesize Pendant readback apparaît pour être zéro.Le Filtre Compte Filtre Stashes Filtre caching Paramètres de filtrageFiltrageGalleda fixe Num Canals de ditada Création du dossier n'a pasTaille de fontePour stash. Trouvé : FractionNuméro de l'imageFreq. Profil Fréquences (noyau+bulk) GénéralMode de couleur des verres VertVert-Magenta GrisChaudSi veux ce, si vous plau contactar l'auteur, ou seulement utiliser la source pour ajouter cet en tu.Progrès d'image Incorrect Numéro de champs en archives IndexInformation enveloppe ce programme Invert Clip IonIonCouleur d'ió Ió Info Nom d'ió Mostrejador d'ió L'Ió Transforme Ió info Ió&s... Ctrl+N. Ió. Il transforme IonID. Ions Isosurface Isovalue JetLaisse le programme constate l'internet pour voir si actualitza à la version de programme est disponible, alors te notifica environ actualitza de tellement de en tellement de.Niveau de la séparation entre les images gauche et droite, qui définit la profondeur 3D à compromis distorsion visuelleLimitation en le screenshot dimension; si vous plau assurer qu'ambdues amplada et la levée surpassent les valeurs inicials, ou que sont plus petits que les valeurs inicials. Si ce dérange, si vous plau entregar un bug.Gruix de ligne LignesListe de filtres disponibles Liste de rangefiles en arbre de filtre Limite de charge (MB) Source de donnée de la charge (archives->ouvertes) avant de choisir un filtre nouveau Erreur de chargementDensité locale VerrouillerAxe de pany Mag.Axe de pany Mag.LogarithmiqueManuel pas trouvé localement. Lancement navigateur WebFin de carteFin de carte Début de carte Centre de masse MaxTaille max.Max. Bouquet Usage (%) Max. Sep + Erosiona Insuccès d'assignació de la mémoire en POS charge Fusionner autres archives Archives fusionnées.MinTaille min.Donnée mixta ModeMoniteuríndex de mouvement en Mouvant avg.NN Freq.NN Max Nom de càmera nouvelle...Proche fullscreen mode: avec toolbars Chef donnée pour sauver Chef filtre stashes pour editar.Pas de filtres signifie pas de données à exporterNe la donnée numérique a trouvé Pas d'intrigue disponibles. S'il vous plaît créer un terrain avant d'exporter.Chef trama a sélectionné.Chef donnée de gamme. Il peut ne groupe.Chef gamme a sélectionné pour groupe. Chef gamme a sélectionné pour groupe. Type de bruitAucunChef (Cru compter) NormaliseNormalise Pour Non disponibleNum Galledes Num Couleurs Num Gammes Num Xème Num Y Num Z Densité de numéro (\#/Veut^3) Nombre d'imagesNuméro de points :. NumérateurContrôle en ligne:. En ligne Actualitza Accès en ligne pour ne gagner32/plate-formes de pomme est intencionadament impossibilité,. Page de contact ouvert Archives estatal ouvert OpenGL A failli Ouverture page de contact dans le navigateur web externe.OrigineMode d'origine OthogonalHors Fracció La Sortie Compte Écraser ?P&Parcel·la...PNG Archives (*.png)|*.png|Toutes les Archives (*)|* POS Donnée Pac&kage... Ctrl+K. Nom de directori du colis Carpeta de colis déjà existe, n'overwrite.Création d'un dossier package a échoué vérifier par écrit à cet endroit est possible.Nom du paquetAffichage du tableau de bordArrêtons Pour Espèce PerspectivePlanL'Avion Normal CourbeCouleur de tramaListe de trama Type de graphiquePlotting Les Fonctions vont retornar une erreur:. Nuage de point PointsPos Donnée Pos Archive vide Taille du fichier Pos semble avoir non entier nombre d'entréesPos La Charge avortada pour interrompre.Position Un Position B PublierPostprocess PréférencesLa Presse rentre à pour restaurer càmera La Presse rentre à pour restaurer stash Appuyez sur Entrée pour enregistrer nouvel appareil photoLa Presse rentre à pour stocker nouveau stash ObjetLimitation de programme Sortie de texte du programme ProjectionPropriétéPseudo-Aleatori Anàlisi rapide et sale pour donnée de point.Distance radial Distribution radial RayonA couru&ges... Ctrl+G. PlageArchives de gamme Sources de gamme Début de gamme Fin de périodeArchives de gamme apparaît pour être vide, archives de contrôle est un archives de gamme approprié et ce ne est pas vide.Archives de gamme apparaît pour être inconsistent (eg, solapant gammes) Archives de gamme apparaît pour contenir malformed donnée, choses de contrôle comme début et fins de m/c n'est pas égal ou flipped.Densité variée (pts/veut): Intervallesen Variant Proportion (Num/Denom) BrutPlafó de Donnée crue Re-Acarar RectilinéaireRectiligne Saute : Rouge-Bleu Rouge-Cyan Rouge-Vert Reflexive Refresh Va avortar.Souvient dernier Enlève Dist Càmera restaurée:. Rendering Seqüència...Rendering Dalle...ReprésentationRéinitialiserTout réinitialiserCàmera restaurée:. RotationRotation+Rotation-RègleSauve &Tellement... Ctrl+Changement+S. Sauve Donnée...Sauve Image...Sauvez été actuel à archives nouveau Erreur d'enregistrementSauve trama...Sauve pos...Sauve donnée crue pour archiver Sauve estatal d'archiver Sauve estatal...Sauve voxel...Sauvé 3Dème Vue : Ions sauvés:. Colis sauvé:. Trama sauvée:. été sauvé:. Image d'estalvi. Fait d'échelle.Alerte de sécuritéSélectionner des données ou fichier d'état ...Sélectionne RNG Archives...Sélectionnez un élément de l'arbre de filtre avant de choisir un nouveau filtreSélectionne voxels...Donnée sélectionnée SélectionDéfinissez la méthode de la présentation du panneau lors du démarrage du programmeAngle de spectacle Bar de spectacle Le Spectacle Primitiu Le Spectacle a Sélectionné Spectacle tous les plafons Spectacle tous les plafons quand commençant programme Archives d'aide du spectacle et documentation Spectacle marker Plafons de spectacle visibles à dernier shutdown quand commençant programme Spectacle plafons sélectionnés quand commençant programme MélangerMida Cropping Distribution de mida Objets translúcids objetsSourceFiltre sourceEspacé Xème Espacé Y Espacé Z Spat. Anàlisi Bruit espacial Especifica SpectreSpectreSphèreSphere Mida CollantMida de tache Standard dev.DébutDébut rng. DémarrageStash Nom Stashed Filtres Stashed Arbres Tija EscaliersStéréoMode de chômeuse Càmera stockée:. La Surface Enlève Tapsim Donnée CibleTexteDonnée de texte Archives de texte (*.txt)|*.txt|Toutes les Archives (*)|* Taille texteCe archives est une information enveloppe une séance d'anàlisi particulière Ce archives devrait être un valable. Ce fichier contient l'état des filtres qui peuvent être dangereux à courir Voulez-vous supprimer ces avant de continuer?.Astuce: Vous pouvez utiliser la touche ctrl pour fusionnerAstuce: Vous pouvez utiliser ⌘ (commande) de fusionnerToggle écran de légende Toggle écran Eixa mondial Toggle Contrôle laissé pane Toggle Liste de trama Toggle Donnée crue pane (inferior) Trop varie apparus pour avoir des entrées de gamme sans donnée utilisable (eg, tout espace) OutilsTotal (incl. unranged). Densité totale (pts/veut): Le Total a Varié. Transforme Params TranslaterTraduit Valeur TranslationTransparenceEssayé skipping à table separator ligne (ligne avec dashes), mais ne l'a trouvé.Incapaç à allocate mémoire pour stocker donnée Impossible d'allouer de la mémoire demandée. Essayez une résolution inférieure, ou enregistrer en tant que vecteur (SVG).Incapaç de computar volume Incapaç de créer stash, invalide de sélection Impossible de trouver ou d'interpréter "showaxis" noeudImpossible de trouver le "backcolour" noeud.Incapaç à initialise l'openGL (3D) plafó. Le Programme ne peut pas commencer. Si vous plau constater vos conducteurs de vidéo.Impossible d'interpréter "backColour" noeud "b" de valeur.Impossible d'interpréter "backColour" noeud "g" de valeur.Impossible d'interpréter "backColour" noeud "r" de valeur.Impossible d'interpréter la propriété "valeur" pour "caméras-> active" noeud.Impossible d'interpréter l'entrée des fichiers récentsImpossible de charger le fichier d'enregistrement automatique ..Impossible de charger le fichier d'enregistrement automatique ..Incapaç de localitzar. Incapaç de localitzar stash nom pour stash. Incapaç de lire contenus d'archives après ouvert Incapaç de lire début de gamme et valeurs de fin Incapaç de lire entrée de table de la gamme Impossible de récupérer le nœud racine dans le fichier de l'état d'entrée ... Est-ce vraiment un fichier XML non vide?Impossible d'enregistrerImpossible d'enregistrer. Vérifiez la destination de sortie peut être écrit.Insuccès inattendu whilst en essayant à skip enveloppe avantage de gamme-en donnée (bit avant de valeur de début de la gamme) Extension d'archives inconnu. Si vous plau usage. Unranged Unrecognised Effet : Chef amunt de Dire.Chef amunt de dire Actualitza Avís: version Nouvelle. Mis à jour.Coordenades de càmera de l'usage Changement d'usage/ctrl-aixeta espacial ou double pour altérer axe de reinicialització ValeurEtiqueta de valeur Valeur Shuffle Valeur2 Mida de vue VolumeVolume (Densité) Volume (len^3): Voxel Voxel Limites (min,max): ( Voxelisation AVíS: Skipping node. en Attendant pour refresh pour avortar. en Sortant pourrait porter au programme backgrounding. Sortie de toute façon?. Avís, Avís,. Avís, unparseable numéro de version en archives estatal. Lecture d'archives continuera, mais il peut faillir Attention: Votre fichier de configuration semble invalide: Emploi Dire XYPeux faire ce; thats OK, mais la sortie est déjà n'indépendante du procès computacional; Zíndex de zoom Fait un jour Fait une décade Fait des combien jours Fait des combien décades Fait des combien heures Fait des combien minutes Fait des combien mois il y a quelques secondesFait des combien semaines Fait des combien années il y a une minuteFait un mois Une seconde fait Fait une semaine Fait une année il y a une heurenombredX dY dZ errorLecture d'archives continuera, mais il peut faillir.En le futur? Fait des moments Malgré tout du settings t'utilise ici. Usage votre directeur de colis pour entretenir actuel x-y x-z y-x y-z z-x z-y §Contres.3Depict-0.0.22/translations/3Depict_es_ES.mo0000644000175000017500000012146613451742525020123 0ustar pcuserpcuserY)%P2Q2F`22(3-3 G3 T3^3n333333m3N4U4 i4s44 4444444 55 515@5W5g5x5 5 555 5 5 5555G5 B6M6T6c6r66666 66 66 6 6 7 7 7,757 E7<P7 777 77 77 7&78 8 (858>8Q8`8 r8~88:88 88 88 9 99 !9 ,979<9 V9b9uk9999 9 9 :,#:P:e:~::: :: ::::; ;; ;V%;|; ;;; ;$;$;6<J<_< e<r< <<<<<<<< = =%=+=2=P=U=\=e= j=v== ==== == = ==> >(>A>#Q>Hu>>? @0@@@@@ @@A,A ?AX`AAA4AB/)BYBpB'BSBCNC(kC$C%C0C"D 3D@DGDXDoDDD DD DDD D D EE.EHEeEyE~EEE EFE,F ?FLF[FjF zF FF FF F FFF F FGG&G:G @GNGSG\WGG"GGG HHH H+H4H =H IHWH`HpHHH HHHHd.IIYJhJnJ!JJ:J J KK K!K 0K/QIQ NQ ZQfQQQQ QQQ RR %R(3R\RlRRRRR R R R RSR>*SoiSSSSTTT 'T 2T>TTT]T fT pTzT T TTTTT TTTUUUU 6U CUQU pU {U UUU UU UU U V V !V-V>V[V@nV V V8V W WW #W1W%AW!gW W:W*WW XX#XAX HX VX `X jXtX XXXX X XX X XX XX XY Y7"YZY_YeY lYvYYY YYY Y'Y YjY \ZiZ'ZZZZZ [R)[|[[[ [[ [[ [ [O\'U\V}\\)\4]bL]%]]&]'^)C^ m^X^^;^_2________6_3` 9` E`S` Z`d`l`s```` ``\`7a @a[Ja8aabbb`bc c c c#c2cDcTcfcwccc c c c c c ccccc)d*d 9dTEdddddddddCfNSff?gDg^grg zggg gg6g}gth}h hhh hhh hi! i-iEiLi]ipiiiii i ii j j !j/j?jDjLjGTj j jjjjjjkk(k7kGkVk _k lk yk k kkkkFk l)l1lAlQl Ylgl ~l$lll l lllm m(m,mN5mmmm mmm m mmnn n >n InTnnnnno o3:onoooooooppp+p 1pxx<x&yDy:`ycyy\z5{z+z+zD {*N{y{{{"{{{|%|4|T|'j| | | || |||}0} 8} B}"c}}X}0} ~1~@~O~i~ q~ ~ ~~~ ~ ~ ~~  (0K Q_dcm&  4@E K Yc r ŀ ˀր߀vڂ'8NNǃ݃ = > JVet x4ބ  &+3 IW`g&#…3J9% džՆ݆  $ 0 :DJPVu Ż'C [>i Ȉۈ 3 CO b,]!9 ? KW]nv & ߊG#X |  *(0 .; jt! Ì2Ԍ-39OUeu hEx@֎ ݎ $ /; Q [ e pz Տ %,2 N\#n  /ASdv$Mّ' 9?D̒63:nM>Г/Gcj |  ”͔֔ ݔ  &2 ;HXDi•ѕ   8,enu+2 S!qŗb HUm Ø ϘSݘ.1a`™/ޙ9~H2ǚ$-9M/*lOJaq'= L Z {@  %19L^d n  l.@ܟ j  "/@XsС - = JV]`c2f `"&*.G@nk@r.- 4r&o^?1vlw*1'//iLZ]55DRp+c>X43e=@G YJ93[Nw;|N hC!jpI GUFT I(Wi}+qu,PM0-dIJVT_PA<HjSUyVs7U"s?5# OV *H O^DYWE]L'om`)4c1=N7M*E%qFB  &hXB< "k)9_O#{:PMK2Df8B%8Q8y#Jm{d XC3ATntbb6\9:f  <}2!R`,|(.Qg uYC=R'[0lHLAK~QW;+!a.7?:v;F/,6->Kz6&Et0x~%$eZ g(zx\ $Sa">)2S$ Config Load: --------------------------- Parameter selection notice ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this. RDF as it was not recognised cannot use. clusters does not exist does not exist. Skipping found online. is up-to-date. of points were un-analysable. These have been dropped points were unable to find neighbour points that exceeded the search radius, and thus terminated prematurely% Done% Done (Esc aborts)&About...&Axis Ctrl+Shift+I&Background Colour... Ctrl+B&Contact...&Control Pane Alt+C&Edit&Export&File&Fullscreen mode Ctrl+Shift+F&Fullscreen mode F11&Help&Help... Ctrl+H&Image... Ctrl+I&Legend Ctrl+L&Merge... Ctrl+Shift+O&Open... Ctrl+O&Plot List Alt+P&Plot... Ctrl+P&Preferences&Quit Ctrl+Q&Raw Data Pane Alt+R&Recent&Redo Ctrl+Y&Save Ctrl+S&Undo Ctrl+Z&View(fast)(slow)---------------------------------------------------------------------- --Counts---merge10 minutes ago10 seconds ago15 minutes ago20 minutes ago30 minutes ago30 seconds ago3D Post-processing3D lighting45 minutes ago5 minutes agoAbortedAborting...Active Ion Active Rng AlgorithmAligned boxAll IonsAll Ions (conc)All RangesAn auto-save state was found, would you like to restore it?.Anaglyph ModeAnalyseAnalysisPackageAnd so on...AngleAngle (Deg)Animation progressAnnotationAre you sure you wish to exit 3Depict?ArrowArrow+TextAuto RefreshAutosaveAutosave complete.Available DataAvailable FiltersAvg. WindowAxisBarsBase state node missing. Is this really a state XML file??Baseline SeparationBin Width, YBlueBound boxBoundbox CentreBounding BoxBox ColourBuildBuild BulkBuild CoreBulkBulk Link (Envelope) distBulk RangesBy CountBy Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*.svg|PNG File (*.png)|*.png|All Files (*)|*CacheCamCameraCamera NameCamera SpeedCamera data informationCamera translation, orbit and swivel rates. Camera zooming rate.Change background colourChemistry Dist.Chemistry DistributionChoose resolutionClassify CoreClassify Knn MaxCleanup inputClippingCluster AnalysisColdCollateColourColour Colour MapColour based 3D effect enable/disable - requires appropriate colour filter 3D glasses.CommandComp. Prof.Compiled with wx Version: Compos. ProfilesCompositionsCompositions (fractional, core only)Compositions (fractional, core+bulk)Config file present, but is not valid (root node test)Confirmation requestCons.Control PaneConvex Volume (len^3): Convex hullCopy raw data to clipboardCopyingCopying referenced filesCoreCore Classify DistCore Link + ErodeCore Link DistCore RangesCorner offsetCountCountsCreated new filter tree stashCropCyclicCylinderDataDenominatorDetailed view of selected rangeDetailsDigit FormatDisplayDist MaxDistanceDownsamplingDrawDraw SizeDrop unrangedDuplicate effect foundE&xitEmpty stash name for stash Enable Anaglyphic StereoEnable CroppingEnable cropping post-process effectEnable/Disable automatic updates of data when filter change takes effectEnable/Disable lighting calculations in rendering, for objects that request this. Lighting provides important depth cues for objects comprised of 3D surfaces. Disabling may allow faster rendering in complex scenesEnable/Disable weak randomisation (Galois linear feedback shift register). Strong randomisation uses a much slower random selection method, but provides better protection against inadvertent correlations, and is recommended for final analysesEnable/disable all ions for bulkEnable/disable visual effects on final 3D outputEnabledEndEnd rng ErodeErode DistErr. EstimatorError - Found NaN in pos fileError copying fileError interpreting field in fileError interpreting range file header, expecting ion count and range count, respectively.Error loading fileError loading file: Error loading state file. See console for more info.Error opening fileError opening file, check name and permissions.Error opening pos fileError processing node: Error re-opening file, after first scanError reading colour data in the file, expecting 3 decimal values, space separated.Error reading effect : Error reading file, unexpected format, are you sure it is a proper range file?Error reading from pos file (after open)Error reading the long name for ion.Error reading the short name for ion.Error saving file. Check output dir is writable.Error whilst reading file contentsExit ProgramExportExport AnimationExport Current 3D ViewExport Current PlotExport Ion DataExport Pos DataExport RangeExport Range DataExport RangesExport analysis packageExport:Ext. ProgramExtern. Prog.ExtremaFailed reading range file.Failed to allocate parserFast and weak randomisation.Field of View (deg)FileFile : File already exists, overwrite?File readback check failedFile typeFiles have been referred to using relative paths. Keep relative paths?Filesize during readback appears to be zero.Filter CountFilter StashesFilter cachingFilter settingsFilteringFixed Bin NumFixed Tick NumFlip ChannelsFolder creation failedFont SizeFor stash Found :FractionFrame countFreq. ProfileFrequencies (core+bulk)GeneralGlasses colour modeGreenGreen-MagentaGreyHotIf you want this, please contact the author, or just use the source to add this in yourself.Image progressIncorrect number of fields in fileIndexInformation about this programInvert ClipIonIon Ion ColourIon InfoIon NameIon SamplerIon TransformIon infoIon&s... Ctrl+NIon. TransformIonID IonsIsosurfaceIsovalueJetLets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffLimitation on the screenshot dimension; please ensure that both width and height exceed the initial values, or that they are smaller than the initial values. If this bothers, please submit a bug.Line thicknessLinesList of available filtersList of rangefiles in filter treeLoad Limit (MB)Load data source (file->open) before choosing a new filterLoad errorLocal DensityLockLock Axis MagLock Axis Mag.LogarithmicManual not found locally. Launching web browserMap EndMap endMap startMass CentreMaxMax SizeMax. Ram usage (%)Max. Sep + ErodeMemory allocation failure on POS loadMerge other fileMerged file.MinMin SizeMixed dataModeMonitorMove RateMoving avg.NN Freq.NN MaxNew camera name...Next fullscreen mode: with toolbarsNo data to saveNo filter stashes to edit.No filters means no data to exportNo numerical data foundNo plot available. Please create a plot before exporting.No plots selected.No range data. Can't cluster.Noise TypeNoneNone (Raw count)NormaliseNormalise byNot availableNum BinsNum ColoursNum RangesNum TicksNum XNum YNum ZNumber Density (\#/Vol^3)Number of framesNumber of points : NumeratorOnline Check: Online UpdatesOnline access for non win32/apple platforms is intentionally disabled, Open contact pageOpen state fileOpenGL FailedOpening contact page in external web browserOriginOrigin modeOrthogonalOut FractionOutput CountOverwrite?P&lot...PNG File (*.png)|*.png|All Files (*)|*POS DataPac&kage... Ctrl+KPackage directory namePackage folder already exists, won't overwrite.Package folder creation failed check writing to this location is possible.Package namePanel DisplayParamPer SpeciesPerspectivePlanePlane NormalPlotPlot ColourPlot ListPlot TypePlot colourPlotting functions returned an error: Point CloudPointsPos DataPos file emptyPos file size appears to have non-integer number of entriesPos load aborted by interrupt.Position APosition BPostPostprocessPreferencesPress enter to restore cameraPress enter to restore stashPress enter to store new cameraPress enter to store new stashPrimitiveProgram limitationProgram text outputProjectionPropertyPseudo-RandomQuick and dirty analysis for point data.Radial DistanceRadial DistributionRadiusRadius.Ran&ges... Ctrl+GRangeRange FileRange SourcesRange StartRange endRange file appears to be empty, check file is a proper range file and is not empty.Range file appears to be inconsistent (eg, overlapping ranges)Range file appears to contain malformed data, check things like start and ends of m/c are not equal or flipped.Ranged Density (pts/vol):RangesRangingRatio (Num/Denom)RawRaw Data PanelRe-CollateRectilinearRectilinear Bounds : Red-BlueRed-CyanRed-GreenReflexiveRefresh Aborted.Remember lastRemove DistRendering sequence...Rendering tiles...RepresentationResetReset AllRestored camera: RotateRotate +Rotate-RulerSave &As... Ctrl+Shift+SSave Data...Save Image...Save current state to new fileSave errorSave plot...Save pos...Save raw data to fileSave state to fileSave state...Saved 3D View :Saved ions: Saved package: Saved plot: Saved state: Saving Image Scale Fact.Security warningSelect Data or State File...Select RNG File...Select an item from the filter tree before choosing a new filterSelected DataSelectionSet the method of panel layout when starting the programShow AngleShow BarShow PrimitiveShow SelectedShow all panelsShow all panels when starting programShow help files and documentationShow markerShow panels visible at last shutdown when starting programShow selected panels when starting programShuffleSize CroppingSize DistributionSmooth && translucent objectsSourceSource FilterSpacing XSpacing YSpacing ZSpat. AnalysisSpatial NoiseSpecifySpectrumSphereSphere SizeSphere sizeSpliceSpot sizeStandard dev.StartStart rng StartupStash NameStashed FiltersStashed TreesState was created by a newer version of this program.. StemStepsStereoStop ModeStored camera: SurfaceSurface RemoveTapsim DataTargetTextText DataText File (*.txt)|*.txt|All Files (*)|*Text sizeThis state file contains filters that can be unsafe to run Do you wish to remove these before continuing?.Tick SpacingTip: You can use ctrl to mergeTip: You can use ⌘ (command) to mergeToggle Legend displayToggle World Axis displayToggle left control paneToggle plot listToggle raw data pane (bottom)Too many ranges appeared to have range entries with no usable data (eg, all blank)ToolsTotal (incl. unranged) Total Density (pts/vol):Total Ranged Transform ParamsTranslateTranslate ValueTranslationTransparencyTried skipping to table separator line (line with dashes), but did not find it.Unable to allocate memory to store dataUnable to allocate requested memory. Try a lower resolution, or save as vector (SVG).Unable to compute volumeUnable to create stash, selection invalidUnable to determine filter type in defaults listing.Unable to initialise the openGL (3D) panel. Program cannot start. Please check your video drivers.Unable to interpret recent file entryUnable to load autosave file..Unable to locate stash name for stash Unable to read file contents after openUnable to read range start and end valuesUnable to read range table entryUnable to retrieve root node in input state file... Is this really a non-empty XML file?Unable to saveUnable to save. Check output destination can be written to.Unexpected failure whilst trying to skip over range lead-in data (bit before range start value)UnrangedUnrecognised effect :Up Dir.Up dirUpdate Notice: New version Updated.Use camera coordinatesUse shift/ctrl-space or double tap to alter reset axisValueValue LabelValue ShuffleValue2View sizeVisibleVolumeVolume (Density)Volume (len^3): VoxelVoxel Limits (min,max): (VoxelisationWARNING: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warning,Warning, Warning, unparseable version number in state file. File reading will continue, but may failWarning: Your configuration file appears to be invalid: Warning:One or more bounds of the loaded data approaches the limits of numerical stability for the internal data type(magnitude too large). Consider rescaling data before loadingWork DirXYYou can do this; thats OK, but the output is no longer independent of the computational process;ZZoom Ratea day agoa decade agoa few days agoa few decades agoa few hours agoa few minutes agoa few months agoa few seconds agoa few weeks agoa few years agoa minute agoa month agoa second agoa week agoa year agoan hour agocountdXdYdZfile reading will continue, but may fail.in the future?moments agoregardless of the settings you use here. Use your package manager to keep up-to-datex-yx-zy-xy-zz-xz-y§Cons.Project-Id-Version: 3Depict Report-Msgid-Bugs-To: POT-Creation-Date: 2019-01-06 14:48+0000 PO-Revision-Date: 2017-09-19 12:00+0000 Last-Translator: mycae Language-Team: Spanish (Spain) (http://www.transifex.com/mycae/3depict/language/es_ES/) Language: es_ES MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Config Carga: --------------------------- Aviso de selección del parámetro ------------- Si vuestro inter-distancia de grupo es suficientemente grande (más grande que vuestro bulk enlazando distancia), entonces puedes conseguir fuera con esto. RDF Cuando no fue recognised No puede utilizar. Grupos No existe No existe. Skipping Encontrado online. Es actual. de Los Puntos eran un-analysable. Estos han sido caídos Los Puntos eran incapaces de encontrar puntos de vecino que superaron la búsqueda radius, y por ello terminated prematurely\% Hecho\% Hecho (Esc aborta)&Acerca de...&Eje Ctrl+Cambio+yo&Color de fondo... Ctrl+B&Contacto...&Control Pane Alt+C&Editar&Exportar&Archivo&Fullscreen Modo Ctrl+F+de Cambio&Fullscreen F de modo11A&yuda&Ayuda... Ctrl+H&Imagen... Ctrl+Yo&Leyenda Ctrl+L&Fusiona... Ctrl+Cambio+O&Abierto... Ctrl+O&Lista de parcela Alt+P&Parcela... Ctrl+P&Preferencias&Quit Ctrl+Q&Dato crudo Pane Alt+R&Reciente&Redo Ctrl+Y&Salva Ctrl+S&Deshace Ctrl+Z&Ver(Ayuno)(Lento)---------------------------------------------------------------------- --Cuenta---FusionarHace 10 minutosHace 10 segundosHace 15 minutosHace 20 minutosHace 30 minutosHace 30 segundos3D Correo-procesando3D encendiendoHace 45 minutosHace 5 minutosAbortadoAbortando...Ión activo Activo Rng AlgoritmoAligned CajaTodos los IonesTodos los Iones (conc)Todas las GamasUn coche-salvar el estado fue encontrado, te gusta para restaurarlo?.Anaglyph ModoAnalizaAnalysisPackageY tan encima...Ánguloángulo (deg)Progreso de animaciónAnotacionTe es seguro deseas salir 3Describe?FlechaTexto+de flechaCoche RefreshAutoguardarAutoguardado completado.Dato disponibleFiltros disponiblesAvg. VentanaEjeCompasesBase el nodo estatal que pierde. Es esto realmente un archivo de XML estatal??Baseline SeparaciónAncho de cubo xAzulCaja ligadaBoundbox CentroCuadro limitadorColor de cajaConstruirComplexión BulkNúcleo de complexiónBulkBulk Vínculo (Envelope) DistBulk GamasPor ContarPor Extensión (svg,png)|*.svg;*.png|Scalable Vector Archivo de gráficos (*.svg)|*.svg|PNG Archivo (*.png)|*.png|Todos los Archivos (*)|*CacheCamCámaraNombre de cámaraVelocidad de cámaraInformación de dato del cámaraTraducción de cámara, órbita y swivel índices. Cámara zooming índice.Color de fondo del cambioChemistry Dist.Chemistry DistribuciónEscoge resoluciónClasifica NúcleoClasifica Knn MaxCleanup EntradaRecorteAnálisis de grupoFríoIntercalarColourColourMapa de colorEl Color basó 3D el efecto habilita/imposibilita - requiere appropriate filtro de color 3D vasos.ComandoComp. Prof.Compiled Con wx Versión: Compos. PerfilesComposicionesComposiciones (fractional, núcleo sólo)Composiciones (fractional, núcleo+bulk)Config Presente de archivo, pero no es válido (prueba de nodo de la raíz)Confirmation PeticiónCons.Control PaneConvex Volumen (len^3): Convex hullCopia dato crudo a clipboardCopiandoCopiando referenced archivosNúcleoEl Núcleo Clasifica DistVínculo de núcleo + ErosionaVínculo de núcleo DistGamas de núcleoEsquina offsetContadorCuentaFiltro nuevo creado árbol stashRecortarCíclicoCilindroDataDenominadorVista detallada de gama seleccionadaDetallesFormato de dígitoPanel de visualizaciónDist MaxDistanciaDownsamplingSorteoMedida de sorteoGota unrangedEl Efecto duplicado encontróSa&lirVacío stash nombre para stash Habilita Anaglyphic StereoHabilita CroppingHabilita cropping correo-efecto de procesoHabilitar/Imposibilitar automático actualiza de dato cuándo cambio de filtro toma efectoHabilita/Imposibilita encender cálculos en rendering, para objetos que piden esto. Encendiendo proporciona profundidad importante cues para los objetos comprendidos de 3D superficies. Imposibilitando puede dejar más rápido rendering en escenas complejasHabilitar/Imposibilitar débil randomisation (Galois lineal feedback registro de cambio). Fuerte randomisation utiliza una mucha selección aleatoria más lenta método, pero proporciona protección mejor contra inadvertent correlaciones, y es recomendado para análisis finalesHabilitar/imposibilitar efectos visuales en final 3D producciónHabilitar/imposibilitar efectos visuales en final 3D producciónHabilitadoFinalFin rng ErosiónErosiona DistErr. EstimatorError - Encontrado NaN en pos archivoEl Error que copia archivoEl Error que interpreta campo en archivoEl Error que interpreta archivo de gama header, esperando el ión cuenta y la gama cuenta, respectivamente.Error al cargar un archivoEl Error que carga archivo: El Error que carga archivo estatal. Ve consola para más info.Error al abrir el archivoArchivo de apertura del error, nombre de control y permisos.El Error que abre pos archivoEl Error que procesa nodo: Error re-abriendo archivo, después de que primer escánerDato de color de lectura de error en el archivo, esperando 3 valores decimales, el espacio separó.Efecto de lectura del error : Archivo de lectura del error, formato inesperado, te es seguro es un archivo de gama propio?Lectura de error de pos archivo (después de abierto)El Error que lee el nombre largo para ión.El Error que lee el nombre corto para ión.Archivo de ahorro del error. Producción de control dir es writable.Error whilst leyendo contenidos de archivoPrograma de salidaExportarAnimación de exportaciónCorriente de exportación 3D VistaExportación Parcela ActualDato de Ión de la exportaciónExportación Pos DatoExportar rangoDato de Gama de la exportaciónGamas de exportaciónPaquete de análisis de la exportaciónExportar:Ext. ProgramaExtern. Prog.ExtremaFallado leyendo archivo de gama.Fallado a allocate parserRápido y débil randomisation.Campo de Vista (deg)ArchivoArchivo :El Archivo ya existe, overwrite?Archivo readback el control fallóTipo de ficheroLos Archivos han sido referred a utilizar caminos relativos. Mantiene caminos relativos?Filesize Durante readback aparece para ser zero.El Filtro CuentaFiltro StashesFiltro cachingConfiguración de filtrosFiltrarCubo fijo NumFijo Tick NumFlip CanalesCreación de carpeta fallóTamaño de tipografíaPara stash Encontrado :FracciónEl Marco cuentaFreq. PerfilFrecuencias (núcleo+bulk)GeneralModo de color de los vasosVerdeVerde-MagentaGrisCalienteSi quieres esto, complacer contactar el autor, o justo utilizar la fuente para añadir esto en tú.Progreso de imagenIncorrect Número de campos en archivoÍndiceInformación sobre este programaInvert ClipIónIón Color de iónIón InfoNombre de iónIón SamplerEl Ión TransformaIón infoIón&s... Ctrl+NIón. TransformaIonID IonesIsosurfaceIsovalueJetDeja el programa comprueba el internet para ver si actualiza a la versión de programa es disponible, entonces te notifica aproximadamente actualiza ahora y otra vez.Nivel de separación entre imágenes izquierdas y correctas, el cual pone 3D profundidad a distorsión visual tradeoffLimitación en el screenshot dimensión; complacer asegurar que ambos ancho y la alzada superan los valores iniciales, o que son más pequeños que los valores iniciales. Si esto molesta, complacer entregar un bug.Grosor de líneaLíneasLista de filtros disponiblesLista de rangefiles en árbol de filtroLímite de carga (MB)Fuente de dato de la carga (archivo->abierto) antes de escoger un filtro nuevoError en la cargaDensidad localBloquearEje de cerradura Mag.Eje de cerradura Mag.LogarítmicaManual no fundar localmente. Navegador de web del lanzamientoFin de mapaFin de mapaInicio de mapaCentro de masaMaxTamaño MaxMax. Ram Uso (%)Max. Sep + ErosionaFracaso de asignación de la memoria en carga de POSFusionar otro archivoArchivo fusionado.MínimoTamaño MinDato mixtoModoMonitoríndice de movimientoMoviendo avg.NN Freq.NN MaxNombre de cámara nuevo...Próximo fullscreen modo: con toolbarsNingún dato para salvarNingún filtro stashes para editar.Ningún filtro significa ningún dato para exportarNo el dato numérico encontróNinguna parcela disponible. Complacer crear una parcela antes de exportar.Ninguna parcela seleccionó.Ningún dato de gama. Puede no grupo.Tipo de ruidoNingunoNinguno (Crudo contar)NormalizaNormalise PorNo disponibleNum CubosNum ColoresNum GamasNum TicksNum XNum YNum ZDensidad de número (\#/Vol^3)Número de fotogramasNúmero de puntos : NumeradorOnline Control: Online ActualizaOnline Acceso para no ganar32/plataformas de manzana es intencionadamente imposibilitado, Página de contacto abiertoArchivo estatal abiertoOpenGL FallóPágina de contacto de la apertura en navegador de web externaOrigenModo de origenOrtogonalFuera de FracciónLa Producción Cuenta¿Sobreescribir?P&Parcela...PNG Archivo (*.png)|*.png|Todos los Archivos (*)|*Dato de POSPac&kage... Ctrl+KNombre de directorio del paqueteCarpeta de paquete ya existe, no overwrite.Creación de carpeta del paquete el control fallado que escribe a esta ubicación es posible.Nombre del PaquetePanel de visualizaciónParamPor EspeciePerspectivaPlanoEl Avión NormalDibujarColor de parcelaLista de parcelaTipo de TrazoColor de parcela Plotting Funciona regresado un error: Nube de puntoPuntosPos DatoPos Archiva vacíoPos Medida de archivo aparece para tener no-integer número de entradasPos Carga abortado por interrumpir.Posición UnPosición BPostearPostprocessPreferenciasLa Prensa introduce para restaurar cámaraLa Prensa introduce para restaurar stashLa Prensa introduce para almacenar cámara nuevoLa Prensa introduce para almacenar nuevo stashPrimitivaLimitación de programaProducción de texto del programaProjectionPropiedadPseudo-AleatorioRápidamente y análisis sucio para dato de punto.Distancia radialDistribución radialRadioRadioCorrió&ges... Ctrl+GRangoArchivo de gamaFuentes de gamaInicio de gamaFin de RangoArchivo de gama aparece para ser vacío, archivo de control es un archivo de gama propio y no es vacío.Archivo de gama aparece para ser inconsistent (eg, overlapping gamas)Archivo de gama aparece para contener malformed dato, cosas de control como inicio y fines de m/c no es igual o flipped.Densidad abarcada (pts/vol):RangosAbarcandoProporción (Num/Denom)Datos en crudoTablero de Dato crudoRe-CotejarRectilíneaRectilinear Bounds : Rojo-AzulRojo-CyanRojo-VerdeReflexiveRefresh Abortó.Recuerda últimoSaca DistRendering Secuencia...Rendering Enladrilla...RepresentacionRestablecerRestablecer todoCámara restaurado: GirarGirar + Girar-ReglaSalva &Tan... Ctrl+Cambio+SSalva Dato...Guardar imagen...Salva estado actual a archivo nuevoError al guardarSalva parcela...Salva pos...Salva dato crudo para archivarSalva estatal de archivarSalva estatal...Salvado 3D Vista :Iones salvados: Paquete salvado: Parcela salvada: Estado salvado: Imagen de ahorro Hecho de escala.Aviso de seguridadSelecciona Dato o Archivo Estatal...Selecciona RNG Archivo...Seleccionar un elemento del árbol de filtro antes de escoger un filtro nuevoDato seleccionadoSelecciónPone el método de tablero layout cuándo empezando el programaángulo de espectáculoBarra de espectáculoEl Espectáculo PrimitivoEl Espectáculo SeleccionóMuestra todos los tablerosMuestra todos los tableros cuándo empezando programaArchivos de ayuda del espectáculo y documentaciónEspectáculo markerTableros de espectáculo visibles por fin shutdown cuándo empezando programaEspectáculo tableros seleccionados cuándo empezando programaOrden aleatorioMedida CroppingDistribución de medidaLiso && translucent objetosFuenteFiltro de fuentesEspaciando XEspaciando YEspaciando ZSpat. AnálisisRuido espacialEspecificaEspectroEsferaSphere MedidaSphere MedidaReunirMedida de sitioEstándar dev.InicioInicio rng ArranqueStash NombreStashed FiltrosStashed árbolesEl Estado fue creado por una versión más nueva de este programa.. RaízPasosEstereoModo de parónCámara almacenado: SuperficieLa Superficie SacaTapsim DatoDestinoTextoDato de textoArchivo de texto (*.txt)|*.txt|Todos los Archivos (*)|*Medida de textoEste archivo estatal contiene filtros que pueden ser unsafe a carrera deseas sacar estos antes de continuar?.Tick EspaciandoConsejo: puedes utilizar ctrl para fusionarConsejo: puedes utilizar ⌘ (orden) para fusionarToggle Exhibición de leyendaToggle Exhibición de Eje mundialToggle Dejó control paneToggle Lista de parcelaToggle Dato crudo pane (fondo)Demasiadas gamas aparecidas para tener entradas de gama con ningún usable dato (eg, todo espacio)HerramientasTotal (incl. unranged) Densidad total (pts/vol):El Total Abarcó Transforma ParamsTrasladarTraduce ValorTranslationTransparenciaProbado skipping a mesa separator línea (línea con dashes), pero no lo encontró.Incapaz a allocate memoria para almacenar datoIncapaz a allocate memoria pedida. Probar una resolución más baja, o salvar como vector (SVG).Incapaz de computar volumenIncapaz de crear stash, inválido de selecciónIncapaz de determinar tipo de filtro en defaults listado.Incapaz a initialise el openGL (3D) tablero. El Programa no puede empezar. Complacer comprobar vuestros conductores de vídeo.Incapaz de interpretar entrada de archivo recienteIncapaz de cargar autosave archivo..Incapaz de localizar stash nombre para stash Incapaz de leer contenidos de archivo después de abiertoIncapaz de leer inicio de gama y valores de finIncapaz de leer entrada de mesa de la gamaIncapaz de recuperar nodo de raíz en entrada archivo estatal... Es esto realmente un XML no vacío archivo?Incapaz de salvarIncapaz de salvar. Destino de producción del control puede ser escrito a.Fracaso inesperado whilst probando a skip sobre ventaja de gama-en dato (bit antes de valor de inicio de la gama)UnrangedUnrecognised Efecto :Arriba de Dir.Arriba de dirActualiza Aviso: versión Nueva Actualizada.Coordenadas de cámara del usoCambio de uso/ctrl-grifo espacial o doble para alterar reset ejeValorEtiqueta de valorValor ShuffleValor2Medida de vistaVisibilidadVolumenVolumen (Densidad)Volumen (len^3): VoxelVoxel Límites (min,max): (VoxelisationAVISO: Skipping nodo Esperando para refresh para abortar. Saliendo podría dirigir al programa backgrounding. Salida en todo caso? Advertencia, Advertencia, Aviso, unparseable número de versión en archivo estatal. Lectura de archivo continuará, pero puede fallarAviso: Vuestro archivo de configuración aparece para ser nulo: Aviso:Uno o más bounds del dato cargado se acerca los límites de numérico stability para el tipo de dato interno(la magnitud demasiado grande). Considera rescaling dato antes de cargarTrabajo DirXYPuedes hacer esto; thats OK, pero la producción es no más largo independiente del computational proceso;ZZoom índiceHace un díaHace una décadaHace unos cuantos díasHace unas cuantas décadasHace unas cuantas horasHace unos cuantos minutosHace unos cuantos meseshace unos segundosHace unas cuantas semanasHace unos cuantos añoshace un minutoHace un mesUn segundo haceHace una semanaHace un añohace 1 horacontardXdYdZLectura de archivo continuará, pero puede fallar.En el futuro?Momentos haceA toda costa del settings te utiliza aquí. Uso vuestro director de paquete para mantener actualx-yx-zy-xy-zz-xz-y§Cons.3Depict-0.0.22/translations/3Depict_fr_FR.po0000644000175000017500000047620113414412454020120 0ustar pcuserpcuser# Translation file # Copyright (C) 2017 # This file is distributed under the same license as the 3Depict package. msgid "" msgstr "" "Project-Id-Version: 3Depict\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-06 14:48+0000\n" "PO-Revision-Date: 2017-09-19 12:00+0000\n" "Last-Translator: mycae\n" "Language-Team: French (http://www.transifex.com/mycae/3depict/language/fr/)\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/gl/cameras.cpp:585 msgid "Lock" msgstr "Verrouiller" #: ../src/gl/cameras.cpp:592 ../src/backend/filters/ionClip.cpp:516 #: ../src/backend/filters/ionClip.cpp:530 #: ../src/backend/filters/ionClip.cpp:546 #: ../src/backend/filters/ionClip.cpp:567 #: ../src/backend/filters/profile.cpp:1097 #: ../src/backend/filters/profile.cpp:1118 #: ../src/backend/filters/transform.cpp:1222 #: ../src/backend/filters/transform.cpp:1240 #: ../src/backend/filters/transform.cpp:1257 #: ../src/backend/filters/annotation.cpp:625 #: ../src/backend/filters/annotation.cpp:691 msgid "Origin" msgstr "Origine" #: ../src/gl/cameras.cpp:600 ../src/backend/filters/spatialAnalysis.cpp:936 msgid "Target" msgstr "Cible" #: ../src/gl/cameras.cpp:606 msgid "Up Dir." msgstr "Chef amunt de Dire." #: ../src/gl/cameras.cpp:614 ../src/gl/cameras.cpp:717 msgid "Perspective" msgstr "Perspective" #: ../src/gl/cameras.cpp:616 ../src/gl/cameras.cpp:719 #: ../src/gui/mainFrame.cpp:5762 msgid "Orthogonal" msgstr "Othogonal" #: ../src/gl/cameras.cpp:620 msgid "Projection" msgstr "Projection" #: ../src/gl/cameras.cpp:629 msgid "Field of View (deg)" msgstr "Champ de Vue (deg) " #: ../src/gl/cameras.cpp:635 msgid "View size" msgstr "Mida de vue " #: ../src/wx/wxcomponents.cpp:189 msgid "Save Data..." msgstr "Sauve Donnée..." #: ../src/wx/wxcomponents.cpp:190 msgid "Text File (*.txt)|*.txt|All Files (*)|*" msgstr "Archives de texte (*.txt)|*.txt|Toutes les Archives (*)|* " #: ../src/wx/wxcomponents.cpp:202 msgid "Error saving file. Check output dir is writable." msgstr "Archives d'estalvi de l'erreur. Sortie de contrôle dire est writable." #: ../src/wx/wxcomponents.cpp:202 ../src/gui/dialogs/ExportRngDialog.cpp:187 #: ../src/gui/mainFrame.cpp:1555 ../src/gui/mainFrame.cpp:1680 #: ../src/gui/mainFrame.cpp:1729 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2410 ../src/gui/mainFrame.cpp:2483 #: ../src/gui/mainFrame.cpp:2586 ../src/gui/mainFrame.cpp:2845 msgid "Save error" msgstr "Erreur d'enregistrement" #: ../src/common/basics.cpp:183 msgid "in the future?" msgstr "En le futur? " #: ../src/common/basics.cpp:234 msgid "a decade ago" msgstr "Fait une décade " #: ../src/common/basics.cpp:235 msgid "a year ago" msgstr "Fait une année " #: ../src/common/basics.cpp:236 msgid "a month ago" msgstr "Fait un mois " #: ../src/common/basics.cpp:237 msgid "a week ago" msgstr "Fait une semaine " #: ../src/common/basics.cpp:238 msgid "a day ago" msgstr "Fait un jour " #: ../src/common/basics.cpp:239 msgid "an hour ago" msgstr "il y a une heure" #: ../src/common/basics.cpp:240 msgid "45 minutes ago" msgstr "Fait 45 minutes " #: ../src/common/basics.cpp:241 msgid "30 minutes ago" msgstr "Fait 30 minutes " #: ../src/common/basics.cpp:242 msgid "20 minutes ago" msgstr "Fait 20 minutes " #: ../src/common/basics.cpp:243 msgid "15 minutes ago" msgstr "Fait 15 minutes " #: ../src/common/basics.cpp:244 msgid "10 minutes ago" msgstr "Fait 10 minutes " #: ../src/common/basics.cpp:245 msgid "5 minutes ago" msgstr "Fait 5 minutes " #: ../src/common/basics.cpp:246 msgid "a minute ago" msgstr "il y a une minute" #: ../src/common/basics.cpp:247 msgid "30 seconds ago" msgstr "Fait 30 secondes " #: ../src/common/basics.cpp:248 msgid "10 seconds ago" msgstr "Fait 10 secondes " #: ../src/common/basics.cpp:249 msgid "a second ago" msgstr "Une seconde fait " #: ../src/common/basics.cpp:254 msgid "a few decades ago" msgstr "Fait des combien décades " #: ../src/common/basics.cpp:255 msgid "a few years ago" msgstr "Fait des combien années " #: ../src/common/basics.cpp:256 msgid "a few months ago" msgstr "Fait des combien mois " #: ../src/common/basics.cpp:257 msgid "a few weeks ago" msgstr "Fait des combien semaines " #: ../src/common/basics.cpp:258 msgid "a few days ago" msgstr "Fait des combien jours " #: ../src/common/basics.cpp:259 msgid "a few hours ago" msgstr "Fait des combien heures " #: ../src/common/basics.cpp:262 msgid "tens of minutes ago" msgstr "" #: ../src/common/basics.cpp:266 msgid "a few minutes ago" msgstr "Fait des combien minutes " #: ../src/common/basics.cpp:269 msgid "a few seconds ago" msgstr "il y a quelques secondes" #: ../src/common/basics.cpp:296 msgid "moments ago" msgstr "Fait des moments " #: ../src/common/colourmap.cpp:307 msgid "Jet" msgstr "Jet" #: ../src/common/colourmap.cpp:308 msgid "Hot" msgstr "Chaud" #: ../src/common/colourmap.cpp:309 msgid "Cold" msgstr "Froid" #: ../src/common/colourmap.cpp:310 msgid "Grey" msgstr "Gris" #: ../src/common/colourmap.cpp:311 msgid "Cyclic" msgstr "Cyclique" #: ../src/common/colourmap.cpp:312 msgid "General" msgstr "Général" #: ../src/common/colourmap.cpp:313 #: ../src/gui/dialogs/transferFuncDialog.cpp:765 msgid "Blue" msgstr "Bleu" #: ../src/common/colourmap.cpp:314 msgid "Pseudo-Random" msgstr "Pseudo-Aleatori " #: ../src/common/colourmap.cpp:315 msgid "Inferno" msgstr "" #: ../src/common/colourmap.cpp:316 msgid "Viridis" msgstr "" #: ../src/common/constants.cpp:21 msgid "" "Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG " "File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*." "rrng)|*.rrng;*.RRNG|All Files (*)|*" msgstr "" #: ../src/gui/glPane.cpp:642 msgid "Use shift/ctrl-space or double tap to alter reset axis" msgstr "" "Changement d'usage/ctrl-aixeta espacial ou double pour altérer axe de " "reinicialització " #: ../src/gui/glPane.cpp:939 msgid "Image progress" msgstr "Progrès d'image " #: ../src/gui/glPane.cpp:940 msgid "Rendering tiles..." msgstr "Rendering Dalle..." #: ../src/gui/glPane.cpp:1133 msgid "Animation progress" msgstr "Progrès d'animation " #: ../src/gui/glPane.cpp:1134 msgid "Rendering sequence..." msgstr "Rendering Seqüència..." #: ../src/gui/glPane.cpp:1172 msgid "Saving Image " msgstr "Image d'estalvi. " #: ../src/gui/glPane.cpp:1172 ../src/gui/mainFrame.cpp:4829 #: ../src/gui/mainFrame.cpp:4833 ../src/gui/mainFrame.cpp:4846 #: ../src/backend/filters/dataLoad.cpp:299 msgid " of " msgstr "sur" #: ../src/gui/dialogs/ExportRngDialog.cpp:40 msgid "Range Sources" msgstr "Sources de gamme " #: ../src/gui/dialogs/ExportRngDialog.cpp:42 msgid "Details" msgstr "Détails" #: ../src/gui/dialogs/ExportRngDialog.cpp:53 msgid "Source Filter" msgstr "Filtre source" #: ../src/gui/dialogs/ExportRngDialog.cpp:54 #: ../src/backend/filters/spatialAnalysis.cpp:1059 #: ../src/backend/filters/rangeFile.cpp:649 msgid "Ions" msgstr "Ions " #: ../src/gui/dialogs/ExportRngDialog.cpp:55 #: ../src/gui/dialogs/rangeEditDialog.cpp:1585 #: ../src/backend/filters/voxelise.cpp:781 #: ../src/backend/filters/rangeFile.cpp:725 msgid "Ranges" msgstr "Intervalles" #: ../src/gui/dialogs/ExportRngDialog.cpp:88 msgid "Param" msgstr "Arrêtons " #: ../src/gui/dialogs/ExportRngDialog.cpp:89 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352 #: ../src/gui/dialogs/animateFilterDialog.cpp:1199 #: ../src/backend/filters/dataLoad.cpp:547 msgid "Value" msgstr "Valeur" #: ../src/gui/dialogs/ExportRngDialog.cpp:90 msgid "Value2" msgstr "Valeur2 " #: ../src/gui/dialogs/ExportRngDialog.cpp:97 msgid "Ion Name" msgstr "Nom d'ió " #: ../src/gui/dialogs/ExportRngDialog.cpp:98 msgid "Num Ranges" msgstr "Num Gammes " #: ../src/gui/dialogs/ExportRngDialog.cpp:116 #: ../src/gui/dialogs/rangeEditDialog.cpp:694 ../src/backend/filter.cpp:52 msgid "Ion" msgstr "Ion" #: ../src/gui/dialogs/ExportRngDialog.cpp:117 msgid "Range Start" msgstr "Début de gamme " #: ../src/gui/dialogs/ExportRngDialog.cpp:118 msgid "Range end" msgstr "Fin de période" #: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2521 msgid "Save pos..." msgstr "Sauve pos..." #: ../src/gui/dialogs/ExportRngDialog.cpp:152 msgid "" "Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV " "(*.env)|*.env|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:184 ../src/gui/mainFrame.cpp:1555 #: ../src/gui/mainFrame.cpp:1730 ../src/gui/mainFrame.cpp:1805 #: ../src/gui/mainFrame.cpp:2411 ../src/gui/mainFrame.cpp:2587 #: ../src/gui/mainFrame.cpp:2846 msgid "Unable to save. Check output destination can be written to." msgstr "" "Impossible d'enregistrer. Vérifiez la destination de sortie peut être écrit." #: ../src/gui/dialogs/ExportRngDialog.cpp:253 msgid "Export Range" msgstr "Exporter la plage" #: ../src/gui/dialogs/ExportRngDialog.cpp:258 msgid "List of rangefiles in filter tree" msgstr "Liste de rangefiles en arbre de filtre " #: ../src/gui/dialogs/ExportRngDialog.cpp:260 msgid "Detailed view of selected range" msgstr "Vue detallada de gamme sélectionnée " #: ../src/gui/dialogs/rangeEditDialog.cpp:221 msgid "Show Overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:246 msgid "e.g. H2O" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:559 #: ../src/gui/dialogs/rangeEditDialog.cpp:693 ../src/gui/mainFrame.cpp:6428 #: ../src/backend/filter.cpp:53 msgid "Plot" msgstr "Courbe" #: ../src/gui/dialogs/rangeEditDialog.cpp:560 msgid "Short Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:561 msgid "Long Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:562 #: ../src/gui/dialogs/transferFuncDialog.cpp:767 #: ../src/backend/filters/filterCommon.cpp:528 #: ../src/backend/filters/filterCommon.cpp:531 #: ../src/backend/filters/profile.cpp:1197 #: ../src/backend/filters/annotation.cpp:813 #: ../src/backend/filters/spectrumPlot.cpp:697 msgid "Colour" msgstr "Couleurs" #: ../src/gui/dialogs/rangeEditDialog.cpp:695 #: ../src/backend/filters/annotation.cpp:652 #: ../src/backend/filters/annotation.cpp:764 msgid "Start" msgstr "Début" #: ../src/gui/dialogs/rangeEditDialog.cpp:696 #: ../src/backend/filters/annotation.cpp:657 #: ../src/backend/filters/annotation.cpp:768 msgid "End" msgstr "Fin" #: ../src/gui/dialogs/rangeEditDialog.cpp:1258 msgid "Range or ion?" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1259 msgid "Select type to add" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1540 msgid "Range Editor" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1544 msgid "Enable or disable all overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1545 msgid "Entered overlays, use delete to remove" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1546 msgid "Available plots for ranging" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1547 msgid "Enter species to display as overlay, e.g. SiO2" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1548 msgid "Editable ranges" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1549 msgid "Editable ions" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1584 #: ../src/gui/dialogs/animateFilterDialog.cpp:177 msgid "Plots" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1586 msgid "Overlay" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:39 msgid "Remove &All" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:123 msgid "Restore state?" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:133 msgid "Multiple autosave states were found; would you like to restore one?" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:37 ../src/backend/filter.cpp:618 #: ../src/backend/filter.cpp:621 msgid "Error" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:39 msgid "Warning" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:42 #: ../src/gui/dialogs/filterErrorDialog.cpp:52 msgid "Filter Errors" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:759 #: ../src/backend/filters/spectrumPlot.cpp:650 msgid "Max" msgstr "Max" #: ../src/gui/dialogs/transferFuncDialog.cpp:760 #: ../src/backend/filters/spectrumPlot.cpp:646 msgid "Min" msgstr "Min" #: ../src/gui/dialogs/transferFuncDialog.cpp:762 msgid "Traces" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:763 msgid "Red" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:764 msgid "Green" msgstr "Vert" #: ../src/gui/dialogs/transferFuncDialog.cpp:766 #: ../src/backend/filters/ionColour.cpp:314 msgid "Opacity" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:770 #: ../src/backend/filters/filterCommon.cpp:699 msgid "Transfer Function" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:823 msgid "Transfer Function Editor" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:826 msgid "Colour chosen by moving selected node up-down" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:828 msgid "Drag nodes to move, click to add nodes" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:830 msgid "Final colour scale" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:835 msgid "Adjust node group's colour" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:836 msgid "Remove the selected node" msgstr "" #: ../src/gui/dialogs/transferFuncDialog.cpp:847 msgid "Node Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:49 msgid "Stashes" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:52 msgid "Stashed Tree" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:54 msgid "Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:60 msgid "Stash Name" msgstr "Stash Nom " #: ../src/gui/dialogs/StashDialog.cpp:61 msgid "Filter Count" msgstr "Le Filtre Compte " #: ../src/gui/dialogs/StashDialog.cpp:94 msgid "Stashed Trees" msgstr "Stashed Arbres " #: ../src/gui/dialogs/StashDialog.cpp:97 msgid "Erase stashed item" msgstr "Stashed Filtres " #: ../src/gui/dialogs/StashDialog.cpp:98 msgid "Filter view for current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:99 msgid "Settings for selected filter in current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:100 msgid "Available stashes" msgstr "Donnée disponible " #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:45 msgid "Start Frame: " msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:47 msgid "From File" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:50 msgid "From Table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350 #: ../src/gui/dialogs/animateFilterDialog.cpp:197 msgid "Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240 msgid "Select text file..." msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241 msgid "Text files (*.txt)|*.txt;|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342 msgid "String Keyframes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344 msgid "Frame at which to start string sequence" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345 msgid "Frame offset for data start" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346 msgid "File to use as string data source, one value per row" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347 msgid "Select file to use as data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348 msgid "Use table below for data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355 msgid "Remove selected strings from table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356 msgid "Abort value selection and return to previous window" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357 msgid "Accept data values" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:60 msgid "Keyframe Data" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:61 msgid "Transition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64 msgid "Step" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:65 msgid "Ramp" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:68 #: ../src/gui/dialogs/animateFilterDialog.cpp:1181 msgid "Start Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:70 #: ../src/gui/dialogs/animateFilterDialog.cpp:1182 msgid "End Frame" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:73 msgid "Initial Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:74 msgid "startColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:75 msgid "Final Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:76 msgid "endColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:250 msgid "Key Frame : Colour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:252 msgid "Colour at the start of the transtition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:253 msgid "Colour at end of transition" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:92 msgid "Cameca/Ametek RRNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:93 msgid "Oak-Ridge RNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:94 msgid "Cameca/Ametek ENV" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:156 msgid "Key frames" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:157 msgid "Output Data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:158 msgid "Filters and properties" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:164 msgid "Dir : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:167 msgid "Output only when refresh required" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:169 msgid "Data Types:" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:170 msgid "3D Images" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:171 msgid "File Prefix: " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:173 msgid "Size : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:175 msgid "..." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:176 msgid "Point data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:178 msgid "Voxel data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:179 msgid "Range files" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:180 msgid "Format" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 msgid "transition frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:699 ../src/gui/mainFrame.cpp:1782 msgid "Frame count" msgstr "Numéro de l'image" #: ../src/gui/dialogs/animateFilterDialog.cpp:771 msgid "Key frame : Colour" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:826 msgid "File existed, but was unable to read or interpret file contents." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:827 msgid "String load failed" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:848 msgid "Keyframe : decimal" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:857 msgid "Keyframe : integer" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:866 msgid "Keyframe : 3D Point" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:994 msgid "Select or create new folder" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1174 msgid "Export Animation" msgstr "Animation d'exportation " #: ../src/gui/dialogs/animateFilterDialog.cpp:1175 msgid "Select filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1176 msgid "Select property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1178 #: ../src/gui/dialogs/animateFilterDialog.cpp:1197 msgid "Filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1179 #: ../src/gui/dialogs/animateFilterDialog.cpp:1198 msgid "Property" msgstr "Propriété" #: ../src/gui/dialogs/animateFilterDialog.cpp:1180 #: ../src/backend/filters/spatialAnalysis.cpp:1103 #: ../src/backend/filters/transform.cpp:1158 #: ../src/backend/filters/annotation.cpp:607 #: ../src/backend/filters/annotation.cpp:611 #: ../src/backend/filters/ionDownsample.cpp:475 msgid "Mode" msgstr "Mode" #: ../src/gui/dialogs/animateFilterDialog.cpp:1183 msgid "Keyframe table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1184 msgid "Remove the selected keyframe from the table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1185 msgid "Enter where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1186 msgid "Browse to directory where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1188 msgid "" "Title for files, result will be saved as #-name.png, where # is image number." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1189 msgid "Target resolution (image size)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1190 msgid "Select frame for property display" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1191 msgid "Enter frame number to change frame (eg 1/20)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1192 msgid "Save point data (POS files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1193 msgid "Save plots (as text files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1194 msgid "Save voxel data (raw files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1195 msgid "Save range files in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1200 msgid "Animation parameters for current frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1201 msgid "Abort animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1202 msgid "Run Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1273 msgid "Filter view" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1274 msgid "Frame view" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:45 msgid "Width :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:47 msgid "Height :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:50 #: ../src/gui/dialogs/prefDialog.cpp:85 msgid "Reset" msgstr "Réinitialiser" #: ../src/gui/dialogs/resolutionDialog.cpp:336 msgid "Resolution Selection" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:63 msgid "Export:" msgstr "Exporter :" #: ../src/gui/dialogs/ExportPos.cpp:64 #: ../src/backend/filters/boundingBox.cpp:568 msgid "Visible" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:65 msgid "Selected Data" msgstr "Donnée sélectionnée " #: ../src/gui/dialogs/ExportPos.cpp:67 msgid "Available Data" msgstr "Donnée disponible " #: ../src/gui/dialogs/ExportPos.cpp:73 msgid "Selection" msgstr "Sélection" #: ../src/gui/dialogs/ExportPos.cpp:98 ../src/gui/dialogs/ExportPos.cpp:101 msgid "Index" msgstr "Index" #: ../src/gui/dialogs/ExportPos.cpp:99 ../src/gui/dialogs/ExportPos.cpp:102 #: ../src/backend/filters/spatialAnalysis.cpp:2653 #: ../src/backend/filters/spatialAnalysis.cpp:2749 #: ../src/backend/filters/spatialAnalysis.cpp:2812 #: ../src/backend/filters/spatialAnalysis.cpp:3608 #: ../src/backend/filters/spatialAnalysis.cpp:3894 #: ../src/backend/filters/profile.cpp:644 #: ../src/backend/filters/spectrumPlot.cpp:65 msgid "Count" msgstr "Décompte" #: ../src/gui/dialogs/ExportPos.cpp:444 msgid "Export Pos Data" msgstr "Exportation Pos Donnée " #: ../src/gui/dialogs/ExportPos.cpp:447 msgid "Tree of filters, select leaves to show ion data." msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:449 msgid "Add all data from all filters" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:450 msgid "Add all data from currently selected filter" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:451 msgid "Add selected data from currently selected filter" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:73 msgid "Panel Display" msgstr "Affichage du tableau de bord" #: ../src/gui/dialogs/prefDialog.cpp:75 msgid "Online Updates" msgstr "En ligne Actualitza " #: ../src/gui/dialogs/prefDialog.cpp:77 ../src/gui/dialogs/prefDialog.cpp:577 msgid "Startup" msgstr "Démarrage" #: ../src/gui/dialogs/prefDialog.cpp:78 msgid "Camera Speed" msgstr "Vitesse de càmera " #: ../src/gui/dialogs/prefDialog.cpp:79 msgid "Available Filters" msgstr "Filtres disponibles" #: ../src/gui/dialogs/prefDialog.cpp:84 msgid "Reset All" msgstr "Tout réinitialiser" #: ../src/gui/dialogs/prefDialog.cpp:87 msgid "Show all panels" msgstr "Spectacle tous les plafons " #: ../src/gui/dialogs/prefDialog.cpp:88 msgid "Remember last" msgstr "Souvient dernier " #: ../src/gui/dialogs/prefDialog.cpp:89 msgid "Show Selected" msgstr "Le Spectacle a Sélectionné " #: ../src/gui/dialogs/prefDialog.cpp:92 msgid "Control Pane" msgstr "Contrôle Pane " #: ../src/gui/dialogs/prefDialog.cpp:93 msgid "Raw Data Panel" msgstr "Plafó de Donnée crue " #: ../src/gui/dialogs/prefDialog.cpp:94 ../src/gui/mainFrame.cpp:744 msgid "Plot List" msgstr "Liste de trama " #: ../src/gui/dialogs/prefDialog.cpp:96 msgid "Periodically notify about available updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:98 msgid "Prefer orthographic at startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:99 msgid "Move Rate" msgstr "índex de mouvement " #: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104 msgid "(slow)" msgstr "(Lent) " #: ../src/gui/dialogs/prefDialog.cpp:102 ../src/gui/dialogs/prefDialog.cpp:106 msgid "(fast)" msgstr "(Rapide) " #: ../src/gui/dialogs/prefDialog.cpp:103 msgid "Zoom Rate" msgstr "índex de zoom " #: ../src/gui/dialogs/prefDialog.cpp:433 msgid "Show all panels when starting program" msgstr "Spectacle tous les plafons quand commençant programme " #: ../src/gui/dialogs/prefDialog.cpp:436 msgid "Show panels visible at last shutdown when starting program" msgstr "" "Plafons de spectacle visibles à dernier shutdown quand commençant programme " #: ../src/gui/dialogs/prefDialog.cpp:443 msgid "Show selected panels when starting program" msgstr "Spectacle plafons sélectionnés quand commençant programme " #: ../src/gui/dialogs/prefDialog.cpp:492 msgid "Preferences" msgstr "Préférences" #: ../src/gui/dialogs/prefDialog.cpp:494 msgid "Set the method of panel layout when starting the program" msgstr "" "Définissez la méthode de la présentation du panneau lors du démarrage du " "programme" #: ../src/gui/dialogs/prefDialog.cpp:497 msgid "" "Lets the program check the internet to see if updates to the program version " "are available, then notifies you about updates now and again." msgstr "" "Laisse le programme constate l'internet pour voir si actualitza à la version " "de programme est disponible, alors te notifica environ actualitza de " "tellement de en tellement de." #: ../src/gui/dialogs/prefDialog.cpp:499 msgid "" "By default, use an orthographic camera at startup. State files will override " "this preference." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:500 #, fuzzy msgid "Camera translation, orbit and swivel rates. " msgstr "Traduction de càmera, orbite et swivel índexs " #: ../src/gui/dialogs/prefDialog.cpp:501 msgid "Camera zooming rate." msgstr "Taux de caméra zoom " #: ../src/gui/dialogs/prefDialog.cpp:503 msgid "Reset the filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:504 msgid "Reset all filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:576 msgid "Filt. Default" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:578 msgid "Camera" msgstr "Appareil photo" #: ../src/gui/mainFrame.cpp:123 msgid "New camera name..." msgstr "Nom de càmera nouvelle..." #: ../src/gui/mainFrame.cpp:124 msgid "New stash name..." msgstr "" #: ../src/gui/mainFrame.cpp:129 msgid "New Filter..." msgstr "" #: ../src/gui/mainFrame.cpp:146 ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 #: ../src/backend/filters/annotation.h:102 msgid "Annotation" msgstr "Annotation" #: ../src/gui/mainFrame.cpp:147 msgid "Bounding Box" msgstr "Tracé selon enveloppe" #: ../src/gui/mainFrame.cpp:148 ../src/backend/filters/ionClip.cpp:581 #: ../src/backend/filters/ionClip.h:66 msgid "Clipping" msgstr "Saturation" #: ../src/gui/mainFrame.cpp:149 ../src/backend/filters/clusterAnalysis.h:151 msgid "Cluster Analysis" msgstr "Anàlisi de groupe " #: ../src/gui/mainFrame.cpp:150 msgid "Compos. Profiles" msgstr "Compos. Profils " #: ../src/gui/mainFrame.cpp:151 msgid "Downsampling" msgstr "Downsampling " #: ../src/gui/mainFrame.cpp:152 msgid "Extern. Prog." msgstr "Extern. Prog." #: ../src/gui/mainFrame.cpp:153 msgid "Ion Colour" msgstr "Couleur d'ió " #: ../src/gui/mainFrame.cpp:154 msgid "Ion Info" msgstr "Ió Info " #: ../src/gui/mainFrame.cpp:155 msgid "Ion Transform" msgstr "L'Ió Transforme " #: ../src/gui/mainFrame.cpp:156 ../src/backend/filters/spectrumPlot.h:78 msgid "Spectrum" msgstr "Spectre" #: ../src/gui/mainFrame.cpp:157 msgid "Range File" msgstr "Archives de gamme " #: ../src/gui/mainFrame.cpp:158 ../src/backend/filters/spatialAnalysis.h:228 msgid "Spat. Analysis" msgstr "Spat. Anàlisi " #: ../src/gui/mainFrame.cpp:159 ../src/backend/filters/voxelise.h:102 msgid "Voxelisation" msgstr "Voxelisation " #: ../src/gui/mainFrame.cpp:160 ../src/backend/filters/voxelLoad.h:86 msgid "Voxel Load" msgstr "" #: ../src/gui/mainFrame.cpp:411 msgid "XML State File (*.xml)" msgstr "" #: ../src/gui/mainFrame.cpp:412 msgid "POS File (*.pos)" msgstr "" #: ../src/gui/mainFrame.cpp:413 msgid "LAWATAP ATO File (*.ato)" msgstr "" #: ../src/gui/mainFrame.cpp:414 msgid "Text File (*.txt, *.csv)" msgstr "" #: ../src/gui/mainFrame.cpp:415 msgid "3Dap Files (*.ops)" msgstr "" #: ../src/gui/mainFrame.cpp:416 msgid "VTK rectangular grids (*.vtk)" msgstr "" #: ../src/gui/mainFrame.cpp:417 msgid "Raw Binary files (*.raw)" msgstr "" #: ../src/gui/mainFrame.cpp:418 msgid "All Files (*)" msgstr "" #: ../src/gui/mainFrame.cpp:496 msgid "OpenGL Failed" msgstr "OpenGL A failli " #: ../src/gui/mainFrame.cpp:497 ../src/gui/mainFrame.cpp:499 msgid "" "Unable to initialise the openGL (3D) panel. Program cannot start. Please " "check your video drivers." msgstr "" "Incapaç à initialise l'openGL (3D) plafó. Le Programme ne peut pas " "commencer. Si vous plau constater vos conducteurs de vidéo." #: ../src/gui/mainFrame.cpp:522 msgid "&Open...\tCtrl+O" msgstr "&Ouvert... Ctrl+O. \t" #: ../src/gui/mainFrame.cpp:522 msgid "Open state file" msgstr "Archives estatal ouvert " #: ../src/gui/mainFrame.cpp:523 msgid "&Merge...\tCtrl+Shift+O" msgstr "&Fusionne... Ctrl+Shift+O. \t" #: ../src/gui/mainFrame.cpp:523 msgid "Merge other file" msgstr "Fusionner autres archives " #: ../src/gui/mainFrame.cpp:527 msgid "&Recent" msgstr "&Récent " #: ../src/gui/mainFrame.cpp:528 msgid "&Save\tCtrl+S" msgstr "&Sauve\tCtrl+S " #: ../src/gui/mainFrame.cpp:528 msgid "Save state to file" msgstr "Sauve estatal d'archiver " #: ../src/gui/mainFrame.cpp:530 msgid "Save &As...\tCtrl+Shift+S" msgstr "Sauve &Tellement... Ctrl+Changement+S. \t" #: ../src/gui/mainFrame.cpp:530 msgid "Save current state to new file" msgstr "Sauvez été actuel à archives nouveau " #: ../src/gui/mainFrame.cpp:533 msgid "&Plot...\tCtrl+P" msgstr "&Trama... Ctrl+P. \t" #: ../src/gui/mainFrame.cpp:533 msgid "Export Current Plot" msgstr "Exportation Trama Actuelle " #: ../src/gui/mainFrame.cpp:534 msgid "&Image...\tCtrl+I" msgstr "&Image... Ctrl+Je. \t" #: ../src/gui/mainFrame.cpp:534 msgid "Export Current 3D View" msgstr "Courant d'exportation 3Dème Vue " #: ../src/gui/mainFrame.cpp:535 msgid "Ion&s...\tCtrl+N" msgstr "Ió&s... Ctrl+N. \t" #: ../src/gui/mainFrame.cpp:535 msgid "Export Ion Data" msgstr "Donnée d'Ió de l'exportation " #: ../src/gui/mainFrame.cpp:536 msgid "Ran&ges...\tCtrl+G" msgstr "A couru&ges... Ctrl+G. \t" #: ../src/gui/mainFrame.cpp:536 msgid "Export Range Data" msgstr "Donnée de Gamme de l'exportation " #: ../src/gui/mainFrame.cpp:537 msgid "&Voxels...\tCtrl+Shift+V" msgstr "" #: ../src/gui/mainFrame.cpp:537 msgid "Export Voxel Data" msgstr "Exportation Voxel Donnée " #: ../src/gui/mainFrame.cpp:539 msgid "&Animate Filters...\tCtrl+T" msgstr "" #: ../src/gui/mainFrame.cpp:539 msgid "Export Animated Filter" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Ani&mate Camera...\tCtrl+M" msgstr "" #: ../src/gui/mainFrame.cpp:540 msgid "Export Animated Camera" msgstr "" #: ../src/gui/mainFrame.cpp:541 msgid "Pac&kage...\tCtrl+K" msgstr "Pac&kage... Ctrl+K. \t" #: ../src/gui/mainFrame.cpp:541 msgid "Export analysis package" msgstr "Colis d'anàlisi de l'exportation " #: ../src/gui/mainFrame.cpp:543 msgid "&Export" msgstr "&Exporter" #: ../src/gui/mainFrame.cpp:546 msgid "&Quit\tCtrl+Q" msgstr "&Quit\tCtrl+Q " #: ../src/gui/mainFrame.cpp:546 ../src/gui/mainFrame.cpp:548 msgid "Exit Program" msgstr "Programme de sortie " #: ../src/gui/mainFrame.cpp:548 msgid "E&xit" msgstr "&Quitter" #: ../src/gui/mainFrame.cpp:550 msgid "&File" msgstr "&Fichier" #: ../src/gui/mainFrame.cpp:554 msgid "&Background Colour...\tCtrl+B" msgstr "&Couleur de fond... Ctrl+B. \t" #: ../src/gui/mainFrame.cpp:554 msgid "Change background colour" msgstr "Couleur de fond du changement " #: ../src/gui/mainFrame.cpp:558 msgid "&Control Pane\tF2" msgstr "" #: ../src/gui/mainFrame.cpp:558 ../src/gui/mainFrame.cpp:561 msgid "Toggle left control pane" msgstr "Toggle Contrôle laissé pane " #: ../src/gui/mainFrame.cpp:561 msgid "&Control Pane\tAlt+C" msgstr "&Contrôle Pane\tGrand+Cème " #: ../src/gui/mainFrame.cpp:567 msgid "&Raw Data Pane\tF3" msgstr "" #: ../src/gui/mainFrame.cpp:567 ../src/gui/mainFrame.cpp:570 msgid "Toggle raw data pane (bottom)" msgstr "Toggle Donnée crue pane (inferior) " #: ../src/gui/mainFrame.cpp:570 msgid "&Raw Data Pane\tAlt+R" msgstr "&Donnée crue Pane\tGrand+R " #: ../src/gui/mainFrame.cpp:574 msgid "&Plot List\tF4" msgstr "" #: ../src/gui/mainFrame.cpp:574 ../src/gui/mainFrame.cpp:576 msgid "Toggle plot list" msgstr "Toggle Liste de trama " #: ../src/gui/mainFrame.cpp:576 msgid "&Plot List\tAlt+P" msgstr "&Liste de trama\tGrand+P " #: ../src/gui/mainFrame.cpp:582 msgid "&Legend\tCtrl+L" msgstr "&Légende\tCtrl+L " #: ../src/gui/mainFrame.cpp:582 msgid "Toggle Legend display" msgstr "Toggle écran de légende " #: ../src/gui/mainFrame.cpp:584 msgid "P&lot..." msgstr "P&Parcel·la..." #: ../src/gui/mainFrame.cpp:585 msgid "&Axis\tCtrl+Shift+I" msgstr "&Axe\tCtrl+Shift+je " #: ../src/gui/mainFrame.cpp:585 msgid "Toggle World Axis display" msgstr "Toggle écran Eixa mondial " #: ../src/gui/mainFrame.cpp:590 msgid "&Fullscreen mode\tF11" msgstr "&Fullscreen Mode\tF11 " #: ../src/gui/mainFrame.cpp:590 ../src/gui/mainFrame.cpp:592 msgid "Next fullscreen mode: with toolbars" msgstr "Proche fullscreen mode: avec toolbars " #: ../src/gui/mainFrame.cpp:592 msgid "&Fullscreen mode\tCtrl+Shift+F" msgstr "&Fullscreen Mode\tCtrl+Shift+F " #: ../src/gui/mainFrame.cpp:597 msgid "&Undo\tCtrl+Z" msgstr "&Défait\tCtrl+Z " #: ../src/gui/mainFrame.cpp:599 msgid "&Redo\tCtrl+Y" msgstr "&Redo\tCtrl+Y " #: ../src/gui/mainFrame.cpp:602 msgid "&Range" msgstr "" #: ../src/gui/mainFrame.cpp:605 msgid "&Preferences" msgstr "&Préférences" #: ../src/gui/mainFrame.cpp:607 msgid "&Edit" msgstr "É&dition" #: ../src/gui/mainFrame.cpp:610 msgid "&View" msgstr "&Affichage" #: ../src/gui/mainFrame.cpp:612 msgid "&Help...\tCtrl+H" msgstr "&Aide... Ctrl+H. \t" #: ../src/gui/mainFrame.cpp:612 msgid "Show help files and documentation" msgstr "Archives d'aide du spectacle et documentation " #: ../src/gui/mainFrame.cpp:613 msgid "&Contact..." msgstr "&Contact..." #: ../src/gui/mainFrame.cpp:613 msgid "Open contact page" msgstr "Page de contact ouvert " #: ../src/gui/mainFrame.cpp:615 msgid "&About..." msgstr "À &propos de..." #: ../src/gui/mainFrame.cpp:615 msgid "Information about this program" msgstr "Information enveloppe ce programme " #: ../src/gui/mainFrame.cpp:616 msgid "&Help" msgstr "Aid&e" #: ../src/gui/mainFrame.cpp:618 msgid "Stashed Filters" msgstr "Stashed Filtres " #: ../src/gui/mainFrame.cpp:623 msgid "New Filters" msgstr "" #: ../src/gui/mainFrame.cpp:653 msgid "Auto Refresh" msgstr "Voiture Refresh " #: ../src/gui/mainFrame.cpp:659 msgid "Filter settings" msgstr "Paramètres de filtrage" #: ../src/gui/mainFrame.cpp:662 msgid "Camera Name" msgstr "Nom de càmera " #: ../src/gui/mainFrame.cpp:674 msgid "Resize to Fit" msgstr "" #: ../src/gui/mainFrame.cpp:675 msgid "Rotate View" msgstr "" #: ../src/gui/mainFrame.cpp:676 msgid "Rotate +" msgstr "Rotation+" #: ../src/gui/mainFrame.cpp:677 msgid "Rotate-" msgstr "Rotation-" #: ../src/gui/mainFrame.cpp:680 msgid "3D Post-processing" msgstr "Post-traitement 3D" #: ../src/gui/mainFrame.cpp:682 msgid "Enable Cropping" msgstr "Activer recadrage" #: ../src/gui/mainFrame.cpp:684 ../src/gui/mainFrame.cpp:695 msgid "x-y" msgstr "x-y " #: ../src/gui/mainFrame.cpp:685 ../src/gui/mainFrame.cpp:696 msgid "x-z" msgstr "x-z " #: ../src/gui/mainFrame.cpp:686 ../src/gui/mainFrame.cpp:697 msgid "y-x" msgstr "y-x " #: ../src/gui/mainFrame.cpp:687 ../src/gui/mainFrame.cpp:698 msgid "y-z" msgstr "y-z " #: ../src/gui/mainFrame.cpp:688 ../src/gui/mainFrame.cpp:699 msgid "z-x" msgstr "z-x " #: ../src/gui/mainFrame.cpp:689 ../src/gui/mainFrame.cpp:700 msgid "z-y" msgstr "z-y " #: ../src/gui/mainFrame.cpp:704 msgid "Use camera coordinates" msgstr "Coordenades de càmera de l'usage " #: ../src/gui/mainFrame.cpp:705 msgid "dX" msgstr "dX " #: ../src/gui/mainFrame.cpp:707 msgid "dY" msgstr "dY " #: ../src/gui/mainFrame.cpp:709 msgid "dZ" msgstr "dZ " #: ../src/gui/mainFrame.cpp:711 msgid "Enable Anaglyphic Stereo" msgstr "Activer stéréo anaglyphe" #: ../src/gui/mainFrame.cpp:712 msgid "Flip Channels" msgstr "Canals de ditada " #: ../src/gui/mainFrame.cpp:713 msgid "Anaglyph Mode" msgstr "Anaglyph Mode " #: ../src/gui/mainFrame.cpp:715 msgid "Red-Blue" msgstr "Rouge-Bleu " #: ../src/gui/mainFrame.cpp:716 msgid "Red-Green" msgstr "Rouge-Vert " #: ../src/gui/mainFrame.cpp:717 msgid "Red-Cyan" msgstr "Rouge-Cyan " #: ../src/gui/mainFrame.cpp:718 msgid "Green-Magenta" msgstr "Vert-Magenta " #: ../src/gui/mainFrame.cpp:722 msgid "Baseline Separation" msgstr "Baseline écart " #: ../src/gui/mainFrame.cpp:724 ../src/backend/filters/filterCommon.cpp:744 #: ../src/backend/filters/profile.cpp:1203 #: ../src/backend/filters/boundingBox.cpp:660 #: ../src/backend/filters/dataLoad.cpp:647 #: ../src/backend/filters/spectrumPlot.cpp:701 msgid "Appearance" msgstr "" #: ../src/gui/mainFrame.cpp:725 msgid "Smooth && translucent objects" msgstr "Objets translúcids objets" #: ../src/gui/mainFrame.cpp:727 msgid "3D lighting" msgstr "3D enllumenat " #: ../src/gui/mainFrame.cpp:730 msgid "Performance" msgstr "" #: ../src/gui/mainFrame.cpp:731 msgid "Fast and weak randomisation." msgstr "Randomisation rapide et faible." #: ../src/gui/mainFrame.cpp:733 msgid "Limit Output Pts" msgstr "" #: ../src/gui/mainFrame.cpp:738 msgid "Filter caching" msgstr "Filtre caching " #: ../src/gui/mainFrame.cpp:740 msgid "Max. Ram usage (%)" msgstr "Max. Bouquet Usage (%) " #: ../src/gui/mainFrame.cpp:812 msgid "Warning: Your configuration file appears to be invalid:\n" msgstr "Attention: Votre fichier de configuration semble invalide:\n" #: ../src/gui/mainFrame.cpp:813 msgid "\tConfig Load: " msgstr "\tConfig Charge:. " #: ../src/gui/mainFrame.cpp:1127 msgid "Current state has not been saved, would you like to save it now?" msgstr "" #: ../src/gui/mainFrame.cpp:1128 msgid "State changed" msgstr "" #: ../src/gui/mainFrame.cpp:1150 ../src/gui/mainFrame.cpp:1202 msgid "Select Data or State File..." msgstr "Sélectionner des données ou fichier d'état ..." #: ../src/gui/mainFrame.cpp:1214 msgid "Merged file." msgstr "Archives fusionnées." #: ../src/gui/mainFrame.cpp:1317 msgid "Tip: You can use ⌘ (command) to merge" msgstr "Astuce: Vous pouvez utiliser ⌘ (commande) de fusionner" #: ../src/gui/mainFrame.cpp:1319 msgid "Tip: You can use ctrl to merge" msgstr "Astuce: Vous pouvez utiliser la touche ctrl pour fusionner" #: ../src/gui/mainFrame.cpp:1353 msgid "Load error" msgstr "Erreur de chargement" #: ../src/gui/mainFrame.cpp:1354 msgid "" "Error loading state file.\n" "See console for more info." msgstr "" "Fichier d'état d'erreur de chargement.\n" "Voir la console pour plus d'informations." #: ../src/gui/mainFrame.cpp:1362 msgid "" "This state file contains filters that can be unsafe to run\n" "Do you wish to remove these before continuing?." msgstr "" "Ce fichier contient l'état des filtres qui peuvent être dangereux à courir\n" "Voulez-vous supprimer ces avant de continuer?." #: ../src/gui/mainFrame.cpp:1363 msgid "Security warning" msgstr "Alerte de sécurité" #: ../src/gui/mainFrame.cpp:1576 ../src/gui/mainFrame.cpp:1672 #: ../src/gui/mainFrame.cpp:2125 msgid "Unable to save" msgstr "Impossible d'enregistrer" #: ../src/gui/mainFrame.cpp:1577 msgid "No plot available. Please create a plot before exporting." msgstr "" "Pas d'intrigue disponibles. S'il vous plaît créer un terrain avant " "d'exporter." #: ../src/gui/mainFrame.cpp:1581 msgid "Save plot..." msgstr "Sauve trama..." #: ../src/gui/mainFrame.cpp:1582 msgid "" "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*." "svg|PNG File (*.png)|*.png|All Files (*)|*" msgstr "" "Pour Extension (svg,png)|*.svg;*.png|Scalable Archives de Graphiques du " "vector (*.svg)|*.svg|PNG Archives (*.png)|*.png|Toutes les Archives (*)|* " #: ../src/gui/mainFrame.cpp:1636 msgid "Select type for save" msgstr "" #: ../src/gui/mainFrame.cpp:1637 msgid "Choose file type" msgstr "" #: ../src/gui/mainFrame.cpp:1657 ../src/gui/mainFrame.cpp:1714 #: ../src/gui/mainFrame.cpp:1750 msgid "Choose resolution" msgstr "écueil résolution " #: ../src/gui/mainFrame.cpp:1673 msgid "Unknown file extension. Please use \"svg\" or \"png\"" msgstr "Extension d'archives inconnu. Si vous plau usage. " #: ../src/gui/mainFrame.cpp:1684 msgid "Saved plot: " msgstr "Trama sauvée:. " #: ../src/gui/mainFrame.cpp:1691 ../src/gui/mainFrame.cpp:1743 msgid "Save Image..." msgstr "Sauve Image..." #: ../src/gui/mainFrame.cpp:1692 ../src/gui/mainFrame.cpp:1744 msgid "PNG File (*.png)|*.png|All Files (*)|*" msgstr "PNG Archives (*.png)|*.png|Toutes les Archives (*)|* " #: ../src/gui/mainFrame.cpp:1706 msgid "File already exists. Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1707 ../src/gui/mainFrame.cpp:2551 #: ../src/gui/mainFrame.cpp:2803 ../src/gui/mainFrame.cpp:2826 msgid "Overwrite?" msgstr "Écraser ?" #: ../src/gui/mainFrame.cpp:1734 ../src/gui/mainFrame.cpp:1810 msgid "Saved 3D View :" msgstr "Sauvé 3Dème Vue : " #: ../src/gui/mainFrame.cpp:1764 msgid "Program limitation" msgstr "Limitation de programme " #: ../src/gui/mainFrame.cpp:1765 msgid "" "Limitation on the screenshot dimension; please ensure that both width and " "height exceed the initial values,\n" " or that they are smaller than the initial values.\n" " If this bothers, please submit a bug." msgstr "" "Limitation en le screenshot dimension; si vous plau assurer qu'ambdues " "amplada et la levée surpassent les valeurs inicials,\n" " ou que sont plus petits que les valeurs inicials. Si\n" " ce dérange, si vous plau entregar un bug." #: ../src/gui/mainFrame.cpp:1782 msgid "Number of frames" msgstr "Nombre d'images" #: ../src/gui/mainFrame.cpp:1839 msgid "Abo&rt" msgstr "" #: ../src/gui/mainFrame.cpp:1841 msgid "&Refresh" msgstr "" #: ../src/gui/mainFrame.cpp:1966 msgid "Cannot animate with no filters." msgstr "" #: ../src/gui/mainFrame.cpp:2048 msgid "Animating" msgstr "" #: ../src/gui/mainFrame.cpp:2049 msgid "Performing refresh" msgstr "" #: ../src/gui/mainFrame.cpp:2075 msgid "Filter property change failed" msgstr "" #: ../src/gui/mainFrame.cpp:2097 msgid "Refresh failed on frame :" msgstr "" #: ../src/gui/mainFrame.cpp:2126 msgid "Image save failed for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2151 msgid "Ion save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2152 msgid "Unable to save ions for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2187 ../src/gui/mainFrame.cpp:2205 msgid "Plot save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2188 ../src/gui/mainFrame.cpp:2206 msgid "Unable to save plot or frame " msgstr "" #: ../src/gui/mainFrame.cpp:2255 msgid "Range save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2256 msgid "Unable to save range for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2285 msgid "Voxel save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2286 msgid "Unable to save voxels for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2315 msgid "Animate failed" msgstr "" #: ../src/gui/mainFrame.cpp:2339 ../src/gui/mainFrame.cpp:2505 #: ../src/gui/mainFrame.cpp:2612 ../src/gui/mainFrame.cpp:2639 msgid "No filters means no data to export" msgstr "Pas de filtres signifie pas de données à exporter" #: ../src/gui/mainFrame.cpp:2353 msgid "Package name" msgstr "Nom du paquet" #: ../src/gui/mainFrame.cpp:2354 msgid "Package directory name" msgstr "Nom de directori du colis " #: ../src/gui/mainFrame.cpp:2356 msgid "AnalysisPackage" msgstr "AnalysisPackage " #: ../src/gui/mainFrame.cpp:2369 msgid "Package folder already exists, won't overwrite." msgstr "Carpeta de colis déjà existe, n'overwrite." #: ../src/gui/mainFrame.cpp:2370 msgid "Not available" msgstr "Non disponible" #: ../src/gui/mainFrame.cpp:2395 msgid "" "Package folder creation failed\n" "check writing to this location is possible." msgstr "" "Création d'un dossier package a échoué\n" " vérifier par écrit à cet endroit est possible." #: ../src/gui/mainFrame.cpp:2396 msgid "Folder creation failed" msgstr "Création du dossier n'a pas" #: ../src/gui/mainFrame.cpp:2416 msgid "Copying" msgstr "Copie en cours" #: ../src/gui/mainFrame.cpp:2417 msgid "Copying referenced files" msgstr "Copie de fichiers référencés" #: ../src/gui/mainFrame.cpp:2483 msgid "Error copying file" msgstr "L'Erreur que copia archives " #: ../src/gui/mainFrame.cpp:2492 msgid "Saved package: " msgstr "Colis sauvé:. " #: ../src/gui/mainFrame.cpp:2516 msgid "Export" msgstr "Export" #: ../src/gui/mainFrame.cpp:2522 msgid "" "POS Data (*.pos)|*.pos|Text File (*.txt)|*.txt|VTK Legacy (*.vtk)|*.vtk|All " "Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2550 ../src/gui/mainFrame.cpp:2802 msgid "File already exists, overwrite?" msgstr "Le Archives déjà existe, écraser?" #: ../src/gui/mainFrame.cpp:2591 msgid "Saved ions: " msgstr "Ions sauvés:. " #: ../src/gui/mainFrame.cpp:2616 msgid "Export Ranges" msgstr "Gammes d'exportation " #: ../src/gui/mainFrame.cpp:2652 msgid "No voxel filters" msgstr "" #: ../src/gui/mainFrame.cpp:2698 msgid "Select voxels..." msgstr "Sélectionne voxels..." #: ../src/gui/mainFrame.cpp:2705 msgid "Save voxels..." msgstr "Sauve voxel..." #: ../src/gui/mainFrame.cpp:2706 msgid "" "Raw Binary Data (float32) (*.raw)|*.raw|VTK Legacy (*.vtk)|*.vtk|All Files " "(*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2763 msgid "Exported voxels" msgstr "" #: ../src/gui/mainFrame.cpp:2767 msgid " (VTK format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2772 msgid " (RAW format) :" msgstr "" #: ../src/gui/mainFrame.cpp:2784 msgid "Save state..." msgstr "Sauve estatal..." #: ../src/gui/mainFrame.cpp:2785 msgid "XML state file (*.xml)|*.xml|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2825 msgid "Files have been referred to using relative paths. Keep relative paths?" msgstr "" "Les Archives ont été referred à utiliser des chemins relatifs. Il entretient " "des chemins relatifs? " #: ../src/gui/mainFrame.cpp:2858 msgid "Saved state: " msgstr "été sauvé:. " #: ../src/gui/mainFrame.cpp:2934 msgid "Range editor" msgstr "" #: ../src/gui/mainFrame.cpp:3202 msgid "Manual not found locally. Launching web browser" msgstr "Manuel pas trouvé localement. Lancement navigateur Web" #: ../src/gui/mainFrame.cpp:3211 msgid "Opening contact page in external web browser" msgstr "Ouverture page de contact dans le navigateur web externe." #: ../src/gui/mainFrame.cpp:3219 msgid "No filter stashes to edit." msgstr "Chef filtre stashes pour editar." #: ../src/gui/mainFrame.cpp:3223 msgid "Filter Stashes" msgstr "Filtre Stashes " #: ../src/gui/mainFrame.cpp:3240 msgid "Quick and dirty analysis for point data." msgstr "Anàlisi rapide et sale pour donnée de point." #: ../src/gui/mainFrame.cpp:3250 msgid "Compiled with wx Version: " msgstr "Compilat avec wx Version:. " #: ../src/gui/mainFrame.cpp:3271 msgid "Press enter to store new stash" msgstr "La Presse rentre à pour stocker nouveau stash " #: ../src/gui/mainFrame.cpp:3277 msgid "Press enter to restore stash" msgstr "La Presse rentre à pour restaurer stash " #: ../src/gui/mainFrame.cpp:3310 msgid "Unable to create stash, selection invalid" msgstr "Incapaç de créer stash, invalide de sélection " #: ../src/gui/mainFrame.cpp:3317 msgid "Created new filter tree stash" msgstr "Arbre de filtre nouveau créé stash " #: ../src/gui/mainFrame.cpp:3426 msgid "Filter type not a data source - can't be at tree base" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete\tDel" msgstr "" #: ../src/gui/mainFrame.cpp:3517 msgid "Delete the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename" msgstr "" #: ../src/gui/mainFrame.cpp:3519 msgid "Rename the selected filter" msgstr "" #: ../src/gui/mainFrame.cpp:3639 msgid "Moving - Hold ⌘ (command) to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3641 msgid "Moving - Hold control to copy, shift to splice" msgstr "" #: ../src/gui/mainFrame.cpp:3835 ../src/gui/mainFrame.cpp:4234 msgid "" "Filter settings are experimental. Program may be unstable when using this " "filter." msgstr "" #: ../src/gui/mainFrame.cpp:3994 msgid "Press enter to store new camera" msgstr "Appuyez sur Entrée pour enregistrer nouvel appareil photo" #: ../src/gui/mainFrame.cpp:3996 msgid "Press enter to restore camera" msgstr "La Presse rentre à pour restaurer càmera " #: ../src/gui/mainFrame.cpp:4021 ../src/gui/mainFrame.cpp:4062 msgid "Restored camera: " msgstr "Càmera restaurée:. " #: ../src/gui/mainFrame.cpp:4039 msgid "Stored camera: " msgstr "Càmera stockée:. " #: ../src/gui/mainFrame.cpp:4144 msgid "Select an item from the filter tree before choosing a new filter" msgstr "" "Sélectionnez un élément de l'arbre de filtre avant de choisir un nouveau " "filtre" #: ../src/gui/mainFrame.cpp:4146 msgid "Load data source (file->open) before choosing a new filter" msgstr "" "Source de donnée de la charge (archives->ouvertes) avant de choisir un " "filtre nouveau " #: ../src/gui/mainFrame.cpp:4161 msgid "Select RNG File..." msgstr "Sélectionne RNG Archives..." #: ../src/gui/mainFrame.cpp:4182 msgid "Failed reading range file." msgstr "Archives de gamme de lecture failli." #: ../src/gui/mainFrame.cpp:4186 msgid "Error loading file" msgstr "Erreur lors du chargement du fichier" #: ../src/gui/mainFrame.cpp:4254 ../src/gui/mainFrame.cpp:4354 #: ../src/gui/mainFrame.cpp:5900 ../src/gui/mainFrame.cpp:6430 msgid "Cons." msgstr "Contres." #: ../src/gui/mainFrame.cpp:4318 msgid "Refresh Aborted." msgstr "Refresh Va avortar." #: ../src/gui/mainFrame.cpp:4358 msgid "*Cons." msgstr "" #: ../src/gui/mainFrame.cpp:4360 msgid "§Cons." msgstr "§Contres." #: ../src/gui/mainFrame.cpp:4422 msgid "Complete" msgstr "" #: ../src/gui/mainFrame.cpp:4520 msgid "msgs" msgstr "" #: ../src/gui/mainFrame.cpp:4561 msgid "Autosave complete." msgstr "Enregistrement automatique terminé." #: ../src/gui/mainFrame.cpp:4775 msgid "Aborting...." msgstr "" #: ../src/gui/mainFrame.cpp:4844 msgid "Updated." msgstr "Mis à jour." #: ../src/gui/mainFrame.cpp:4853 msgid "Calculating..." msgstr "" #: ../src/gui/mainFrame.cpp:4856 msgid "% Done (Esc aborts)" msgstr "\\% Fait (Esc avorta)" #: ../src/gui/mainFrame.cpp:4858 msgid "% Done" msgstr "\\% Fait" #: ../src/gui/mainFrame.cpp:5133 msgid "Tip: You can shift-click to force full refresh, if required" msgstr "" #: ../src/gui/mainFrame.cpp:5195 msgid "No data to save" msgstr "Chef donnée pour sauver " #: ../src/gui/mainFrame.cpp:5383 msgid "Aborting..." msgstr "Abandon..." #: ../src/gui/mainFrame.cpp:5389 msgid "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " msgstr "" "en Attendant pour refresh pour avortar. en Sortant pourrait porter au " "programme backgrounding. Sortie de toute façon?. " #: ../src/gui/mainFrame.cpp:5390 ../src/gui/mainFrame.cpp:5410 msgid "Confirmation request" msgstr "Petició de confirmació " #: ../src/gui/mainFrame.cpp:5409 msgid "Are you sure you wish to exit 3Depict?" msgstr "T'est sûr souhaites sortir 3Depict? " #: ../src/gui/mainFrame.cpp:5928 msgid "Update Notice: New version " msgstr "Actualitza Avís: version Nouvelle. " #: ../src/gui/mainFrame.cpp:5928 msgid " found online." msgstr " Trouvé en ligne." #: ../src/gui/mainFrame.cpp:5932 msgid "Online Check: " msgstr "Contrôle en ligne:. " #: ../src/gui/mainFrame.cpp:5932 msgid " is up-to-date." msgstr " Est actuel." #: ../src/gui/mainFrame.cpp:6022 msgid "An auto-save state was found, would you like to restore it?." msgstr "Une voiture-sauver l'état a été trouvé, te plaît le restaurer?." #: ../src/gui/mainFrame.cpp:6023 msgid "Autosave" msgstr "Enregistrement automatique" #: ../src/gui/mainFrame.cpp:6030 msgid "Unable to load autosave file.." msgstr "Impossible de charger le fichier d'enregistrement automatique .." #: ../src/gui/mainFrame.cpp:6221 msgid "List of available filters" msgstr "Liste de filtres disponibles " #: ../src/gui/mainFrame.cpp:6223 msgid "" "Tree - drag to move items, hold ⌘ for copy, shift for splice. Tap delete to " "remove items, multi-click to rename" msgstr "" #: ../src/gui/mainFrame.cpp:6225 msgid "" "Tree - drag to move items, hold Ctrl for copy, shift for splice. Tap delete " "to remove items, multi-click to rename." msgstr "" #: ../src/gui/mainFrame.cpp:6227 msgid "" "Enable/Disable automatic updates of data when filter change takes effect" msgstr "" "Habilitar/Impossibilitar automatique actualitza de donnée quand changement " "de filtre prend effet " #: ../src/gui/mainFrame.cpp:6230 msgid "" "Enable/Disable \"Alpha blending\" (transparency) in rendering system. " "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") " "and to make transparent surfaces. Disabling will provide faster rendering " "but look more blocky" msgstr "" #: ../src/gui/mainFrame.cpp:6231 msgid "" "Enable/Disable lighting calculations in rendering, for objects that request " "this. Lighting provides important depth cues for objects comprised of 3D " "surfaces. Disabling may allow faster rendering in complex scenes" msgstr "" "Activer / Désactiver les calculs d'éclairage dans le rendu, pour les objets " "qui demandent cela. Eclairage fournit des indices importants pour la " "profondeur des objets constitués de surfaces 3D. Désactivation peut " "permettre un rendu plus rapide dans des scènes complexes" #: ../src/gui/mainFrame.cpp:6232 #, fuzzy msgid "" "Enable/Disable weak randomisation (Galois linear feedback shift register). " "Strong randomisation uses a much slower random selection method, but " "provides better protection against inadvertent correlations, and is " "recommended for final analyses" msgstr "" "Habilitar/Impossibilitar dèbil randomisation (Galois lineal feedback " "registre de changement). Fort randomisation utilise une beaucoup de " "sélection aleatòria plus lente méthode, mais il fournit de la protection " "meilleure contre inadvertent correlacions, et c'est recommandé pour anàlisis " "finaux " #: ../src/gui/mainFrame.cpp:6234 msgid "" "Limit the number of points that can be displayed in the 3D scene. Does not " "affect filter tree calculations. Disabling this can severely reduce " "performance, due to large numbers of points being visible at once." msgstr "" #: ../src/gui/mainFrame.cpp:6235 msgid "" "Enable/Disable caching of intermediate results during filter updates. " "Disabling caching will use less system RAM, though changes to any filter " "property will cause the entire filter tree to be recomputed, greatly slowing " "computations" msgstr "" #: ../src/gui/mainFrame.cpp:6237 msgid "Camera data information" msgstr "Information de donnée de la càmera " #: ../src/gui/mainFrame.cpp:6238 ../src/gui/mainFrame.cpp:6239 #: ../src/gui/mainFrame.cpp:6240 ../src/gui/mainFrame.cpp:6241 #: ../src/gui/mainFrame.cpp:6242 ../src/gui/mainFrame.cpp:6243 msgid "Align camera view to this axis" msgstr "" #: ../src/gui/mainFrame.cpp:6244 msgid "Resize view to fit 3D data" msgstr "" #: ../src/gui/mainFrame.cpp:6245 msgid "Rotate view in the +ve direction (anti-clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6246 msgid "Rotate view cin the -ve direction (clockwise)" msgstr "" #: ../src/gui/mainFrame.cpp:6247 msgid "Step size in degrees for rotation" msgstr "" #: ../src/gui/mainFrame.cpp:6251 msgid "Enable/disable visual effects on final 3D output" msgstr "Activer / désactiver les effets visuels sur la production 3D finale" #: ../src/gui/mainFrame.cpp:6253 msgid "Enable cropping post-process effect" msgstr "Activer culture post-traitement d'effet" #: ../src/gui/mainFrame.cpp:6256 msgid "" "Colour based 3D effect enable/disable - requires appropriate colour filter " "3D glasses." msgstr "" "Couleur basée sur les effets 3D d'activer / désactiver - exige appropriées " "de filtrage de couleur des lunettes 3D." #: ../src/gui/mainFrame.cpp:6257 msgid "Glasses colour mode" msgstr "Mode de couleur des verres " #: ../src/gui/mainFrame.cpp:6259 msgid "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" msgstr "" "Niveau de la séparation entre les images gauche et droite, qui définit la " "profondeur 3D à compromis distorsion visuelle" #: ../src/gui/mainFrame.cpp:6263 ../src/backend/filters/dataLoad.cpp:535 msgid "X" msgstr "X" #: ../src/gui/mainFrame.cpp:6264 ../src/backend/filters/dataLoad.cpp:539 msgid "Y" msgstr "Y" #: ../src/gui/mainFrame.cpp:6265 msgid "Save raw data to file" msgstr "Sauve donnée crue pour archiver " #: ../src/gui/mainFrame.cpp:6266 msgid "Copy raw data to clipboard" msgstr "Copie donnée crue à clipboard " #: ../src/gui/mainFrame.cpp:6267 msgid "Manage \"stashed\" data." msgstr "" #: ../src/gui/mainFrame.cpp:6268 msgid "Program text output" msgstr "Sortie de texte du programme " #: ../src/gui/mainFrame.cpp:6269 msgid "Select active camera, or type to create new named camera" msgstr "" #: ../src/gui/mainFrame.cpp:6270 msgid "Remove the selected camera" msgstr "Càmera restaurée:. " #: ../src/gui/mainFrame.cpp:6271 msgid "Perform cropping from coordinate frame of camera" msgstr "" #: ../src/gui/mainFrame.cpp:6272 msgid "" "Set the maximum amount of RAM to use in order to speed repeat computations" msgstr "" #: ../src/gui/mainFrame.cpp:6273 msgid "Collapse the filter tree" msgstr "Arbre de filtre nouveau créé stash " #: ../src/gui/mainFrame.cpp:6274 msgid "Expand the filter tree" msgstr "Arbre de filtre nouveau créé stash " #: ../src/gui/mainFrame.cpp:6275 msgid "Process the filter tree, hold shift to purge cached filter data" msgstr "" #: ../src/gui/mainFrame.cpp:6390 msgid "Crop" msgstr "Découper" #: ../src/gui/mainFrame.cpp:6391 msgid "Stereo" msgstr "Stéréo" #: ../src/gui/mainFrame.cpp:6408 ../src/backend/filters/externalProgram.cpp:586 #: ../src/backend/filters/ionColour.cpp:336 #: ../src/backend/filters/spectrumPlot.cpp:655 msgid "Data" msgstr "Contenu" #: ../src/gui/mainFrame.cpp:6409 msgid "Cam" msgstr "Lève " #: ../src/gui/mainFrame.cpp:6410 msgid "Post" msgstr "Publier" #: ../src/gui/mainFrame.cpp:6411 msgid "Tools" msgstr "Outils" #: ../src/gui/mainFrame.cpp:6429 msgid "Raw" msgstr "Brut" #: ../src/gui/mainFrame.cpp:6473 #, fuzzy msgid "Align Camera" msgstr "Appareil photo" #: ../src/gui/mathglPane.cpp:263 msgid "No plots selected." msgstr "Chef trama a sélectionné." #: ../src/gui/mathglPane.cpp:1233 msgid "" "Unable to allocate requested memory.\n" " Try a lower resolution, or save as vector (SVG)." msgstr "" "Impossible d'allouer de la mémoire demandée.\n" "Essayez une résolution inférieure, ou enregistrer en tant que vecteur (SVG)." #: ../src/gui/mathglPane.cpp:1235 msgid "Plotting functions returned an error:\n" msgstr "Plotting Les Fonctions vont retornar une erreur:. \n" #: ../src/gui/mathglPane.cpp:1237 msgid "File readback check failed" msgstr "Archives readback le contrôle a failli " #: ../src/gui/mathglPane.cpp:1239 msgid "Filesize during readback appears to be zero." msgstr "Filesize Pendant readback apparaît pour être zéro." #: ../src/3Depict.cpp:424 msgid "File : " msgstr "Archives :. " #: ../src/3Depict.cpp:424 msgid " does not exist. Skipping" msgstr " N'existe pas. Skipping " #: ../src/backend/configFile.cpp:188 msgid "Config file present, but is not valid (root node test)" msgstr "" "Fichier de configuration présente, mais n'est pas valide (test de nœud " "racine)" #: ../src/backend/configFile.cpp:229 msgid "Unable to interpret recent file entry" msgstr "Impossible d'interpréter l'entrée des fichiers récents" #: ../src/backend/configFile.cpp:269 msgid "Unable to determine filter type in defaults listing." msgstr "" #: ../src/backend/configFile.cpp:630 msgid "Online access for non win32/apple platforms is intentionally disabled, " msgstr "" "Accès en ligne pour ne gagner32/plate-formes de pomme est intencionadament " "impossibilité,. " #: ../src/backend/configFile.cpp:631 msgid "" "regardless of the settings you use here. Use your package manager to keep up-" "to-date" msgstr "" "Malgré tout du settings t'utilise ici. Usage votre directeur de colis pour " "entretenir actuel " #: ../src/backend/plot.cpp:28 ../src/backend/filters/algorithms/mass.cpp:27 #: ../src/backend/filters/voxelise.cpp:104 #: ../src/backend/filters/filterCommon.cpp:66 #: ../src/backend/filters/spectrumPlot.cpp:76 msgid "None" msgstr "Aucun" #: ../src/backend/plot.cpp:29 msgid "Moving avg." msgstr "en Mouvant avg." #: ../src/backend/plot.cpp:33 msgid "Lines" msgstr "Lignes" #: ../src/backend/plot.cpp:34 msgid "Bars" msgstr "Barres" #: ../src/backend/plot.cpp:35 msgid "Steps" msgstr "Escaliers" #: ../src/backend/plot.cpp:36 msgid "Stem" msgstr "Tija " #: ../src/backend/plot.cpp:37 msgid "Points" msgstr "Points" #: ../src/backend/plot.cpp:39 msgid "Density" msgstr "" #: ../src/backend/plot.cpp:40 msgid "Scatter" msgstr "" #: ../src/backend/plot.cpp:788 ../src/backend/plot.cpp:796 msgid "Multiple data types" msgstr "" #: ../src/backend/plot.cpp:1662 msgid "error" msgstr "error" #: ../src/backend/plot.cpp:1967 msgid "Amplitude" msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid "WARNING: Skipping node " msgstr "AVíS: Skipping node. " #: ../src/backend/filtertree.cpp:1151 msgid " as it was not recognised" msgstr " Tandis que ne va pas être recognised " #: ../src/backend/filtertree.cpp:1189 msgid "Error processing node: " msgstr "L'Erreur que processa node:. " #: ../src/backend/filters/externalProgram.cpp:264 msgid "Collate Input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:353 msgid "Execute" msgstr "" #: ../src/backend/filters/externalProgram.cpp:394 msgid "Collate output" msgstr "" #: ../src/backend/filters/externalProgram.cpp:567 #: ../src/backend/filters/externalProgram.cpp:575 msgid "Command" msgstr "Commande" #: ../src/backend/filters/externalProgram.cpp:568 msgid "" "Full command to send to operating system. See manual for escape sequence " "meanings" msgstr "" #: ../src/backend/filters/externalProgram.cpp:571 msgid "Work Dir" msgstr "Emploi Dire " #: ../src/backend/filters/externalProgram.cpp:572 msgid "Directory to run the command in" msgstr "" #: ../src/backend/filters/externalProgram.cpp:578 msgid "Cleanup input" msgstr "Cleanup Rentrée " #: ../src/backend/filters/externalProgram.cpp:579 msgid "Erase input files when command completed" msgstr "" #: ../src/backend/filters/externalProgram.cpp:582 msgid "Cache" msgstr "Cache" #: ../src/backend/filters/externalProgram.cpp:583 msgid "" "Assume program does not alter its output, unless inputs from 3Depict are " "altered" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:41 msgid "VTK (ascii)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:42 msgid "raw binary (float32)" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:86 #: ../src/backend/filters/spatialAnalysis.cpp:584 msgid "Load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:150 #: ../src/backend/filters/dataLoad.cpp:499 #: ../src/backend/filters/dataLoad.cpp:515 #: ../src/backend/filters/rangeFile.cpp:561 #: ../src/backend/filters/rangeFile.cpp:571 msgid "File" msgstr "Fichier" #: ../src/backend/filters/voxelLoad.cpp:151 msgid "Set the data file to load" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:153 msgid "VTK Files (*.vtk)|*.vtk" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:165 msgid "File Type" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:166 msgid "Type of data that file contains" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:169 #: ../src/backend/filters/annotation.cpp:588 msgid "Enable" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:170 #: ../src/backend/filters/annotation.cpp:589 msgid "Enable/disable annotation" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:173 msgid "Data source" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:179 msgid "Specify bounds" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:180 msgid "Manually specify the bounding box" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:185 msgid "Lower corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:186 msgid "Position of lower bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:189 msgid "Upper corner" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:190 msgid "Position of upper bound of voxels" msgstr "" #: ../src/backend/filters/voxelLoad.cpp:193 #: ../src/backend/filters/annotation.cpp:699 msgid "Positioning" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:28 msgid "Flat TOF" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:35 msgid "INsufficient bins to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:36 msgid "Insufficient counts to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:37 msgid "Insufficient data to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:38 msgid "Data did not appear to be random noise - cannot fit noise level" msgstr "" #: ../src/backend/filters/ionClip.cpp:65 ../src/backend/filters/profile.cpp:55 msgid "Sphere" msgstr "Sphère" #: ../src/backend/filters/ionClip.cpp:66 msgid "Plane" msgstr "Plan" #: ../src/backend/filters/ionClip.cpp:67 msgid "Cylinder" msgstr "Cylindre" #: ../src/backend/filters/ionClip.cpp:68 msgid "Aligned box" msgstr "Aligned Caisse " #: ../src/backend/filters/ionClip.cpp:497 #: ../src/backend/filters/profile.cpp:1081 msgid "Primitive" msgstr "Objet" #: ../src/backend/filters/ionClip.cpp:498 msgid "Shape of clipping object" msgstr "" #: ../src/backend/filters/ionClip.cpp:501 #: ../src/backend/filters/profile.cpp:1086 msgid "Show Primitive" msgstr "Le Spectacle Primitiu " #: ../src/backend/filters/ionClip.cpp:502 msgid "Display the 3D interaction object" msgstr "" #: ../src/backend/filters/ionClip.cpp:505 msgid "Invert Clip" msgstr "Invert Clip " #: ../src/backend/filters/ionClip.cpp:506 msgid "" "Switch between retaining points inside (disabled) and outside (enabled) of " "primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:517 #: ../src/backend/filters/profile.cpp:1119 msgid "Position for centre of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:520 #: ../src/backend/filters/spatialAnalysis.cpp:144 #: ../src/backend/filters/profile.cpp:1107 #: ../src/backend/filters/profile.cpp:1122 msgid "Radius" msgstr "Rayon" #: ../src/backend/filters/ionClip.cpp:521 #: ../src/backend/filters/profile.cpp:1123 msgid "Radius of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:531 msgid "Position that plane passes through" msgstr "" #: ../src/backend/filters/ionClip.cpp:534 msgid "Plane Normal" msgstr "L'Avion Normal " #: ../src/backend/filters/ionClip.cpp:535 msgid "Perpendicular direction for plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:547 msgid "Centre of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:550 #: ../src/backend/filters/spatialAnalysis.cpp:989 #: ../src/backend/filters/profile.cpp:1100 #: ../src/backend/filters/transform.cpp:1261 msgid "Axis" msgstr "Axe" #: ../src/backend/filters/ionClip.cpp:551 msgid "Positive vector for cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:554 msgid "Lock Axis Mag." msgstr "Axe de pany Mag." #: ../src/backend/filters/ionClip.cpp:555 msgid "Prevent changing length of cylinder during 3D interaction" msgstr "" #: ../src/backend/filters/ionClip.cpp:558 msgid "Radius." msgstr "" #: ../src/backend/filters/ionClip.cpp:559 #: ../src/backend/filters/profile.cpp:1108 msgid "Radius of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:568 msgid "Centre of Aligned Box" msgstr "" #: ../src/backend/filters/ionClip.cpp:571 msgid "Corner offset" msgstr "Offset de coin " #: ../src/backend/filters/ionClip.cpp:572 msgid "Vector to corner of box" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:84 #: ../src/backend/filters/clusterAnalysis.cpp:1025 msgid "Size Distribution" msgstr "Distribution de mida " #: ../src/backend/filters/clusterAnalysis.cpp:85 msgid "Chemistry Distribution" msgstr "Distribution de chimie " #: ../src/backend/filters/clusterAnalysis.cpp:504 msgid "No range data. Can't cluster." msgstr "Chef donnée de gamme. Il peut ne groupe." #: ../src/backend/filters/clusterAnalysis.cpp:515 msgid "" "No ranges selected for cluster \"core\". Cannot continue with clustering." msgstr "Chef gamme a sélectionné pour groupe. " #: ../src/backend/filters/clusterAnalysis.cpp:524 msgid "" "No ranges selected for cluster \"bulk\". Cannot continue with clustering." msgstr "Chef gamme a sélectionné pour groupe. " #: ../src/backend/filters/clusterAnalysis.cpp:696 msgid "Morphology Plot" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:697 msgid "\\lambda_1:\\lambda_2 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:698 msgid "\\lambda_2:\\lambda_3 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:699 msgid "Cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:744 msgid "No clusters had sufficient dimensionality to compute singular values" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:802 msgid "Found :" msgstr "Trouvé : " #: ../src/backend/filters/clusterAnalysis.cpp:804 msgid " clusters" msgstr " Groupes " #: ../src/backend/filters/clusterAnalysis.cpp:899 msgid "Compositions (fractional, core+bulk)" msgstr "Compositions (fraccionari, noyau+bulk) " #: ../src/backend/filters/clusterAnalysis.cpp:901 msgid "Compositions (fractional, core only)" msgstr "Compositions (fraccionari, le noyau unique) " #: ../src/backend/filters/clusterAnalysis.cpp:919 msgid "Frequencies (core+bulk)" msgstr "Fréquences (noyau+bulk) " #: ../src/backend/filters/clusterAnalysis.cpp:950 msgid "Core Link + Erode" msgstr "Lien de noyau + Erosiona " #: ../src/backend/filters/clusterAnalysis.cpp:953 #: ../src/backend/filters/clusterAnalysis.cpp:957 #: ../src/backend/filters/spatialAnalysis.cpp:804 #: ../src/backend/filters/spatialAnalysis.cpp:809 #: ../src/backend/filters/transform.cpp:1163 #: ../src/backend/filters/ionInfo.cpp:674 msgid "Algorithm" msgstr "Algorithme" #: ../src/backend/filters/clusterAnalysis.cpp:954 msgid "Cluster algorithm mode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:964 msgid "Core Classify" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:965 msgid "" "Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:970 msgid "Core Classify Dist" msgstr "Le Noyau Classe Dist " #: ../src/backend/filters/clusterAnalysis.cpp:971 msgid "Restrict only atoms joind by this distance to be cluster sources" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:974 msgid "Classify Knn Max" msgstr "Classe Knn Max " #: ../src/backend/filters/clusterAnalysis.cpp:975 msgid "" "Require that the kth NN (this number) is within the classify distance, to be " "a cluster source" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:979 msgid "Core Link Dist" msgstr "Lien de noyau Dist " #: ../src/backend/filters/clusterAnalysis.cpp:980 msgid "Distance between clusters to allow linking" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:983 msgid "Bulk Link" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:984 msgid "Enable linking of non-cluster species - eg for composition analysis" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:989 msgid "Bulk Link (Envelope) dist" msgstr "Bulk Lien (Enveloppe) Dist " #: ../src/backend/filters/clusterAnalysis.cpp:990 msgid "" "Distance from core points, that form a cluster, used to grab surrounding " "bulk points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:993 msgid "Erosion" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:994 msgid "" "Enable removal of edge bulk atoms, to remove \"cloud\" of atoms beyond the " "nominal cluster limits (hole-closing halo)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:999 msgid "Erode Dist" msgstr "Erosiona Dist " #: ../src/backend/filters/clusterAnalysis.cpp:1000 msgid "" "Distance from unclustered material in which bulk points are eroded from " "cluster" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1006 msgid "Clustering Params" msgstr "Clustering Params " #: ../src/backend/filters/clusterAnalysis.cpp:1010 msgid "Size Cropping" msgstr "Mida Cropping " #: ../src/backend/filters/clusterAnalysis.cpp:1011 msgid "Remove clusters based upon size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1016 msgid "Min Size" msgstr "Taille min." #: ../src/backend/filters/clusterAnalysis.cpp:1017 msgid "Remove clusters below this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1020 msgid "Max Size" msgstr "Taille max." #: ../src/backend/filters/clusterAnalysis.cpp:1021 msgid "Remove clusters above this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1026 msgid "Show number of clusters as a function of cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1031 msgid "Dist. Log Scale" msgstr "Log échelle " #: ../src/backend/filters/clusterAnalysis.cpp:1032 msgid "Use logarithmic scale for size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1037 msgid "Morphology Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1038 msgid "Create a plot showing cluster aspect ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1041 msgid "Cluster Id" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1042 msgid "Assign cluster output a unique per-cluster value (id)." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1047 msgid "Chemistry Dist." msgstr "Chimie Dist." #: ../src/backend/filters/clusterAnalysis.cpp:1048 msgid "Create a plot showing chemistry for each cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1053 msgid "Normalise Comp." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1054 msgid "Convert cluster counts to composition" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1059 msgid "Postprocess" msgstr "Postprocess " #: ../src/backend/filters/clusterAnalysis.cpp:1078 msgid "If selected, use as \"core\" ion type (can make clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1083 msgid "Core Ranges" msgstr "Gammes de noyau " #: ../src/backend/filters/clusterAnalysis.cpp:1090 msgid "Enable/Disable All" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1091 msgid "Enable/disable all ions for bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1103 msgid "" "If selected, use as \"bulk\" ion type (can be included in existing clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1108 msgid "Bulk Ranges" msgstr "Bulk Gammes " #: ../src/backend/filters/clusterAnalysis.cpp:1124 msgid "Max. Sep + Erode" msgstr "Max. Sep + Erosiona " #: ../src/backend/filters/clusterAnalysis.cpp:1881 msgid " --------------------------- Parameter selection notice ------------- " msgstr "" " --------------------------- Avís de sélection du paramètre -------------. " #: ../src/backend/filters/clusterAnalysis.cpp:1882 msgid "You have specified a bulk distance larger than half your link distance." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1883 msgid "" "You can do this; thats OK, but the output is no longer independent of the " "computational process;" msgstr "" "Peux faire ce; thats OK, mais la sortie est déjà n'indépendante du procès " "computacional; " #: ../src/backend/filters/clusterAnalysis.cpp:1884 #, fuzzy msgid "" "This will be a problem in the case where two or more clusters can equally " "lay claim to a \"bulk\" ion. " msgstr "" "Ce sera un problème en le cas où deux ou plus les groupes également peuvent " "mettre réclamation à un. " #: ../src/backend/filters/clusterAnalysis.cpp:1885 msgid "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." msgstr "" " Si votre inter-distance de groupe est suficientment grand (plus grand que " "votre bulk raccordant distance), alors te peux escapar avec ce." #: ../src/backend/filters/clusterAnalysis.cpp:1886 msgid "" " In theory it is possible to \"join\" the clusters, but this has not been " "implemented for speed reasons." msgstr " En théorie est possible à implementat pour des raisons de vitesse." #: ../src/backend/filters/clusterAnalysis.cpp:1887 msgid "" "If you want this, please contact the author, or just use the source to add " "this in yourself." msgstr "" "Si veux ce, si vous plau contactar l'auteur, ou seulement utiliser la source " "pour ajouter cet en tu." #: ../src/backend/filters/clusterAnalysis.cpp:1888 msgid "---------------------------------------------------------------------- " msgstr "----------------------------------------------------------------------. " #: ../src/backend/filters/clusterAnalysis.cpp:1898 #: ../src/backend/filters/spatialAnalysis.cpp:576 #: ../src/backend/filters/spatialAnalysis.cpp:2428 #: ../src/backend/filters/spatialAnalysis.cpp:2914 #: ../src/backend/filters/spatialAnalysis.cpp:3203 #: ../src/backend/filters/spatialAnalysis.cpp:3505 #: ../src/backend/filters/spatialAnalysis.cpp:3656 #: ../src/backend/filters/spatialAnalysis.cpp:3744 #: ../src/backend/filters/spatialAnalysis.cpp:4016 #: ../src/backend/filters/spatialAnalysis.cpp:4238 #: ../src/backend/filters/spatialAnalysis.cpp:4431 #: ../src/backend/filters/spatialAnalysis.cpp:4661 #: ../src/backend/filters/transform.cpp:1028 msgid "Collate" msgstr "Copies assemblées" #: ../src/backend/filters/clusterAnalysis.cpp:1917 msgid "Build Core" msgstr "Noyau de complexió " #: ../src/backend/filters/clusterAnalysis.cpp:1945 msgid "Core" msgstr "Noyau" #: ../src/backend/filters/clusterAnalysis.cpp:2068 msgid "Bulk" msgstr "Bulk " #: ../src/backend/filters/clusterAnalysis.cpp:2146 msgid "Erode" msgstr "Contracter" #: ../src/backend/filters/clusterAnalysis.cpp:2224 msgid "Re-Collate" msgstr "Re-Acarar " #: ../src/backend/filters/clusterAnalysis.cpp:2279 msgid "Classify Core" msgstr "Classe Noyau " #: ../src/backend/filters/clusterAnalysis.cpp:2370 msgid "Build Bulk" msgstr "Complexió Bulk " #: ../src/backend/filters/clusterAnalysis.cpp:2618 #: ../src/backend/filters/clusterAnalysis.cpp:2832 msgid "Cluster Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2619 #: ../src/backend/filters/clusterAnalysis.cpp:2836 msgid "Frequency" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2834 msgid "Composition" msgstr "" #: ../src/backend/filters/voxelise.cpp:96 msgid "None (Raw count)" msgstr "Chef (Cru compter) " #: ../src/backend/filters/voxelise.cpp:97 msgid "Volume (Density)" msgstr "Volume (Densité) " #: ../src/backend/filters/voxelise.cpp:98 msgid "All Ions (conc)" msgstr "Tous les Ions (conc) " #: ../src/backend/filters/voxelise.cpp:99 msgid "Ratio (Num/Denom)" msgstr "Proportion (Num/Denom) " #: ../src/backend/filters/voxelise.cpp:105 msgid "Gaussian (blur)" msgstr "" #: ../src/backend/filters/voxelise.cpp:106 msgid "Lapl. of Gauss. (edges)" msgstr "" #: ../src/backend/filters/voxelise.cpp:341 msgid "Counting" msgstr "" #: ../src/backend/filters/voxelise.cpp:552 msgid "Gauss Smooth" msgstr "" #: ../src/backend/filters/voxelise.cpp:558 msgid "Calc. Laplace" msgstr "" #: ../src/backend/filters/voxelise.cpp:584 msgid "Voxel Limits (min,max): (" msgstr "Voxel Limites (min,max): ( " #: ../src/backend/filters/voxelise.cpp:594 #: ../src/backend/filters/filterCommon.cpp:475 msgid "Representation" msgstr "Représentation" #: ../src/backend/filters/voxelise.cpp:688 msgid "Fixed Width" msgstr "" #: ../src/backend/filters/voxelise.cpp:689 msgid "If true, use fixed size voxels, otherwise use fixed count" msgstr "" #: ../src/backend/filters/voxelise.cpp:694 msgid "Bin Width, X" msgstr "" #: ../src/backend/filters/voxelise.cpp:695 msgid "Voxel size in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:698 msgid "Bin Width, Y" msgstr "" #: ../src/backend/filters/voxelise.cpp:699 msgid "Voxel size in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:702 msgid "Bin Width, Z" msgstr "" #: ../src/backend/filters/voxelise.cpp:703 msgid "Voxel size in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:708 msgid "Num Bins , X" msgstr "" #: ../src/backend/filters/voxelise.cpp:709 msgid "Number of bins in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:712 msgid "Num Bins, Y" msgstr "" #: ../src/backend/filters/voxelise.cpp:713 msgid "Number of bins in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:716 msgid "Num Bins, Z" msgstr "" #: ../src/backend/filters/voxelise.cpp:717 msgid "Number of bins Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:747 msgid "Normalise by" msgstr "Normalise Pour " #: ../src/backend/filters/voxelise.cpp:748 msgid "Method to use to normalise scalar value in each voxel" msgstr "" #: ../src/backend/filters/voxelise.cpp:751 msgid "Computation" msgstr "" #: ../src/backend/filters/voxelise.cpp:758 #: ../src/backend/filters/spatialAnalysis.cpp:1172 #: ../src/backend/filters/spatialAnalysis.cpp:1191 msgid "Numerator" msgstr "Numérateur" #: ../src/backend/filters/voxelise.cpp:759 msgid "Parameter \"a\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:776 msgid "Enable this ion for numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:789 #: ../src/backend/filters/voxelise.cpp:808 #: ../src/backend/filters/spatialAnalysis.cpp:1197 #: ../src/backend/filters/spatialAnalysis.cpp:1214 msgid "Denominator" msgstr "Dénominateur" #: ../src/backend/filters/voxelise.cpp:790 msgid "Parameter \"b\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:804 msgid "Enable this ion for denominator contribution" msgstr "" #: ../src/backend/filters/voxelise.cpp:824 msgid "Threshold Mask" msgstr "" #: ../src/backend/filters/voxelise.cpp:825 msgid "Enable threshold based exclusion of values." msgstr "" #: ../src/backend/filters/voxelise.cpp:830 msgid "Count threshold" msgstr "" #: ../src/backend/filters/voxelise.cpp:831 msgid "Threshold counts above which to keep data (if normalising, denominator)" msgstr "" #: ../src/backend/filters/voxelise.cpp:834 msgid "Mask to Max" msgstr "" #: ../src/backend/filters/voxelise.cpp:835 msgid "" "If enabled, masked values are set to the voxel maximum. If disabled, minimum" msgstr "" #: ../src/backend/filters/voxelise.cpp:839 #: ../src/backend/filters/voxelise.cpp:857 msgid "Filtering" msgstr "Filtrage" #: ../src/backend/filters/voxelise.cpp:840 msgid "Smoothing method to use on voxels" msgstr "" #: ../src/backend/filters/voxelise.cpp:844 msgid "Processing" msgstr "" #: ../src/backend/filters/voxelise.cpp:848 msgid "Standard Dev" msgstr "" #: ../src/backend/filters/voxelise.cpp:849 msgid "Filtering Scale (standard deviation)" msgstr "" #: ../src/backend/filters/voxelise.cpp:852 msgid "Kernel Size" msgstr "" #: ../src/backend/filters/voxelise.cpp:853 msgid "" "Filter radius, in multiples of std. dev. Larger -> slower, more accurate" msgstr "" #: ../src/backend/filters/ionColour.cpp:144 msgid "Unable to determine colour limits" msgstr "" #: ../src/backend/filters/ionColour.cpp:302 #: ../src/backend/filters/spatialAnalysis.cpp:1238 msgid "Colour Map" msgstr "Carte de couleur " #: ../src/backend/filters/ionColour.cpp:303 #: ../src/backend/filters/filterCommon.cpp:584 #: ../src/backend/filters/filterCommon.cpp:638 msgid "Colour scheme used to assign points colours by value" msgstr "" #: ../src/backend/filters/ionColour.cpp:306 msgid "Reverse map" msgstr "" #: ../src/backend/filters/ionColour.cpp:307 msgid "Reverse the colour scale" msgstr "" #: ../src/backend/filters/ionColour.cpp:310 #: ../src/backend/filters/filterCommon.cpp:493 #: ../src/backend/filters/filterCommon.cpp:591 #: ../src/backend/filters/filterCommon.cpp:645 #: ../src/backend/filters/filterCommon.cpp:705 msgid "Show Bar" msgstr "Bar de spectacle " #: ../src/backend/filters/ionColour.cpp:311 msgid "Display the colour legend in the 3D view" msgstr "" #: ../src/backend/filters/ionColour.cpp:315 msgid "How see-through to make the legend (0- transparent, 1- solid)" msgstr "" #: ../src/backend/filters/ionColour.cpp:318 msgid "Num Colours" msgstr "Num Couleurs " #: ../src/backend/filters/ionColour.cpp:319 msgid "Number of unique colours to use in colour map" msgstr "" #: ../src/backend/filters/ionColour.cpp:322 msgid "Auto bounds" msgstr "" #: ../src/backend/filters/ionColour.cpp:323 msgid "Automatically scale colour to min/max of data range" msgstr "" #: ../src/backend/filters/ionColour.cpp:328 #: ../src/backend/filters/filterCommon.cpp:503 #: ../src/backend/filters/filterCommon.cpp:601 #: ../src/backend/filters/filterCommon.cpp:655 #: ../src/backend/filters/filterCommon.cpp:715 msgid "Map start" msgstr "Début de carte " #: ../src/backend/filters/ionColour.cpp:329 #: ../src/backend/filters/filterCommon.cpp:504 #: ../src/backend/filters/filterCommon.cpp:602 #: ../src/backend/filters/filterCommon.cpp:656 #: ../src/backend/filters/filterCommon.cpp:716 msgid "Assign points with this value to the first colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:332 msgid "Map End" msgstr "Fin de carte" #: ../src/backend/filters/ionColour.cpp:333 #: ../src/backend/filters/filterCommon.cpp:508 #: ../src/backend/filters/filterCommon.cpp:606 #: ../src/backend/filters/filterCommon.cpp:660 #: ../src/backend/filters/filterCommon.cpp:720 msgid "Assign points with this value to the last colour in map" msgstr "" #: ../src/backend/filters/ionColour.cpp:444 ../src/backend/filter.cpp:198 msgid "Aborted" msgstr "Interrompu" #: ../src/backend/filters/spatialAnalysis.cpp:131 msgid "Local Density" msgstr "Densité locale " #: ../src/backend/filters/spatialAnalysis.cpp:132 msgid "Density Filtering" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:133 msgid "Radial Distribution" msgstr "Distribution radial " #: ../src/backend/filters/spatialAnalysis.cpp:134 msgid "Axial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:135 msgid "Binomial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:136 msgid "Point Em/Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:137 msgid "Local Chemistry" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:138 msgid "Local Chem. Filter" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:139 msgid "Axial DF Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:143 msgid "Neighbour Count" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:639 #: ../src/backend/filters/spatialAnalysis.cpp:2462 #: ../src/backend/filters/spatialAnalysis.cpp:2515 #: ../src/backend/filters/spatialAnalysis.cpp:2919 #: ../src/backend/filters/spatialAnalysis.cpp:3208 #: ../src/backend/filters/spatialAnalysis.cpp:3516 #: ../src/backend/filters/spatialAnalysis.cpp:3662 #: ../src/backend/filters/spatialAnalysis.cpp:4263 #: ../src/backend/filters/spatialAnalysis.cpp:4686 msgid "Build" msgstr "Construction" #: ../src/backend/filters/spatialAnalysis.cpp:688 #: ../src/backend/filters/spatialAnalysis.cpp:3538 #: ../src/backend/filters/spatialAnalysis.cpp:4146 #: ../src/backend/filters/spatialAnalysis.cpp:4280 #: ../src/backend/filters/spatialAnalysis.cpp:4562 #: ../src/backend/filters/spatialAnalysis.cpp:4703 msgid "Compute" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:805 msgid "Spatial analysis algorithm to use" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:830 #: ../src/backend/filters/spatialAnalysis.cpp:861 msgid "Stop Mode" msgstr "Mode de chômeuse " #: ../src/backend/filters/spatialAnalysis.cpp:831 msgid "Method to use to terminate algorithm when examining each point" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:837 msgid "NN Max" msgstr "NN Max " #: ../src/backend/filters/spatialAnalysis.cpp:838 msgid "Maximum number of neighbours to examine" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:844 msgid "Normalise bins" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:845 msgid "" "Normalise counts by binwidth. Needed when comparing NN histograms against " "one another" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:848 msgid "Show Random" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:849 msgid "Show a fitted (density matched) theoretical distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:856 msgid "Dist Max" msgstr "Dist Max " #: ../src/backend/filters/spatialAnalysis.cpp:857 #: ../src/backend/filters/spatialAnalysis.cpp:1226 msgid "Maximum distance from each point for search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:869 #: ../src/backend/filters/spatialAnalysis.cpp:981 #: ../src/backend/filters/profile.cpp:1141 msgid "Num Bins" msgstr "Num Galledes " #: ../src/backend/filters/spatialAnalysis.cpp:870 #: ../src/backend/filters/spatialAnalysis.cpp:982 msgid "Number of bins for output 1D RDF plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:873 msgid "Surface Remove" msgstr "La Surface Enlève " #: ../src/backend/filters/spatialAnalysis.cpp:874 msgid "" "Exclude surface as part of source to minimise bias in RDF (at cost of " "increased noise)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:880 msgid "Remove Dist" msgstr "Enlève Dist " #: ../src/backend/filters/spatialAnalysis.cpp:881 msgid "Minimum distance to remove from surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:887 #: ../src/backend/filters/spatialAnalysis.cpp:1028 #: ../src/backend/filters/profile.cpp:1153 #: ../src/backend/filters/ionInfo.cpp:599 msgid "Normalise" msgstr "Normalise" #: ../src/backend/filters/spatialAnalysis.cpp:888 msgid "Perform normalisation of the RDF, rather than raw counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:892 #, fuzzy msgid "Plot colour" msgstr "Couleur de trama" #: ../src/backend/filters/spatialAnalysis.cpp:893 #: ../src/backend/filters/spatialAnalysis.cpp:986 msgid "Colour of output plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:897 #: ../src/backend/filters/spatialAnalysis.cpp:971 #: ../src/backend/filters/spatialAnalysis.cpp:976 #: ../src/backend/filters/spatialAnalysis.cpp:993 #: ../src/backend/filters/spatialAnalysis.cpp:1018 #: ../src/backend/filters/spatialAnalysis.cpp:1132 #: ../src/backend/filters/spatialAnalysis.cpp:1229 msgid "Alg. Params." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:908 #: ../src/backend/filters/spatialAnalysis.cpp:1147 msgid "Source" msgstr "Source" #: ../src/backend/filters/spatialAnalysis.cpp:909 msgid "Ions to use for initiating RDF search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:924 #: ../src/backend/filters/spatialAnalysis.cpp:1161 #: ../src/backend/filters/spatialAnalysis.cpp:1186 msgid "Enable/disable ion as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:929 #: ../src/backend/filters/spatialAnalysis.cpp:1166 msgid "Source Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:937 msgid "Enable/disable all ions as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:951 #: ../src/backend/filters/spatialAnalysis.cpp:1210 msgid "Enable/disable this ion as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:955 msgid "Target Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:963 #: ../src/backend/filters/spatialAnalysis.cpp:1124 msgid "Cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:964 msgid "Remove points with local density above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:967 #: ../src/backend/filters/spatialAnalysis.cpp:1128 msgid "Retain Upper" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:968 msgid "Retain either points with density above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:985 msgid "Plot Colour" msgstr "Couleur de trama" #: ../src/backend/filters/spatialAnalysis.cpp:990 msgid "Vector along which to calculate distribution function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:998 msgid "Block size" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:999 msgid "Number of ions to use per block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1002 msgid "Max Block Aspect" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1003 msgid "" "Maximum allowable block aspect ratio. Blocks above this aspect are " "discarded. Setting too high decreases correlation strength. Too low causes " "loss of statistical power." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1013 msgid "Extrusion Direction" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1014 msgid "Direction in which blocks are extended during construction." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1022 msgid "Plot Counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1023 msgid "Show the counts in the binomial histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1029 msgid "" "Normalise the counts in the binomial histogram to a probability density " "function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1033 msgid "Expected Freq" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1034 msgid "" "Show the theoretically expected probability density function for a random " "dataset with the same mean" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1042 msgid "Display Grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1043 msgid "Show the extruded grid in the 3D view. This may be slow" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1046 msgid "View Options" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1060 msgid "Ions to use when counting" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1073 msgid "Enable/disable ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1078 msgid "Enabled Ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Data File" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1087 msgid "Pos file of points to subtract/replace/etc" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1091 msgid "Match Tol." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1092 msgid "Tolerance to allow for matching" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1104 msgid "Replacment condition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1109 msgid "Replace value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1110 msgid "Use value data from file when replacing ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1114 msgid "Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1125 msgid "Remove points with local concentration above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1129 msgid "Retain either points with concentration above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1148 msgid "Enable/disable all ions as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1173 msgid "Enable/Disable all ions to use as Numerator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1198 msgid "Enable/Disable all ions to use as Denominator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1221 msgid "Angular step (deg)" msgstr "Angle (deg) " #: ../src/backend/filters/spatialAnalysis.cpp:1222 msgid "Step in degrees between calculations for angular histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1225 msgid "Dist. Max" msgstr "Dist Max" #: ../src/backend/filters/spatialAnalysis.cpp:1232 msgid "Log scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1233 msgid "Show 2D plot in logarithmic scale" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1239 msgid "Colour scheme in 2D plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1241 #: ../src/backend/filters/annotation.cpp:816 msgid "Display" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1841 msgid "Spatial analysis aborted by user" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1842 msgid "Insufficient memory for binomial. Reduce input size?" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1843 msgid "Required range data not present" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1844 msgid "Unable to generate usable binomial grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1846 msgid "Insufficient points to continue" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1847 msgid "Unable to load file" msgstr "Impossible de charger le fichier d'enregistrement automatique .." #: ../src/backend/filters/spatialAnalysis.cpp:2476 #: ../src/backend/filters/spatialAnalysis.cpp:2529 #: ../src/backend/filters/filterCommon.cpp:524 #: ../src/backend/filters/filterCommon.cpp:574 #: ../src/backend/filters/filterCommon.cpp:627 msgid "Surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2569 #: ../src/backend/filters/spatialAnalysis.cpp:2941 #: ../src/backend/filters/spatialAnalysis.cpp:3232 msgid "Analyse" msgstr "Analyse " #: ../src/backend/filters/spatialAnalysis.cpp:2648 #: ../src/backend/filters/spatialAnalysis.cpp:2742 #: ../src/backend/filters/spatialAnalysis.cpp:2811 msgid "Radial Distance" msgstr "Distance radial " #: ../src/backend/filters/spatialAnalysis.cpp:2650 #: ../src/backend/filters/spatialAnalysis.cpp:2747 msgid "Count/Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2659 #: ../src/backend/filters/spatialAnalysis.cpp:2755 msgid "NN Freq." msgstr "NN Freq." #: ../src/backend/filters/spatialAnalysis.cpp:2802 msgid "Warning, " msgstr "Avís,. " #: ../src/backend/filters/spatialAnalysis.cpp:2803 msgid "" " points were unable to find neighbour points that exceeded the search " "radius, and thus terminated prematurely" msgstr "" " Les Points étaient incapaços de trouver des points de voisin qu'ont " "surpassé la recerca radius, et pour ce terminated prematurely " #: ../src/backend/filters/spatialAnalysis.cpp:2813 msgid " RDF" msgstr " RDF " #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid "Found " msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3050 msgid " points with no neighbours - these have been dropped" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3139 #: ../src/backend/filters/spatialAnalysis.cpp:3440 msgid "Number Density (\\#/Vol^3)" msgstr "Densité de numéro (\\#/Veut^3) " #: ../src/backend/filters/spatialAnalysis.cpp:3164 #: ../src/backend/filters/spatialAnalysis.cpp:3462 msgid "Warning," msgstr "Avís, " #: ../src/backend/filters/spatialAnalysis.cpp:3165 #: ../src/backend/filters/spatialAnalysis.cpp:3463 msgid " points were un-analysable. These have been dropped" msgstr " Les Points étaient un-analysable. Ceux-ci ont été laissés tomber " #: ../src/backend/filters/spatialAnalysis.cpp:3187 #: ../src/backend/filters/spatialAnalysis.cpp:3485 msgid "And so on..." msgstr "Etcètera..." #: ../src/backend/filters/spatialAnalysis.cpp:3584 msgid "Insufficient points to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3607 msgid "Axial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3609 msgid " 1D Dist. Func." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3675 msgid "Sweep" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3717 msgid "Axial DF power" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3718 msgid "Theta - Azimuthal angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3719 msgid "Phi - Elevation angle (deg)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3753 msgid "Binomial" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3890 #: ../src/backend/filters/spatialAnalysis.cpp:3958 msgid "Ions in Block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3892 #: ../src/backend/filters/spatialAnalysis.cpp:3960 #: ../src/backend/filters/spectrumPlot.cpp:79 msgid "Probability" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3962 msgid "Count (blocks)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4037 #: ../src/backend/filters/spatialAnalysis.cpp:4452 msgid "Build Numerator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4051 #: ../src/backend/filters/spatialAnalysis.cpp:4466 msgid "Build Denominator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:4395 #: ../src/backend/filters/spatialAnalysis.cpp:4817 msgid "Relative Conc. (%)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:55 msgid "Point Cloud" msgstr "Nuage de point " #: ../src/backend/filters/filterCommon.cpp:56 msgid "Isosurface" msgstr "Isosurface " #: ../src/backend/filters/filterCommon.cpp:57 msgid "Axial slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:58 msgid "Slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:60 msgid "Volume Render" msgstr "" #: ../src/backend/filters/filterCommon.cpp:67 msgid "Linear" msgstr "" #: ../src/backend/filters/filterCommon.cpp:476 msgid "3D display method" msgstr "" #: ../src/backend/filters/filterCommon.cpp:484 msgid "Spot size" msgstr "Mida de tache " #: ../src/backend/filters/filterCommon.cpp:485 msgid "Size of the spots to use for display" msgstr "" #: ../src/backend/filters/filterCommon.cpp:489 #: ../src/backend/filters/filterCommon.cpp:533 #: ../src/backend/filters/filterCommon.cpp:587 #: ../src/backend/filters/filterCommon.cpp:641 #: ../src/backend/filters/filterCommon.cpp:692 msgid "Transparency" msgstr "Transparence" #: ../src/backend/filters/filterCommon.cpp:490 msgid "How \"see through\" each point is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:494 #: ../src/backend/filters/filterCommon.cpp:592 #: ../src/backend/filters/filterCommon.cpp:646 #: ../src/backend/filters/filterCommon.cpp:706 msgid "Display colour bar in 3D view?" msgstr "" #: ../src/backend/filters/filterCommon.cpp:497 msgid "Auto Scale" msgstr "" #: ../src/backend/filters/filterCommon.cpp:498 #: ../src/backend/filters/filterCommon.cpp:596 #: ../src/backend/filters/filterCommon.cpp:650 #: ../src/backend/filters/filterCommon.cpp:710 msgid "Auto-compute min/max values (colour limits)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:507 #: ../src/backend/filters/filterCommon.cpp:605 #: ../src/backend/filters/filterCommon.cpp:659 #: ../src/backend/filters/filterCommon.cpp:719 msgid "Map end" msgstr "Fin de carte " #: ../src/backend/filters/filterCommon.cpp:517 msgid "Surf. param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:519 msgid "Isovalue" msgstr "Isovalue " #: ../src/backend/filters/filterCommon.cpp:520 msgid "Scalar value to show as isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:529 msgid "Colour of isosurface" msgstr "" #: ../src/backend/filters/filterCommon.cpp:534 #: ../src/backend/filters/filterCommon.cpp:588 #: ../src/backend/filters/filterCommon.cpp:642 #: ../src/backend/filters/filterCommon.cpp:693 msgid "How \"see through\" each facet is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/filterCommon.cpp:544 #: ../src/backend/filters/filterCommon.cpp:616 msgid "Slice param." msgstr "" #: ../src/backend/filters/filterCommon.cpp:552 #: ../src/backend/filters/filterCommon.cpp:553 msgid "Slice Axis" msgstr "" #: ../src/backend/filters/filterCommon.cpp:554 msgid "Normal for the planar slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:559 msgid "Slice Coord" msgstr "" #: ../src/backend/filters/filterCommon.cpp:560 msgid "Fractional coordinate that slice plane passes through" msgstr "" #: ../src/backend/filters/filterCommon.cpp:569 msgid "Interp Mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:570 msgid "Interpolation mode for direction normal to slice" msgstr "" #: ../src/backend/filters/filterCommon.cpp:583 #: ../src/backend/filters/filterCommon.cpp:637 #: ../src/backend/filters/filterCommon.cpp:688 msgid "Colour Mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:595 #: ../src/backend/filters/filterCommon.cpp:649 #: ../src/backend/filters/filterCommon.cpp:709 msgid "Auto Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:618 msgid "Slice Origin" msgstr "" #: ../src/backend/filters/filterCommon.cpp:619 msgid "Point on plane for slice, in 0->1 coordinates" msgstr "" #: ../src/backend/filters/filterCommon.cpp:622 msgid "Slice Normal" msgstr "" #: ../src/backend/filters/filterCommon.cpp:623 msgid "Normal vector for slice plane" msgstr "" #: ../src/backend/filters/filterCommon.cpp:664 msgid "Colour mode" msgstr "" #: ../src/backend/filters/filterCommon.cpp:674 msgid "Built-in map" msgstr "" #: ../src/backend/filters/filterCommon.cpp:675 msgid "" "True if you want to use a built-in colour map, false to specify your own" msgstr "" #: ../src/backend/filters/filterCommon.cpp:689 #: ../src/backend/filters/filterCommon.cpp:700 msgid "Colour scheme used to assign colours and transparency by value" msgstr "" #: ../src/backend/filters/filterCommon.cpp:733 msgid "Show Bounds" msgstr "" #: ../src/backend/filters/filterCommon.cpp:734 msgid "Display the voxel's bounding box" msgstr "" #: ../src/backend/filters/filterCommon.cpp:739 msgid "Bound Colour" msgstr "" #: ../src/backend/filters/filterCommon.cpp:740 msgid "Set Voxel's bounding box colour" msgstr "" #: ../src/backend/filters/profile.cpp:53 msgid "Cylinder (axial)" msgstr "" #: ../src/backend/filters/profile.cpp:54 msgid "Cylinder (radial)" msgstr "" #: ../src/backend/filters/profile.cpp:626 #: ../src/backend/filters/annotation.cpp:81 msgid "Distance" msgstr "Distance" #: ../src/backend/filters/profile.cpp:635 msgid "Fraction" msgstr "Fraction" #: ../src/backend/filters/profile.cpp:641 msgid "Density (\\frac{\\#}{len^3})" msgstr "" #: ../src/backend/filters/profile.cpp:712 msgid "Freq. Profile" msgstr "Freq. Profil " #: ../src/backend/filters/profile.cpp:764 msgid "No data remained in profile - cannot display result" msgstr "" #: ../src/backend/filters/profile.cpp:1063 msgid "Total Density" msgstr "" #: ../src/backend/filters/profile.cpp:1064 msgid "Do not do per-species analysis, perform density computation only" msgstr "" #: ../src/backend/filters/profile.cpp:1078 msgid "Primitive type" msgstr "" #: ../src/backend/filters/profile.cpp:1079 msgid "Basic shape to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1087 msgid "Display the 3D composition profile interaction object" msgstr "" #: ../src/backend/filters/profile.cpp:1098 msgid "Position for centre of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1101 msgid "Vector between ends of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1104 msgid "Lock Axis Mag" msgstr "Axe de pany Mag." #: ../src/backend/filters/profile.cpp:1105 msgid "Prevent length of cylinder changing during interaction" msgstr "" #: ../src/backend/filters/profile.cpp:1134 msgid "Fixed Bin Num" msgstr "Galleda fixe Num " #: ../src/backend/filters/profile.cpp:1135 msgid "" "If true, use a fixed number of bins for profile, otherwise use fixed step " "size" msgstr "" #: ../src/backend/filters/profile.cpp:1142 msgid "Number of bins to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1148 #: ../src/backend/filters/spectrumPlot.cpp:636 msgid "Bin Width" msgstr "" #: ../src/backend/filters/profile.cpp:1149 msgid "Size of each bin in profile" msgstr "" #: ../src/backend/filters/profile.cpp:1154 msgid "Convert bin counts into relative frequencies in each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1157 msgid "Min. Events" msgstr "" #: ../src/backend/filters/profile.cpp:1158 msgid "Drop data that does not have this many events" msgstr "" #: ../src/backend/filters/profile.cpp:1163 msgid "Remap Ions" msgstr "" #: ../src/backend/filters/profile.cpp:1164 msgid "Break apart ions into components, using a remap file?" msgstr "" #: ../src/backend/filters/profile.cpp:1170 msgid "Remap file" msgstr "" #: ../src/backend/filters/profile.cpp:1171 msgid "\"Remap\" file that describes how the ions can be broken apart" msgstr "" #: ../src/backend/filters/profile.cpp:1176 msgid "Settings" msgstr "" #: ../src/backend/filters/profile.cpp:1190 #: ../src/backend/filters/spectrumPlot.cpp:693 msgid "Plot Type" msgstr "Type de graphique" #: ../src/backend/filters/profile.cpp:1191 msgid "Visual style for plot" msgstr "" #: ../src/backend/filters/profile.cpp:1198 msgid "Colour of plot" msgstr "" #: ../src/backend/filters/profile.cpp:1213 msgid "Err. Estimator" msgstr "Err. Estimador " #: ../src/backend/filters/profile.cpp:1216 msgid "Method of estimating error associated with each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1223 msgid "Avg. Window" msgstr "Avg. Fenêtre " #: ../src/backend/filters/profile.cpp:1226 msgid "Number of bins to include in moving average filter" msgstr "" #: ../src/backend/filters/profile.cpp:1231 msgid "Error analysis" msgstr "" #: ../src/backend/filters/transform.cpp:84 msgid "Translate" msgstr "Translater" #: ../src/backend/filters/transform.cpp:85 msgid "Scale (isotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:86 msgid "Scale (anisotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:87 msgid "Rotate" msgstr "Rotation" #: ../src/backend/filters/transform.cpp:88 msgid "Value Shuffle" msgstr "Valeur Shuffle " #: ../src/backend/filters/transform.cpp:89 msgid "Spatial Noise" msgstr "Bruit espacial " #: ../src/backend/filters/transform.cpp:90 msgid "Translate Value" msgstr "Traduit Valeur " #: ../src/backend/filters/transform.cpp:91 msgid "Crop Value" msgstr "" #: ../src/backend/filters/transform.cpp:95 msgid "Specify" msgstr "Especifica " #: ../src/backend/filters/transform.cpp:96 msgid "Boundbox Centre" msgstr "Boundbox Centre " #: ../src/backend/filters/transform.cpp:97 msgid "Mass Centre" msgstr "Centre de masse " #: ../src/backend/filters/transform.cpp:1093 msgid "Shuffle" msgstr "Mélanger" #: ../src/backend/filters/transform.cpp:1117 msgid "Splice" msgstr "Collant" #: ../src/backend/filters/transform.cpp:1159 msgid "Algorithm to use to transform point data" msgstr "" #: ../src/backend/filters/transform.cpp:1174 msgid "Origin mode" msgstr "Mode d'origine " #: ../src/backend/filters/transform.cpp:1175 msgid "Select how transform origin is computed" msgstr "" #: ../src/backend/filters/transform.cpp:1180 msgid "Display an interactive object to set transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1182 msgid "Display a small marker to denote transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1184 msgid "Show marker" msgstr "Spectacle marker " #: ../src/backend/filters/transform.cpp:1199 msgid "Translation" msgstr "Translation" #: ../src/backend/filters/transform.cpp:1200 msgid "Translation vector for transform" msgstr "" #: ../src/backend/filters/transform.cpp:1209 msgid "Offset" msgstr "" #: ../src/backend/filters/transform.cpp:1210 msgid "Scalar to use to offset each point's associated value" msgstr "" #: ../src/backend/filters/transform.cpp:1223 #: ../src/backend/filters/transform.cpp:1241 msgid "Origin of scale transform" msgstr "" #: ../src/backend/filters/transform.cpp:1227 #: ../src/backend/filters/transform.cpp:1245 msgid "Scale Fact." msgstr "Fait d'échelle." #: ../src/backend/filters/transform.cpp:1228 #: ../src/backend/filters/transform.cpp:1246 msgid "Enlargement factor for scaling around origin" msgstr "" #: ../src/backend/filters/transform.cpp:1258 msgid "Origin of Rotation" msgstr "" #: ../src/backend/filters/transform.cpp:1262 msgid "Axis around which to revolve" msgstr "" #: ../src/backend/filters/transform.cpp:1265 msgid "Angle (Deg)" msgstr "Angle (deg) " #: ../src/backend/filters/transform.cpp:1266 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)" msgstr "" #: ../src/backend/filters/transform.cpp:1281 msgid "Noise Type" msgstr "Type de bruit" #: ../src/backend/filters/transform.cpp:1282 msgid "Method to use to degrade point data" msgstr "" #: ../src/backend/filters/transform.cpp:1290 msgid "Noise Level" msgstr "" #: ../src/backend/filters/transform.cpp:1291 msgid "Amplitude of applied noise" msgstr "" #: ../src/backend/filters/transform.cpp:1296 msgid "Standard dev." msgstr "Standard dev." #: ../src/backend/filters/transform.cpp:1297 msgid "Gaussian 1-sigma spread distance" msgstr "" #: ../src/backend/filters/transform.cpp:1313 msgid "Min Value" msgstr "" #: ../src/backend/filters/transform.cpp:1314 msgid "Minimum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1316 msgid "Max Value" msgstr "" #: ../src/backend/filters/transform.cpp:1317 msgid "Maximum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1326 msgid "Transform Params" msgstr "Transforme Params " #: ../src/backend/filters/transform.cpp:1695 msgid "White" msgstr "" #: ../src/backend/filters/transform.cpp:1697 msgid "Gaussian" msgstr "" #: ../src/backend/filters/boundingBox.cpp:64 msgid "Box only" msgstr "" #: ../src/backend/filters/boundingBox.cpp:65 msgid "Tick" msgstr "" #: ../src/backend/filters/boundingBox.cpp:66 msgid "Dimension" msgstr "" #: ../src/backend/filters/boundingBox.cpp:569 msgid "If true, show box, otherwise hide box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:582 msgid "Style" msgstr "" #: ../src/backend/filters/boundingBox.cpp:583 msgid "Box display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:586 msgid "Display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:594 msgid "Fixed Tick Num" msgstr "" #: ../src/backend/filters/boundingBox.cpp:595 msgid "" "If true, evenly use specified number of ticks. Otherwise, use distance to " "determine tick count" msgstr "" #: ../src/backend/filters/boundingBox.cpp:600 msgid "Num X" msgstr "Num Xème " #: ../src/backend/filters/boundingBox.cpp:600 msgid "Tick count in X direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:603 msgid "Num Y" msgstr "Num Y " #: ../src/backend/filters/boundingBox.cpp:603 msgid "Tick count in Y direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:606 msgid "Num Z" msgstr "Num Z " #: ../src/backend/filters/boundingBox.cpp:606 msgid "Tick count in Z direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Spacing X" msgstr "Espacé Xème " #: ../src/backend/filters/boundingBox.cpp:611 msgid "Distance between ticks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Spacing Y" msgstr "Espacé Y " #: ../src/backend/filters/boundingBox.cpp:614 msgid "Distance between ticks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:617 msgid "Spacing Z" msgstr "Espacé Z " #: ../src/backend/filters/boundingBox.cpp:617 msgid "Distance between ticks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Ticks X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:624 msgid "Display tick marks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Ticks Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Display tick marks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Ticks Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Display tick marks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:633 msgid "Tick marks" msgstr "" #: ../src/backend/filters/boundingBox.cpp:639 msgid "Box Colour" msgstr "Couleur de caisse " #: ../src/backend/filters/boundingBox.cpp:640 msgid "Colour of the bounding box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:644 msgid "Line thickness" msgstr "Gruix de ligne " #: ../src/backend/filters/boundingBox.cpp:645 msgid "Thickness of the lines used to draw the box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:651 #: ../src/backend/filters/annotation.cpp:780 msgid "Font Size" msgstr "Taille de fonte" #: ../src/backend/filters/boundingBox.cpp:652 msgid "Relative size for text" msgstr "" #: ../src/backend/filters/boundingBox.cpp:655 msgid "Abs. Coords" msgstr "" #: ../src/backend/filters/boundingBox.cpp:656 msgid "Show labels using absolute co-ordinates" msgstr "" #: ../src/backend/filters/annotation.cpp:80 msgid "Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:86 msgid "Arrow" msgstr "Flèche" #: ../src/backend/filters/annotation.cpp:87 msgid "Text" msgstr "Texte" #: ../src/backend/filters/annotation.cpp:88 msgid "Arrow+Text" msgstr "Texte+de flèche " #: ../src/backend/filters/annotation.cpp:89 msgid "Angle" msgstr "" #: ../src/backend/filters/annotation.cpp:90 msgid "Ruler" msgstr "Règle" #: ../src/backend/filters/annotation.cpp:192 ../src/backend/filter.cpp:55 msgid "Draw" msgstr "Nul" #: ../src/backend/filters/annotation.cpp:595 msgid "Status" msgstr "" #: ../src/backend/filters/annotation.cpp:608 msgid "Type or style of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:622 #: ../src/backend/filters/annotation.cpp:646 msgid "Text of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:626 msgid "Position of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:629 #: ../src/backend/filters/annotation.cpp:670 #: ../src/backend/filters/annotation.cpp:702 msgid "Up dir" msgstr "Chef amunt de dire " #: ../src/backend/filters/annotation.cpp:630 #: ../src/backend/filters/annotation.cpp:671 #: ../src/backend/filters/annotation.cpp:703 #: ../src/backend/filters/annotation.cpp:773 msgid "Vector for up direction of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:633 #: ../src/backend/filters/annotation.cpp:673 #: ../src/backend/filters/annotation.cpp:706 msgid "Across dir" msgstr "à travers dire " #: ../src/backend/filters/annotation.cpp:634 #: ../src/backend/filters/annotation.cpp:674 #: ../src/backend/filters/annotation.cpp:707 #: ../src/backend/filters/annotation.cpp:777 msgid "Reading direction for annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:637 #: ../src/backend/filters/annotation.cpp:666 #: ../src/backend/filters/annotation.cpp:722 msgid "Text size" msgstr "Taille texte" #: ../src/backend/filters/annotation.cpp:638 #: ../src/backend/filters/annotation.cpp:667 #: ../src/backend/filters/annotation.cpp:723 #: ../src/backend/filters/annotation.cpp:781 msgid "Relative size of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:653 msgid "3D position for tail of arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:658 msgid "3D position to which arrow points" msgstr "" #: ../src/backend/filters/annotation.cpp:663 msgid "Options" msgstr "" #: ../src/backend/filters/annotation.cpp:677 msgid "Arrow radius" msgstr "" #: ../src/backend/filters/annotation.cpp:678 msgid "Size of the arrow head" msgstr "" #: ../src/backend/filters/annotation.cpp:687 msgid "Position A" msgstr "Position Un " #: ../src/backend/filters/annotation.cpp:688 msgid "Location of first non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:692 msgid "Location of central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:695 msgid "Position B" msgstr "Position B " #: ../src/backend/filters/annotation.cpp:696 msgid "Location of second non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:710 msgid "Reflexive" msgstr "Reflexive " #: ../src/backend/filters/annotation.cpp:711 msgid "Measure interor (enabled) or exterior angle (disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:714 msgid "Show Angle" msgstr "Angle de spectacle " #: ../src/backend/filters/annotation.cpp:715 msgid "Display angle text (when enabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:741 msgid "Digit Format" msgstr "Format de dígit" #: ../src/backend/filters/annotation.cpp:741 msgid "" "Format of angle text; # for numeral position, '.' for separator, eg ##.## " "gives 12.34" msgstr "" #: ../src/backend/filters/annotation.cpp:747 msgid "Sphere size" msgstr "Sphere Mida " #: ../src/backend/filters/annotation.cpp:748 #: ../src/backend/filters/annotation.cpp:804 msgid "Marker sphere size for manipulating tool" msgstr "" #: ../src/backend/filters/annotation.cpp:760 msgid "Display Style" msgstr "" #: ../src/backend/filters/annotation.cpp:761 msgid "Set the appearance of the ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:765 msgid "Ruler beginning location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:769 msgid "Ruler finish location, in 3D" msgstr "" #: ../src/backend/filters/annotation.cpp:772 msgid "Up direction" msgstr "" #: ../src/backend/filters/annotation.cpp:776 msgid "Across direction" msgstr "à travers dire " #: ../src/backend/filters/annotation.cpp:784 msgid "Fixed Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:785 msgid "" "Use fixed (enabled) number of text markers, or one every fixed distance " "(disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:790 msgid "Num Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:791 msgid "Number of tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:796 msgid "Tick Spacing" msgstr "" #: ../src/backend/filters/annotation.cpp:797 msgid "Distance between tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:803 msgid "Sphere Size" msgstr "" #: ../src/backend/filters/annotation.cpp:814 msgid "Colour for ruler and ticks" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:210 msgid "Sampling" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:463 msgid "By Count" msgstr "Pour Compter " #: ../src/backend/filters/ionDownsample.cpp:464 msgid "Sample up to a fixed number of ions" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:469 msgid "Per Species" msgstr "Pour Espèce " #: ../src/backend/filters/ionDownsample.cpp:470 msgid "Use species specific (from ranging) sampling values" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:501 msgid "Sampling value for species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:508 #: ../src/backend/filters/ionInfo.cpp:371 #: ../src/backend/filters/ionInfo.cpp:429 msgid "Unranged" msgstr "Unranged " #: ../src/backend/filters/ionDownsample.cpp:517 #: ../src/backend/filters/ionDownsample.cpp:534 msgid "Sampling rates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:523 msgid "Output Count" msgstr "La Sortie Compte " #: ../src/backend/filters/ionDownsample.cpp:524 msgid "Sample up to this value of points" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:529 msgid "Out Fraction" msgstr "Hors Fracció " #: ../src/backend/filters/ionDownsample.cpp:530 msgid "Sample this fraction of points" msgstr "" #: ../src/backend/filters/ionInfo.cpp:42 msgid "Rectilinear" msgstr "Rectilinéaire" #: ../src/backend/filters/ionInfo.cpp:43 msgid "Convex hull" msgstr "Convex hull " #: ../src/backend/filters/ionInfo.cpp:226 msgid "No ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:248 msgid "Ion counts" msgstr "" #: ../src/backend/filters/ionInfo.cpp:267 msgid "" "Background fit failed - input data was considered ill formed (gauss-test)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:268 msgid "Following data has not been corrected" msgstr "" #: ../src/backend/filters/ionInfo.cpp:321 msgid "--Counts--" msgstr "--Compte-- " #: ../src/backend/filters/ionInfo.cpp:333 msgid "Total ranged (without remap)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:335 msgid "Total Ranged\t" msgstr "Le Total a Varié. \t" #: ../src/backend/filters/ionInfo.cpp:341 msgid "Total (incl. unranged,without remap)\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:343 msgid "Total (incl. unranged)\t" msgstr "Total (incl. unranged). \t" #: ../src/backend/filters/ionInfo.cpp:361 #: ../src/backend/filters/ionInfo.cpp:415 msgid "n/a" msgstr "" #: ../src/backend/filters/ionInfo.cpp:434 msgid "Unranged ions ignored" msgstr "" #: ../src/backend/filters/ionInfo.cpp:447 msgid "Number of points : " msgstr "Numéro de points :. " #: ../src/backend/filters/ionInfo.cpp:459 #: ../src/backend/filters/ionInfo.cpp:661 msgid "Volume" msgstr "Volume" #: ../src/backend/filters/ionInfo.cpp:480 msgid "Rectilinear Bounds : " msgstr "Rectiligne Saute : " #: ../src/backend/filters/ionInfo.cpp:485 msgid "Volume (len^3): " msgstr "Volume (len^3): " #: ../src/backend/filters/ionInfo.cpp:502 msgid "Convex Volume (len^3): " msgstr "Convex Volume (len^3): " #: ../src/backend/filters/ionInfo.cpp:505 msgid "Unable to compute volume" msgstr "Incapaç de computar volume " #: ../src/backend/filters/ionInfo.cpp:535 msgid "Ranged Density (pts/vol):" msgstr "Densité variée (pts/veut): " #: ../src/backend/filters/ionInfo.cpp:540 msgid "Total Density (pts/vol):" msgstr "Densité totale (pts/veut): " #: ../src/backend/filters/ionInfo.cpp:568 msgid "Compositions" msgstr "Compositions " #: ../src/backend/filters/ionInfo.cpp:569 msgid "Display compositional data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:574 msgid "Remap ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:575 msgid "Break up ion counts/compositions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:581 msgid "Remap File" msgstr "" #: ../src/backend/filters/ionInfo.cpp:582 msgid "File describing how ions are to be broken up" msgstr "" #: ../src/backend/filters/ionInfo.cpp:590 msgid "Counts" msgstr "Compte " #: ../src/backend/filters/ionInfo.cpp:591 msgid "Display count data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:596 msgid "Ion data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:600 msgid "Normalise count data by totals" msgstr "" #: ../src/backend/filters/ionInfo.cpp:662 msgid "Compute volume for point data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:675 msgid "Select volume counting technique" msgstr "" #: ../src/backend/filters/ionInfo.cpp:678 msgid "Volume data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:63 msgid "Auto" msgstr "" #: ../src/backend/filters/dataLoad.cpp:64 msgid "Little" msgstr "" #: ../src/backend/filters/dataLoad.cpp:65 msgid "Big" msgstr "" #: ../src/backend/filters/dataLoad.cpp:68 msgid "POS Data" msgstr "POS Donnée " #: ../src/backend/filters/dataLoad.cpp:69 msgid "Text Data" msgstr "Donnée de texte " #: ../src/backend/filters/dataLoad.cpp:70 msgid "ATO Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:71 msgid "Tapsim Data" msgstr "Tapsim Donnée " #: ../src/backend/filters/dataLoad.cpp:72 msgid "3Dap/Posap OPS Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:232 msgid " does not exist" msgstr " N'existe pas " #: ../src/backend/filters/dataLoad.cpp:253 msgid "Reading File" msgstr "" #: ../src/backend/filters/dataLoad.cpp:268 #: ../src/backend/filters/dataLoad.cpp:281 #: ../src/backend/filters/dataLoad.cpp:325 #: ../src/backend/filters/dataLoad.cpp:336 #: ../src/backend/filters/dataLoad.cpp:396 #: ../src/backend/filters/dataLoad.cpp:418 #: ../src/backend/filters/dataLoad.cpp:436 msgid "Error loading file: " msgstr "Erreur lors du chargement du fichier :" #: ../src/backend/filters/dataLoad.cpp:298 msgid "Sampling is active, loaded " msgstr "" #: ../src/backend/filters/dataLoad.cpp:299 msgid " available." msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 msgid "Loaded entire dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:307 #: ../src/backend/filters/dataLoad.cpp:406 #: ../src/backend/filters/dataLoad.cpp:428 #: ../src/backend/filters/dataLoad.cpp:446 msgid " points." msgstr "" #: ../src/backend/filters/dataLoad.cpp:351 msgid "" "Data file contained incorrect number of columns -- should be 3 or 4, was " msgstr "" #: ../src/backend/filters/dataLoad.cpp:405 #: ../src/backend/filters/dataLoad.cpp:427 #: ../src/backend/filters/dataLoad.cpp:445 msgid "Loaded dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:477 #, fuzzy msgid "" "Warning:One or more bounds of the loaded data approaches the limits of " "numerical stability for the internal data type(magnitude too large). " "Consider rescaling data before loading" msgstr "" "Avís:Un ou plus saute de la donnée chargée s'acosta les limites de numérique " "stability pour le type de donnée interne(magnitud trop grande). Il envisage " "rescaling donnée avant de charger " #: ../src/backend/filters/dataLoad.cpp:500 msgid "File from which to load data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:502 msgid "" "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato, *.ops)|*.xml;*.pos;*.txt;*." "csv;*.ato;*.ops|All Files|*" msgstr "" #: ../src/backend/filters/dataLoad.cpp:511 msgid "File type" msgstr "Type de fichier" #: ../src/backend/filters/dataLoad.cpp:512 msgid "Type of fil to be loaded" msgstr "" #: ../src/backend/filters/dataLoad.cpp:524 msgid "Entries per point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:525 msgid "Number of decimal values in file per 3D point (normally 4)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:536 msgid "Relative offset of each entry in file for point's X position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:540 msgid "Relative offset of each entry in file for point's Y position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:543 msgid "Z" msgstr "Z" #: ../src/backend/filters/dataLoad.cpp:544 msgid "Relative offset of each entry in file for point's Z position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:548 msgid "" "Relative offset of each entry in file to use for scalar value of 3D point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:564 msgid "File \"Endianness\"" msgstr "" #: ../src/backend/filters/dataLoad.cpp:565 msgid "On-disk data storage format. If file won't load, just try each" msgstr "" #: ../src/backend/filters/dataLoad.cpp:574 msgid "Recon. Width" msgstr "" #: ../src/backend/filters/dataLoad.cpp:575 msgid "" "Width of box onto which to place reconstructed detector hits (similar to tip " "radius)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:579 msgid "Ion Volume" msgstr "" #: ../src/backend/filters/dataLoad.cpp:580 msgid "Effective volume of an ion (incl. free packing volume)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:584 msgid "Det. Efficiency" msgstr "" #: ../src/backend/filters/dataLoad.cpp:585 msgid "" "Effiency of system (ions evaporated towards detector/ions detected by " "detector)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:596 msgid "Value Label" msgstr "Etiqueta de valeur " #: ../src/backend/filters/dataLoad.cpp:597 msgid "Name for the scalar value associated with each point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:600 msgid "Format params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Enabled" msgstr "Activé" #: ../src/backend/filters/dataLoad.cpp:604 msgid "Load this file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "Sample data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:613 msgid "" "Perform random selection on file contents,instead of loading entire file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:619 msgid "Load Limit (MB)" msgstr "Limite de charge (MB) " #: ../src/backend/filters/dataLoad.cpp:620 msgid "Limit for size of data to load" msgstr "" #: ../src/backend/filters/dataLoad.cpp:626 msgid "Monitor" msgstr "Moniteur" #: ../src/backend/filters/dataLoad.cpp:627 msgid "" "Watch file timestamp to track changes to file contents from other programs" msgstr "" #: ../src/backend/filters/dataLoad.cpp:631 msgid "Load params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:638 msgid "Default colour" msgstr "Default Couleur. " #: ../src/backend/filters/dataLoad.cpp:639 msgid "Default colour for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/dataLoad.cpp:643 msgid "Draw Size" msgstr "Mida de sorteig " #: ../src/backend/filters/dataLoad.cpp:644 msgid "Default size for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:77 msgid "Maximum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:78 msgid "Max in limit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:171 msgid "Extrema" msgstr "Extrema" #: ../src/backend/filters/spectrumPlot.cpp:220 msgid "count" msgstr "nombre" #: ../src/backend/filters/spectrumPlot.cpp:311 msgid "Mixed data" msgstr "Donnée mixta " #: ../src/backend/filters/spectrumPlot.cpp:441 msgid "Background fit failed" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:446 msgid "" "Insufficient bins (data points) to perform fit. Try decreasing bin size, or " "expanding range" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:449 msgid "" "Insufficient counts to perform fit. Try expanding range, or increasing " "number of ions" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:452 msgid "Insufficient data to compute Anderson-Darling statistic" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:455 msgid "" "Background noise does not appear to be gaussian-like, ensure range contains " "no peaks" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:472 msgid "Background:" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:529 #: ../src/backend/filters/spectrumPlot.cpp:531 msgid "Relative " msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:534 #: ../src/backend/filters/spectrumPlot.cpp:536 msgid "Probability Density" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:637 msgid "Step size for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:640 msgid "Auto Min/Max" msgstr "Voiture Min/max" #: ../src/backend/filters/spectrumPlot.cpp:641 msgid "Automatically compute spectrum upper and lower bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:647 msgid "Starting position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:651 msgid "Ending position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:658 msgid "Logarithmic" msgstr "Logarithmique" #: ../src/backend/filters/spectrumPlot.cpp:659 msgid "Convert the plot to logarithmic mode" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:669 msgid "Normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:670 msgid "Rescale the plot height, to make inter-spectrum comparisons easier" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:676 msgid "Lower Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:677 msgid "Do not use data below this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:680 msgid "Upper Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:681 msgid "Do not use data above this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:694 msgid "Visual style of plot" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:698 msgid "Colour of plotted spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:713 msgid "Model" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:714 msgid "Background fitting method to use" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:725 msgid "Fit Start" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:726 msgid "Start mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:729 msgid "Fit End" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:730 msgid "End mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:740 msgid "Corr. Only" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:741 msgid "Only show corrected spectrum, not fit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:746 msgid "Background Mode" msgstr "" #: ../src/backend/filters/rangeFile.cpp:121 #: ../src/backend/filters/rangeFile.h:96 msgid "Ranging" msgstr "en Variant " #: ../src/backend/filters/rangeFile.cpp:562 msgid "File to use for range data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:567 msgid "Drop unranged" msgstr "Goutte unranged " #: ../src/backend/filters/rangeFile.cpp:568 msgid "Remove unranged points when generating output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:576 msgid "Legend" msgstr "" #: ../src/backend/filters/rangeFile.cpp:577 msgid "Display colour legend for enabled ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:580 msgid "View" msgstr "" #: ../src/backend/filters/rangeFile.cpp:596 msgid "All Ions" msgstr "Tous les Ions " #: ../src/backend/filters/rangeFile.cpp:597 msgid "Enable/disable all ions at once" msgstr "" #: ../src/backend/filters/rangeFile.cpp:605 msgid "Species" msgstr "" #: ../src/backend/filters/rangeFile.cpp:612 msgid "IonID " msgstr "IonID. " #: ../src/backend/filters/rangeFile.cpp:613 msgid "Enable/disable specified ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:625 msgid "Active Ion " msgstr "Ió actif. " #: ../src/backend/filters/rangeFile.cpp:627 msgid "If true, ion is used in output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:638 msgid "Colour " msgstr "Couleurs" #: ../src/backend/filters/rangeFile.cpp:642 msgid "Colour used to represent ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:666 msgid "All Ranges" msgstr "Toutes les Gammes " #: ../src/backend/filters/rangeFile.cpp:667 msgid "Enable/disable all ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:682 msgid "Active Rng " msgstr "Actif Rng. " #: ../src/backend/filters/rangeFile.cpp:685 msgid "" "Enable/disable specified range (ion must also be enabled to activiate range)" msgstr "" #: ../src/backend/filters/rangeFile.cpp:692 msgid "Ion " msgstr "Ion" #: ../src/backend/filters/rangeFile.cpp:695 msgid "Name of ion associate to this range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:706 msgid "Start rng " msgstr "Début rng. " #: ../src/backend/filters/rangeFile.cpp:709 msgid "Start value for range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:716 msgid "End rng " msgstr "Fin rng. " #: ../src/backend/filters/rangeFile.cpp:719 msgid "Stopping value for range`" msgstr "" #: ../src/backend/state.cpp:170 msgid "" "This file is a \"state\" file for the 3Depict program, and stores " "information about a particular analysis session. This file should be a valid " "\"XML\" file" msgstr "" "Ce archives est une information enveloppe une séance d'anàlisi particulière " "Ce archives devrait être un valable. " #: ../src/backend/state.cpp:346 msgid "Failed to allocate parser" msgstr "Failli à allocate parser " #: ../src/backend/state.cpp:381 msgid "" "Unable to retrieve root node in input state file... Is this really a non-" "empty XML file?" msgstr "" "Impossible de récupérer le nœud racine dans le fichier de l'état " "d'entrée ... Est-ce vraiment un fichier XML non vide?" #: ../src/backend/state.cpp:388 msgid "Base state node missing. Is this really a state XML file??" msgstr "Noeud d'état de base manquant. Est-ce vraiment un fichier d'état XML?" #: ../src/backend/state.cpp:417 #, fuzzy msgid "State was created by a newer version of this program.. " msgstr "" "L'état a été créé pour une version une plus nouvelle de ce programme... " #: ../src/backend/state.cpp:418 msgid "file reading will continue, but may fail." msgstr "Lecture d'archives continuera, mais il peut faillir." #: ../src/backend/state.cpp:428 msgid "" "Warning, unparseable version number in state file. File reading will " "continue, but may fail" msgstr "" "Avís, unparseable numéro de version en archives estatal. Lecture d'archives " "continuera, mais il peut faillir " #: ../src/backend/state.cpp:437 msgid "Unable to find the \"writer\" node" msgstr "" #: ../src/backend/state.cpp:447 msgid "Unable to find the \"backcolour\" node." msgstr "Impossible de trouver le \"backcolour\" noeud." #: ../src/backend/state.cpp:455 msgid "\"backcolour\" node missing \"r\" value." msgstr "" #: ../src/backend/state.cpp:460 msgid "Unable to interpret \"backColour\" node's \"r\" value." msgstr "Impossible d'interpréter \"backColour\" noeud \"r\" de valeur." #: ../src/backend/state.cpp:468 msgid "\"backcolour\" node missing \"g\" value." msgstr "" #: ../src/backend/state.cpp:474 msgid "Unable to interpret \"backColour\" node's \"g\" value." msgstr "Impossible d'interpréter \"backColour\" noeud \"g\" de valeur." #: ../src/backend/state.cpp:482 msgid "\"backcolour\" node missing \"b\" value." msgstr "" #: ../src/backend/state.cpp:488 msgid "Unable to interpret \"backColour\" node's \"b\" value." msgstr "Impossible d'interpréter \"backColour\" noeud \"b\" de valeur." #: ../src/backend/state.cpp:495 msgid "\"backcolour\"s rgb values must be in range [0,1]" msgstr "" #: ../src/backend/state.cpp:523 msgid "Unable to find or interpret \"showaxis\" node" msgstr "Impossible de trouver ou d'interpréter \"showaxis\" noeud" #: ../src/backend/state.cpp:567 msgid "Unable to locate \"filtertree\" node." msgstr "Incapaç de localitzar. " #: ../src/backend/state.cpp:583 msgid "Cameras section missing \"active\" node." msgstr "Impossible de localiser le \"filtertree\" noeud." #: ../src/backend/state.cpp:591 msgid "Unable to find property \"value\" for \"cameras->active\" node." msgstr "" #: ../src/backend/state.cpp:597 msgid "Unable to interpret property \"value\" for \"cameras->active\" node." msgstr "" "Impossible d'interpréter la propriété \"valeur\" pour \"caméras-> active\" " "noeud." #: ../src/backend/state.cpp:617 msgid "Failed to interpret camera state for camera : " msgstr "" #: ../src/backend/state.cpp:625 msgid "Unable to interpret the camera type for camera : " msgstr "" #: ../src/backend/state.cpp:681 msgid "Unable to locate stash name for stash " msgstr "Incapaç de localitzar stash nom pour stash. " #: ../src/backend/state.cpp:690 msgid "Empty stash name for stash " msgstr "Vide stash nom pour stash. " #: ../src/backend/state.cpp:699 msgid "No filter tree for stash:" msgstr "" #: ../src/backend/state.cpp:705 msgid "For stash " msgstr "Pour stash. " #: ../src/backend/state.cpp:737 msgid "Unrecognised effect :" msgstr "Unrecognised Effet : " #: ../src/backend/state.cpp:747 msgid "Duplicate effect found" msgstr "Effet de doublé a trouvé " #: ../src/backend/state.cpp:747 msgid " cannot use." msgstr " Ne peut pas utiliser." #: ../src/backend/state.cpp:757 msgid "Error reading effect : " msgstr "Effet de lecture de l'erreur :. " #: ../src/backend/state.cpp:977 msgid "-merge" msgstr "-Fusionner " #: ../src/backend/filtertreeAnalyse.cpp:225 msgid "" "Parent filter has no output, but filter requires input -- there is no point " "in placing a child filter here." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:226 msgid "Leaf-only filter with child" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:236 msgid "" "Parent filters' output will be blocked by child, without use. Parent results " "will be dropped." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:237 #: ../src/backend/filtertreeAnalyse.cpp:251 msgid "Bad parent->child pair" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:250 msgid "" "First filter does not output anything useable by child filter. Child filter " "not useful." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:330 msgid "Spatial results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:331 msgid "" "Filters and settings selected that could alter reported results that depend " "upon density. Check to see if spatial sampling may be happening in the " "filter tree - this warning is provisional only." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:399 msgid "Filter needs parent \"" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:400 msgid "" "\" but does not have one. Filter may not function correctly until this " "parent is given." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:401 msgid "Filter missing needed parent" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:432 msgid "Bad range filter settings" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:433 msgid "" "Rangefile set to drop unranged data, however a child filter requires it." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:529 msgid "Filter cannot generate data, but has no input - it is at the tree base." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:530 msgid "Non data-generating filter at root" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:632 msgid "Composition results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:633 msgid "" "Filters and settings selected that could bias reported composition. Check to " "see if species biasing may occcur in the filter tree - this warning is " "provisional only." msgstr "" #: ../src/backend/APT/APTFileIO.cpp:44 ../src/backend/APT/APTFileIO.cpp:79 #: ../src/backend/APT/APTFileIO.cpp:103 ../src/backend/APT/APTFileIO.cpp:123 msgid "Error opening file" msgstr "Erreur lors de l'ouverture du fichier" #: ../src/backend/APT/APTFileIO.cpp:45 msgid "Only found header, no data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:46 msgid "Unable to reopen file after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:47 msgid "Error whilst reading file contents" msgstr "Erreur whilst en lisant contenus d'archives " #: ../src/backend/APT/APTFileIO.cpp:48 ../src/backend/APT/APTFileIO.cpp:49 msgid "Unexpected file format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:50 msgid "Insufficient memory to continue" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:54 msgid "Memory allocation failure on POS load" msgstr "Insuccès d'assignació de la mémoire en POS charge " #: ../src/backend/APT/APTFileIO.cpp:55 msgid "Error opening pos file" msgstr "L'Erreur qu'oeuvre pos archives " #: ../src/backend/APT/APTFileIO.cpp:56 msgid "Pos file empty" msgstr "Pos Archive vide " #: ../src/backend/APT/APTFileIO.cpp:57 msgid "Pos file size appears to have non-integer number of entries" msgstr "Taille du fichier Pos semble avoir non entier nombre d'entrées" #: ../src/backend/APT/APTFileIO.cpp:58 msgid "Error reading from pos file (after open)" msgstr "Erreur de lecture du fichier pos (après ouverture)" #: ../src/backend/APT/APTFileIO.cpp:59 msgid "Error - Found NaN in pos file" msgstr "Erreur - Trouvée NaN en pos archives " #: ../src/backend/APT/APTFileIO.cpp:60 msgid "Error - Found Inf in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:61 msgid "Pos load aborted by interrupt." msgstr "Pos La Charge avortada pour interrompre." #: ../src/backend/APT/APTFileIO.cpp:80 msgid "No numerical data found" msgstr "Ne la donnée numérique a trouvé " #: ../src/backend/APT/APTFileIO.cpp:81 msgid "Error re-opening file, after first scan" msgstr "Erreur re-archives d'ouverture, après que premier scanner " #: ../src/backend/APT/APTFileIO.cpp:82 msgid "Unable to read file contents after open" msgstr "Incapaç de lire contenus d'archives après ouvert " #: ../src/backend/APT/APTFileIO.cpp:83 msgid "Error interpreting field in file" msgstr "L'Erreur qu'interprète champ en archives " #: ../src/backend/APT/APTFileIO.cpp:84 msgid "Incorrect number of fields in file" msgstr "Incorrect Numéro de champs en archives " #: ../src/backend/APT/APTFileIO.cpp:85 ../src/backend/APT/APTFileIO.cpp:107 msgid "Unable to allocate memory to store data" msgstr "Incapaç à allocate mémoire pour stocker donnée " #: ../src/backend/APT/APTFileIO.cpp:104 msgid "File is empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:105 msgid "Filesize does not match expected format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:106 msgid "File version number not <4, as expected" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:108 msgid "Unable to detect endian-ness in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:122 #, fuzzy msgid "Error interpreting file contents" msgstr "Erreur whilst en lisant contenus d'archives " #: ../src/backend/APT/APTFileIO.cpp:124 #, fuzzy msgid "Aborted opening file" msgstr "Erreur lors de l'ouverture du fichier" #: ../src/backend/APT/APTRanges.cpp:48 msgid "Error opening file, check name and permissions." msgstr "Archives d'ouverture de l'erreur, nom de contrôle et permissions." #: ../src/backend/APT/APTRanges.cpp:49 msgid "" "Error interpreting range file header, expecting ion count and range count, " "respectively." msgstr "" "L'Erreur qu'interprète encapçalament d'archives de la gamme, en attendant " "l'ió compte et la gamme compte, respectivement." #: ../src/backend/APT/APTRanges.cpp:50 msgid "" "Range file appears to be empty, check file is a proper range file and is not " "empty." msgstr "" "Archives de gamme apparaît pour être vide, archives de contrôle est un " "archives de gamme approprié et ce ne est pas vide." #: ../src/backend/APT/APTRanges.cpp:51 msgid "Error reading the long name for ion." msgstr "L'Erreur que lit le nom long pour ió." #: ../src/backend/APT/APTRanges.cpp:52 msgid "Error reading the short name for ion." msgstr "L'Erreur que lit le nom court pour ió." #: ../src/backend/APT/APTRanges.cpp:53 msgid "" "Error reading colour data in the file, expecting 3 decimal values, space " "separated." msgstr "" "Donnée de couleur de lecture d'erreur en le archives, en attendant 3 valeurs " "decimals, l'espace a séparé." #: ../src/backend/APT/APTRanges.cpp:54 msgid "" "Tried skipping to table separator line (line with dashes), but did not find " "it." msgstr "" "Essayé skipping à table separator ligne (ligne avec dashes), mais ne l'a " "trouvé." #: ../src/backend/APT/APTRanges.cpp:55 msgid "" "Number of ions in the table header did not match the number specified at the " "start of the file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:56 msgid "" "Unexpected failure whilst trying to skip over range lead-in data (bit before " "range start value)" msgstr "" "Insuccès inattendu whilst en essayant à skip enveloppe avantage de gamme-en " "donnée (bit avant de valeur de début de la gamme) " #: ../src/backend/APT/APTRanges.cpp:57 msgid "" "Range table had an incorrect number of entries, should be 2 or 3 + number of " "ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:58 msgid "Unable to read range start and end values" msgstr "Incapaç de lire début de gamme et valeurs de fin " #: ../src/backend/APT/APTRanges.cpp:59 msgid "Unable to read range table entry" msgstr "Incapaç de lire entrée de table de la gamme " #: ../src/backend/APT/APTRanges.cpp:60 msgid "" "Error reading file, unexpected format, are you sure it is a proper range " "file?" msgstr "" "Archives de lecture de l'erreur, format inattendu, t'est sûr est un archives " "de gamme approprié? " #: ../src/backend/APT/APTRanges.cpp:61 msgid "" "Too many ranges appeared to have range entries with no usable data (eg, all " "blank)" msgstr "" "Trop varie apparus pour avoir des entrées de gamme sans donnée utilisable " "(eg, tout espace) " #: ../src/backend/APT/APTRanges.cpp:62 msgid "" "Range file appears to contain malformed data, check things like start and " "ends of m/c are not equal or flipped." msgstr "" "Archives de gamme apparaît pour contenir malformed donnée, choses de " "contrôle comme début et fins de m/c n'est pas égal ou flipped." #: ../src/backend/APT/APTRanges.cpp:63 msgid "Range file appears to be inconsistent (eg, overlapping ranges)" msgstr "" "Archives de gamme apparaît pour être inconsistent (eg, solapant gammes) " #: ../src/backend/APT/APTRanges.cpp:64 msgid "No ion name mapping found for multiple ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:65 msgid "Polyatomic extension range matches multiple masses in first section" msgstr "" #: ../src/backend/APT/APTRanges.cpp:66 msgid "Range file is exceedingly large. Refusing to open" msgstr "" #: ../src/backend/APT/APTRanges.cpp:68 msgid "Unable to read range table header (aka table separator)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:69 msgid "Unable to read [Ions] contents, should be of form A=B" msgstr "" #: ../src/backend/APT/APTRanges.cpp:70 msgid "Unable to parse number of ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:71 msgid "Number of ions seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:72 msgid "Too many ions in ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:73 msgid "Found ranges block before ion block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:74 msgid "Number of ranges seems to be duplicated" msgstr "" #: ../src/backend/APT/APTRanges.cpp:75 msgid "Unable to read number of ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:76 msgid "Range line was too short, needs 4 entries per line, minimum" msgstr "" #: ../src/backend/APT/APTRanges.cpp:77 msgid "Range line missing required \":\" separator" msgstr "" #: ../src/backend/APT/APTRanges.cpp:79 msgid "Range colour incorrect size, should be 6 bytes" msgstr "" #: ../src/backend/APT/APTRanges.cpp:80 msgid "Range specified as named ion, but ion not found in [Ions] block" msgstr "" #: ../src/backend/APT/APTRanges.cpp:81 msgid "Range had unreadable start value" msgstr "" #: ../src/backend/APT/APTRanges.cpp:82 msgid "Range had unreadable endvalue" msgstr "" #: ../src/backend/APT/APTRanges.cpp:83 msgid "Range name was empty" msgstr "" #: ../src/backend/APT/APTRanges.cpp:84 msgid "Range block had unparsable line, should start with number or range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:85 msgid "Ion block missing" msgstr "" #: ../src/backend/APT/APTRanges.cpp:86 msgid "No ranges found" msgstr "" #: ../src/backend/APT/APTRanges.cpp:87 msgid "Unable to identify the number of basic ions" msgstr "" #: ../src/backend/APT/APTRanges.cpp:88 msgid "" "Number of ranges specfied in range block, did not match number of ranges read" msgstr "" #: ../src/backend/APT/APTRanges.cpp:89 msgid "Range block contained line that did not match A=xxx format" msgstr "" #: ../src/backend/APT/APTRanges.cpp:90 msgid "Range had unreadable ion multiplicity" msgstr "" #: ../src/backend/APT/APTRanges.cpp:91 msgid "Unable to read volume from range" msgstr "" #: ../src/backend/APT/APTRanges.cpp:1459 msgid "" "Range headings do not match order of the ions listed in the name " "specifications. The name specification ordering will be used when reading " "the range table, as the range heading section is declared as a comment in " "the file-format specifications, and is not to be intepreted by this program. " "Check range-species associations actually match what you expect." msgstr "" #: ../src/backend/filter.cpp:54 msgid "2D Plot" msgstr "" #: ../src/backend/filter.cpp:56 msgid "Range" msgstr "Plage" #: ../src/backend/filter.cpp:57 msgid "Voxel" msgstr "Voxel " #: ../src/backend/filters/transform.h:71 msgid "Ion. Transform" msgstr "Ió. Il transforme " #: ../src/backend/filters/ionColour.h:66 msgid "Spectral Colour" msgstr "Spectre" #: ../src/backend/filters/boundingBox.h:76 msgid "Bound box" msgstr "Caisse attachée " #: ../src/backend/filters/ionDownsample.h:84 msgid "Ion Sampler" msgstr "Mostrejador d'ió " #: ../src/backend/filters/profile.h:131 msgid "Comp. Prof." msgstr "Comp. Prof." #: ../src/backend/filters/ionInfo.h:117 msgid "Ion info" msgstr "Ió info " #: ../src/backend/filters/dataLoad.h:148 msgid "Pos Data" msgstr "Pos Donnée " #: ../src/backend/filters/externalProgram.h:69 msgid "Ext. Program" msgstr "Ext. Programme " #: ../data/startup-tips.txt:5 msgid "" "You can reset the main view by tapping the space bar. Hold down modifier " "keys like shift,ctrl to change the axis. Double tap to switch which axis to " "look the other way (+ve or -ve direction)" msgstr "" #: ../data/startup-tips.txt:6 msgid "" "You can delete filters from the tree by selecting them, then tapping delete?" msgstr "" #: ../data/startup-tips.txt:7 msgid "" "Multiple languages are supported? You can translate the program into your " "own language at https://www.transifex.com/projects/p/3depict/" msgstr "" #: ../data/startup-tips.txt:8 msgid "" "Package files can be easily shared to allow others to view your analysis, " "using the File->Export->Package menu item. This will automatically import " "all referenced files (eg pos/rng files) into a single shareable folder" msgstr "" #: ../data/startup-tips.txt:9 msgid "" "You can export plots to SVG \"Vector\" format, for easier editing - edit " "your plots in inkscape!" msgstr "" #: ../data/startup-tips.txt:10 msgid "You can access the manual from the Help menu" msgstr "" #: ../data/startup-tips.txt:11 msgid "You can change filter defaults using the Edit->Preferences menu item" msgstr "" #: ../data/startup-tips.txt:12 msgid "" "You can overlay multiple plots at once, by selecting more than on plot at a " "time (e.g. using Ctrl)" msgstr "" #: ../data/startup-tips.txt:13 msgid "" "Calculations are much faster (more than linear speedup) when working with " "smaller datasets - try sampling, or clipping out a small region to work " "faster, then remove the sampling when you are ready" msgstr "" #: ../data/startup-tips.txt:14 msgid "" "You can abort most calculations either by pressing Escape (OSX/Linux), or by " "using the Abort button (Windows)" msgstr "" #: ../data/startup-tips.txt:15 msgid "" "That anyone can contribute to improving this program, even without knowing " "about computer programming? Reporting bugs helps us to prioritise our work, " "and directs us to fix real problems for all users" msgstr "" #: ../data/startup-tips.txt:16 msgid "" "You can load more than one file at a time, then either operate on them " "separately, or together" msgstr "" #: ../data/startup-tips.txt:17 msgid "" "You can have more than one range file for different parts of your dataset" msgstr "" #: ../data/startup-tips.txt:18 msgid "" "Cameras can be saved and retrieved whenever you like, using the camera tab" msgstr "" #: ../data/startup-tips.txt:19 msgid "" "Subsections of the filter tree can be saved to the \"Stashed filters\" drop-" "down" msgstr "" #: ../data/startup-tips.txt:20 msgid "" "The console tab along the bottom often shows useful messages from filters. " "When new messages appear, a small symbol is shown on the tab" msgstr "" #: ../data/startup-tips.txt:21 msgid "" "The raw data used for any plot can be accessed from the \"Raw\" tab on the " "bottom panel" msgstr "" #: ../data/startup-tips.txt:22 msgid "" "You can ask questions about the program, or using it on your data via our " "forums (https://sourceforge.net/p/threedepict/discussion/general/)" msgstr "" #: ../data/startup-tips.txt:23 msgid "" "By creating a camera, you can switch between orthographic (parallel) and " "perspective views" msgstr "" #: ../data/startup-tips.txt:24 msgid "" "You can open multiple files at once, and get a side-by-side view by " "translating (shifting) one of the datasets to one side" msgstr "" #: ../data/startup-tips.txt:25 msgid "" "From version 0.0.20, vector values in filter properties (e.g. \"(1,0,0)\") " "can be specified using ISO 31-11 spherical coordinates using the following " "notation , with angles in degrees" msgstr "" #: ../data/startup-tips.txt:26 msgid "" "You can change the behavior of filter dragging by holding Ctrl (mac: cmd) or " "Shift whilst dragging? This switches between move, copy and \"splice" msgstr "" #: ../data/startup-tips.txt:27 msgid "" "We like to know where we are being helpful? Please consider writing the " "program and version number in any work you might publish - whether in print " "or online. Alternatively, link to our website, or write to us to let us know " "we helped!" msgstr "" #: ../data/startup-tips.txt:28 msgid "" "You can merge files by placing two \"Pos Data\" filters in series, then " "saving the result?" msgstr "" #: ../data/startup-tips.txt:29 msgid "" "When using the camera 3D cropping tool, you can hold Shift to only move the " "centre node in one axis (up/down or left/right).)" msgstr "" #~ msgid "Save...\tCtrl+S" #~ msgstr "&Sauve\tCtrl+S" 3Depict-0.0.22/translations/checkTranslationDupes.py0000755000175000017500000000121613414412173022045 0ustar pcuserpcuser#!/usr/bin/python import sys import re def main(): if(len(sys.argv) != 2): print("not enough arguments") return filename=sys.argv[1] f = open(filename) if not f: sys.exit("Unable to open file" +str(sys.argv[1]) +". Exiting") curLine=0 THRESHOLD=6 while True: curLine=curLine+1; s=f.readline(); if(not s) : break; if re.match("msgid.*",s): msgid=s[6:]; elif re.match("msgstr.*",s): msgstr=s[7:]; if(len(msgstr) < THRESHOLD): continue if(msgid == msgstr and re.match(".*[A-z].*",msgid)): print "Duplicate id at " + str(curLine) + " value is :" + msgstr if __name__ == "__main__" : main() 3Depict-0.0.22/translations/3Depict_de_DE.mo0000644000175000017500000012036513451742525020062 0ustar pcuserpcuserA$,$00F10x0f0`1e1 1 111111m1$R2$w2$2/222 33)3 F3R3f3l3t3z33333333 44 +4 84E4Z4 b4o4 x4 4444G4 4455&555D5S5 f5r5 555 5 5 5 5 5 555 6<6 R6`6 p6}6 66 6&66 6 6 6677*7<7N7S7X7 l7 v7 7 77 77 7 7 77u7_8e8i8 p8 |888&888 9 9-969G9Y9^9f9m9 u9 9V99 99: #:$0:$U:6z::: :: ::; ;%; 7; C;Q;W;^;|;;;; ;; ;; ;; ;; ; <<,<2<N<g<#w<H<<= >0>>? ??#?A? T? u?X??@4@L@/_@@@'@S@:ANRA(A$A%A0B"FB iBvB}BBBBB BB BCC &C 3CACICdC~CCCCC CFC-DQ@QZQaQiQ{QQ QQQQ Q QQ QQR&R5R ;RERWR^RgRoRuR R RR R R RRS S#S 3S@S PS ]S kS ySSSS@S T T-T MTXTaT pT~T%T!T T:T*U HUVUhUU U U UUUUUU U U UV VV !V,V7kIk [kEfk k kkk kk l1 l>l Dl Ol\lqllllllll l l m m m%m5mFm Vm `m lmxxmmnn nn.n@n$_nnnnn nnno ooo #o /oH;oo oo oo)o)oB%php}pppp&pppp q qq%q,q LqXq_qhqnq+uq q q qqqq qq r$r,rHrer(|rcr ss%uA;u }uuuuuu3u#vL;vvvCvwD$w!iw"w>wkwYxjlx2x- y-8yify#yy zz'zGzbzyzzzzz z z z {!{4{%O{u{{{({{M{|"|;|&O|v| ~| | ||&|| | |} }}&} @}J}[} a}o}t}qz}}2} 0~Q~a~e~ j~u~ ~~~ ~ ~~~~~ ~~~~d $=HL Ӂ ?7F JV_t0΂ ҂ނ-,Z#r1 ȃB,0COtWĄ# 5CUf o z ÅJׅ"7K'a ˆ*Ԇ  B+mn ܇    ' 0$; `k r|M&݈   +-<,j,2ĉ , 7)Cm~ Ċ ъ`܊B=Njˋ ۋ !;Mk ̌ Ռ ߌ")4^oȍ܍2IYk$~]**2 ] jw %'͏;-Bp  ̐ ֐   &3F MX `kDɑБב  + GSk^i ȓ4֓< Ha'~Hٔ")F `n  uɕ?3\6)ǖ@$2Ww7767nH2 "C$\,0.ߙ$3ZLA2dM̛՛ݛ "/\G {=3q?RTpVǞɞݞ/CWlş՟E R ^lhՠ٠ݠ%%c5#%8MxA@}  $b -!6R+D0&(' qpGPd=2[:^*:7m$$ 4*N,4y A8?r8|/YA+yEiw!z Z}gWef ?VHLmE1:=B)+<aU\\9r_>&6MuC] {TB0*ok/> bZFO32"kC#cS@25;@v([t(_I?o;Y'|D9 Q U-v )I<=>VgOL 1&3`a lnh~sRqJh;pFTX/tuWX,"`fGK.736jPdj<1i {7J4"0SNz^ne,sx. 95]H'Q#l ).!~K-w --------------------------- Parameter selection notice ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this. In theory it is possible to "join" the clusters, but this has not been implemented for speed reasons. RDF as it was not recognised cannot use. clusters does not exist does not exist. Skipping found online. is up-to-date. of points were unable to find neighbour points that exceeded the search radius, and thus terminated prematurely"backcolour" node missing "b" value."backcolour" node missing "g" value."backcolour" node missing "r" value."backcolour"s rgb values must be in range [0,1]% Done% Done (Esc aborts)&About...&Axis Ctrl+Shift+I&Background Colour... Ctrl+B&Contact...&Control Pane Alt+C&Edit&Export&File&Fullscreen mode Ctrl+Shift+F&Fullscreen mode F11&Help&Help... Ctrl+H&Image... Ctrl+I&Legend Ctrl+L&Merge... Ctrl+Shift+O&Open... Ctrl+O&Plot List Alt+P&Plot... Ctrl+P&Preferences&Quit Ctrl+Q&Raw Data Pane Alt+R&Recent&Redo Ctrl+Y&Refresh&Save Ctrl+S&Undo Ctrl+Z&View(fast)(slow)---------------------------------------------------------------------- --Counts--10 minutes ago10 seconds ago15 minutes ago20 minutes ago30 minutes ago30 seconds ago3D Post-processing3D lighting45 minutes ago5 minutes agoAbortedAborted opening fileAborting...Across dirActive Ion Active Rng AlgorithmAligned boxAll IonsAll Ions (conc)All RangesAn auto-save state was found, would you like to restore it?.Anaglyph ModeAnalysisPackageAnd so on...AngleAngle (Deg)Animation progressAnnotationAre you sure you wish to exit 3Depict?ArrowArrow+TextAuto Min/MaxAuto RefreshAutosaveAutosave complete.Available DataAvailable FiltersAvailable stashesAxisBarsBaseline SeparationBin WidthBin Width, XBin Width, YBin Width, ZBlueBound boxBoundbox CentreBounding BoxBox ColourBulk RangesBy CountBy Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*.svg|PNG File (*.png)|*.png|All Files (*)|*CacheCamCameraCamera NameCamera SpeedCamera data informationCamera zooming rate.Cameras section missing "active" node.Change background colourChemistry DistributionChoose resolutionCleanup inputClippingCluster AnalysisClustering ParamsColdCollateColourColour Colour MapColour ModeColour based 3D effect enable/disable - requires appropriate colour filter 3D glasses.CommandComp. Prof.Compiled with wx Version: Compos. ProfilesCompositionsCompositions (fractional, core only)Compositions (fractional, core+bulk)Config file present, but is not valid (root node test)Confirmation requestCons.Control PaneConvex Volume (len^3): Convex hullCopy raw data to clipboardCopyingCoreCore Link + ErodeCore RangesCorner offsetCountCountsCreated new filter tree stashCropCyclicCylinderDataDenominatorDetailed view of selected rangeDigit FormatDist MaxDist. MaxDistanceDownsamplingDrawDraw SizeDrop unrangedDuplicate effect foundE&xitEmpty stash name for stash Enable Anaglyphic StereoEnable CroppingEnable cropping post-process effectEnable/Disable automatic updates of data when filter change takes effectEnable/Disable lighting calculations in rendering, for objects that request this. Lighting provides important depth cues for objects comprised of 3D surfaces. Disabling may allow faster rendering in complex scenesEnable/Disable weak randomisation (Galois linear feedback shift register). Strong randomisation uses a much slower random selection method, but provides better protection against inadvertent correlations, and is recommended for final analysesEnable/disable all ions for bulkEnable/disable visual effects on final 3D outputEnabledEndEnd rng Err. EstimatorError - Found NaN in pos fileError copying fileError interpreting field in fileError interpreting file contentsError interpreting range file header, expecting ion count and range count, respectively.Error loading fileError loading file: Error loading state file. See console for more info.Error opening fileError opening file, check name and permissions.Error opening pos fileError processing node: Error re-opening file, after first scanError reading colour data in the file, expecting 3 decimal values, space separated.Error reading effect : Error reading file, unexpected format, are you sure it is a proper range file?Error reading from pos file (after open)Error reading the long name for ion.Error reading the short name for ion.Error saving file. Check output dir is writable.Error whilst reading file contentsExit ProgramExportExport AnimationExport Current 3D ViewExport Current PlotExport Ion DataExport Pos DataExport RangeExport Range DataExport RangesExport analysis packageExport:Ext. ProgramExtern. Prog.ExtremaFailed reading range file.Failed to allocate parserFast and weak randomisation.Field of View (deg)FileFile : File already exists, overwrite?File typeFiles have been referred to using relative paths. Keep relative paths?Filter StashesFilter cachingFilter settingsFilter view for current stashFilteringFixed Bin NumFixed TicksFixed WidthFlip ChannelsFolder creation failedFont SizeFor stash Found :FractionFrame countFreq. ProfileFrequencies (core+bulk)GeneralGlasses colour modeGreenGreen-MagentaGreyHotIf you want this, please contact the author, or just use the source to add this in yourself.Image progressIncorrect number of fields in fileInformation about this programInvert ClipIonIon Ion ColourIon InfoIon NameIon TransformIon VolumeIon infoIon&s... Ctrl+NIon. TransformIonID IonsIsosurfaceIsovalueJetLets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffLimitation on the screenshot dimension; please ensure that both width and height exceed the initial values, or that they are smaller than the initial values. If this bothers, please submit a bug.Line thicknessLinesList of available filtersList of rangefiles in filter treeLoad Limit (MB)Load data source (file->open) before choosing a new filterLoad errorLocal DensityLockLock Axis MagLock Axis Mag.LogarithmicManual not found locally. Launching web browserMass CentreMaxMax SizeMax ValueMax. Ram usage (%)Max. Sep + ErodeMemory allocation failure on POS loadMerged file.MinMin SizeMin ValueMove RateMoving avg.NN MaxNew camera name...Next fullscreen mode: with toolbarsNo data to saveNo filter stashes to edit.No filters means no data to exportNo numerical data foundNo plot available. Please create a plot before exporting.No plots selected.No range data. Can't cluster.No ranges selected for cluster "bulk". Cannot continue with clustering.No ranges selected for cluster "core". Cannot continue with clustering.NoneNone (Raw count)NormaliseNormalise byNot availableNum BinsNum RangesNum TicksNum XNum YNum ZNumber of framesNumber of points : NumeratorOnline Check: Online access for non win32/apple platforms is intentionally disabled, Open contact pageOpen state fileOpenGL FailedOpening contact page in external web browserOriginOrthogonalOut FractionOutput CountOverwrite?P&lot...PNG File (*.png)|*.png|All Files (*)|*POS DataPac&kage... Ctrl+KPackage directory namePackage folder already exists, won't overwrite.Package folder creation failed check writing to this location is possible.Package nameParamPer SpeciesPlanePlane NormalPlotPlot ColourPlot ListPlot TypePlot colourPlotting functions returned an error: Point CloudPointsPos DataPos file emptyPos file size appears to have non-integer number of entriesPos load aborted by interrupt.Position APosition BPostPostprocessPreferencesPress enter to restore cameraPress enter to restore stashPress enter to store new cameraPress enter to store new stashPrimitiveProgram limitationProgram text outputProjectionPropertyQuick and dirty analysis for point data.Radial DistanceRadial DistributionRadiusRadius.Ran&ges... Ctrl+GRangeRange FileRange StartRange endRange file appears to be empty, check file is a proper range file and is not empty.Range file appears to be inconsistent (eg, overlapping ranges)Ranged Density (pts/vol):RangesRangingRatio (Num/Denom)RawRaw Data PanelRectilinearRectilinear Bounds : Red-BlueRed-CyanRed-GreenReflexiveRefresh Aborted.Remember lastRemove the selected cameraRendering sequence...RepresentationResetReset AllRestored camera: RotateRotate +Rotate-RulerSave &As... Ctrl+Shift+SSave Data...Save Image...Save current state to new fileSave errorSave plot...Save pos...Save raw data to fileSave state to fileSave state...Saved 3D View :Saved ions: Saved package: Saved plot: Saved state: Saving Image Scale Fact.Security warningSelect Data or State File...Select RNG File...Select an item from the filter tree before choosing a new filterSelected DataSelectionSettings for selected filter in current stashShow AngleShow BarShow PrimitiveShow SelectedShow all panelsShow all panels when starting programShow help files and documentationShow markerShow panels visible at last shutdown when starting programShow selected panels when starting programSize CroppingSize DistributionSmooth && translucent objectsSourceSpacing XSpacing YSpacing ZSpat. AnalysisSpecifySpectral ColourSpectrumSphereSphere SizeSphere sizeStandard dev.StartStart rng StartupStash NameStashed FiltersState was created by a newer version of this program.. StepsStereoStored camera: SurfaceTapsim DataTargetTextText DataText File (*.txt)|*.txt|All Files (*)|*Text sizeThis file is a "state" file for the 3Depict program, and stores information about a particular analysis session. This file should be a valid "XML" fileThis state file contains filters that can be unsafe to run Do you wish to remove these before continuing?.This will be a problem in the case where two or more clusters can equally lay claim to a "bulk" ion. Tick SpacingTip: You can use ctrl to mergeTip: You can use ⌘ (command) to mergeToggle Legend displayToggle World Axis displayToggle left control paneToggle plot listToggle raw data pane (bottom)Too many ranges appeared to have range entries with no usable data (eg, all blank)ToolsTotal (incl. unranged) Total Density (pts/vol):Total Ranged Transform ParamsTranslateTranslate ValueTransparencyUnable to allocate memory to store dataUnable to allocate requested memory. Try a lower resolution, or save as vector (SVG).Unable to compute volumeUnable to create stash, selection invalidUnable to determine filter type in defaults listing.Unable to find or interpret "showaxis" nodeUnable to find property "value" for "cameras->active" node.Unable to find the "backcolour" node.Unable to find the "writer" nodeUnable to initialise the openGL (3D) panel. Program cannot start. Please check your video drivers.Unable to interpret "backColour" node's "b" value.Unable to interpret "backColour" node's "g" value.Unable to interpret "backColour" node's "r" value.Unable to interpret property "value" for "cameras->active" node.Unable to interpret recent file entryUnable to load autosave file..Unable to load fileUnable to locate "filtertree" node.Unable to locate stash name for stash Unable to read file contents after openUnable to read range start and end valuesUnable to read range table entryUnable to saveUnable to save. Check output destination can be written to.Unknown file extension. Please use "svg" or "png"UnrangedUnrecognised effect :Up dirUpdate Notice: New version Use camera coordinatesUse shift/ctrl-space or double tap to alter reset axisValueValue2View sizeVisibleVolumeVolume (Density)Volume (len^3): VoxelVoxel Limits (min,max): (VoxelisationWARNING: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warning,Warning, Warning, unparseable version number in state file. File reading will continue, but may failWarning: Your configuration file appears to be invalid: Warning:One or more bounds of the loaded data approaches the limits of numerical stability for the internal data type(magnitude too large). Consider rescaling data before loadingWork DirXYYou can do this; thats OK, but the output is no longer independent of the computational process;ZZoom Ratea day agoa decade agoa few days agoa few decades agoa few hours agoa few minutes agoa few months agoa few seconds agoa few weeks agoa few years agoa minute agoa month agoa second agoa week agoa year agoan hour agocountdXdYdZerrorfile reading will continue, but may fail.in the future?moments agoregardless of the settings you use here. Use your package manager to keep up-to-datex-yx-zy-xy-zz-xz-y§Cons.Project-Id-Version: 3Depict Report-Msgid-Bugs-To: POT-Creation-Date: 2019-01-06 14:48+0000 PO-Revision-Date: 2017-09-19 10:23+0000 Last-Translator: mycae Language-Team: German (Germany) (http://www.transifex.com/mycae/3depict/language/de_DE/) Language: de_DE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); --------------------------- Parameterauswahl Notiz ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this.Theoretisch ist es möglich die Cluster zu 'verbinden', dies wurde jedoch aus Gescheindigkeitsgründen nicht implementiert. RDF wurde nicht erkannt.kann nicht verwenden. Cluster existiert nicht existiert nicht. Überspringe online gefunden.ist up-to-date. von Punkte konnten keine Nachbapunkte die den Suchradius überschritten finden und beendeten vorzeitig."backcolour" node fehlt "b" Wert."backcolour" node fehlt "g" Wert."backcolour" node fehlt "r" Wert."backcolour"s rgb Wert muss im Bereich [0,1] liegen\% fertig\% fertig (Esc abbrechen)Über 3Depict...&Achsen Ctrl+Shift+I&Hintergrundfarbe... Ctrl+B&Kontakt...&Kontrollfenster Alt+C&Bearbeiten&Exportieren&Datei&Vollbildmodus Ctrl+Shift+F&Vollbildmodus F11&Hilfe&Hilfe... Ctrl+H&Bild... Ctrl+I&Legende Ctrl+L&Zusammenführen... Ctrl+Shift+O&Öffnen... Ctrl+O&Plot Liste Alt+P&Plot... Ctrl+P&Voreinstellungen&Beenden Ctrl+Q&Rohdatenfenster Alt+R&Letzte&Wiederholen Ctrl+YAktualisie&ren&Speichern Ctrl+S&Zurück Ctrl+Z&Ansicht(schnell)(langsam)---------------------------------------------------------------------- - Anzahl -vor 10 Minutenvor 10 Sekundenvor 15 Minutenvor 20 Minutenvor 30 Minutenvor 30 Sekunden3D Nachbearbeitung3D Beleuchtungvor 45 Minutenvor 5 MinutenAbgebrochenFehler beim Öffnen der DateiAbbrechen...Across dirActives Ion Activer Rng AlgorithmusAusgerichtete BoxAlle IonenAlle Ionen (Konz)Alle RangeEin auto-save Status wurde gefunden. Wollen Sie ihn wiederherstellen?AnaglyphmodusAnalysepaketUnd so weiter...WinkelWinkel (deg)Animation-FortschrittKommentarSind Sie sicher, dass Sie 3Depict beenden wollen?PfeilPfeil+TextAuto Min/maxAutom. aktualisierenAutomatisch speichernAutosave beendetVerfügbare DatenVerfügbare FilterVerfügbare StashAchseBlockBasislinienabstandBin-BreiteBin-Breite xBin-Breite xBin-Breite xBlauBegrenzungs-BoxBoundbox ZentrumBegrenzungs-BoxBox FarbeBulk RangesNach AnzahlDateierweiterung (svg,png)|*.svg;*.png|Skalierbare Vektorgrafik (*.svg)|*.svg|PNG Datei (*.png)|*.png|Alle Dateien (*)|*ZwischenspeicherCamKameraKameranameKamerageschwindigkeitKamerainformationZoomgeschwindigkeit der KameraCameras section fehlt "active" node.Hintergrundfarbe ändernChemische VerteilungAuflösung auswählenBereinige EingabeZuschneidenClusteranalyseCluster ParameterKaltAbgleichenFarbeFarbeFarbtabelleFarbe ModusFarbbasierte 3D-Effekte ein/ausschalten - erfordert geeignete 3D-BrillenBefehlKonz. Prof.Kompiliert mit wx Version: Konz.ProfilZusammensetzungenZusammensetzungen (fractional, core only)Zusammensetzungen (fractional, core+bulk)Konfigurationsdatei vorhanden, aber nicht gültig (root node test)BestätigungsabfrageKons.KontrollfensterKonvexes Volumen (Läng.^3)Konvexe HülleKopiere Rohdaten in die ZwischenablagekopiereKernCore Link + ErodeCore RangesCorner offsetAnzahlAnzahlNeuer Filterstash wurde erzeugtZuschneidenCyclicZylinderDatenNennerDetailierte Ansicht des ausgewählten RangeZahlenformatAbst. Max.Abst. Max.AbstandDatenreduktionZeichnenDraw SizeNicht gerangete ausschaltenDoppelter Effekt gefundenBeendenLeerer Stashname für StashAnaglyphic Stereo aktivierenZuschneiden aktivierenCropping post-Prozess Effect einschaltenEin/Ausschalten vom automatischen Aktualisieren der Daten wenn Änderungen am Filter wirksam werdenEin/Ausschalten der Beleuchtungseffekte beim Rendern von Objekten die dies anfordern. Beleuchtung bietet wichtige 'depth cues' für mit 3D Oberflächen umrandete Objekte. Deaktivieren erlaubt u.U. schnelleres Rendern bei komplizierten Szenen.Ein/Ausschalten der schwachen Randomisierung (Galois linear feedback shift register). Starke Randomisierung verwendet einen viel langsamere Auswahlmethode bietet dafür aber einen besseren Schutz gegen unbeabsichtigte Korrelationen und wird für die endgültige Analyse empfohlen.Ein/Ausschalten alle Ionen für bulk.Ein/Ausschalten von visuellen Effekten in der finalen 3D Ausgabe.AktiviertEndeEnd rng FehlerschätzerFehler - Fand NaN in pos-DateiFehler beim Kopieren der DateiFehler beim Interpretieren eine Feldes in der DateiFehler beim Lesen des DateiinhaltesFehler beim Rangedatei interpretieren, erwarte Ionenanzahl bzw. Rangeanzahl.Fehler beim Laden der DateiFehler beim Laden der Datei: Fehler beim Laden der Statusdatei. Konsole für mehr Informationen.Fehler beim Öffnen der DateiFehler beim Öffnen der Datei, überprüfe Namen und Berechtigungen.Fehler beim Öffnen der pos-DateiFehler beim Verarbeiten von Node: Fehler beim nochmaligen Öffnen der Datei nach dem ersten ScanFehler beim Lesen der Farbinformationen in der Datei. Erwarte 3, durch Leerzeichen getrennte, Dezimalwerte.Fehler beim Lesen:Fehler beim Lesen der Datei: Unerwartetes Format, sind Sie sicher, dass dies eine korrekte Rangedatei ist?Fehler beim Lesen aus pos-Datei (nach dem öffnen)Fehler beim Lesen des langen Namens für Ion.Fehler beim Lesen des kurzen Namens für Ion.Fehler beim Schreiben der Datei. Stellen Sie sicher, dass das Zielverzeichnis nicht schreibgeschüzt ist.Fehler beim Lesen des DateiinhaltesProgramm beendenExportierenAnimation exportierenAktuelle 3D Ansicht exportierenAktuellen Plot exportierenIonendaten exportierenPOS Daten exportierenRange exportierenRangedaten exportierenRange exportierenAnalysepaket exportierenExportieren:Ext. ProgrammExt. Progr.ExtremaFehler beim Lesen der Rangedatei.Kann Parser nicht zuordnenSchnelle aber schwache RandomisierungBildausschnittDateiDatei : Datei existiert bereits. Überschreiben?DateitypAuf Dateien wurde mit relativen Pfaden verwiesen. Relative Pfade beibehalten?Filter StashesFilter zwischenspeichernFiltereinstellungenFilteransicht für den aktuellen StashFilternFix. Bin-Anz.Fixe MarkerFixe BreiteKanäle tauschenAnlegen des Ordners ist fehlgeschlagenSchriftgrößeFür Stash Gefunden:AnteilBildanzahlHäufigkeitsprofilHäufigkeiten (core+bulk)AllgemeinBrillenfarbmodusGrünGrün-MagentaGrauHeissSollten Sie dies wollen, kontaktieren Sie den Autor oder verwenden Sie den Sourcecode um es selbst hinzuzufügen.Bild FortschrittDie Datei enthält eine falsche Anzahl von FeldernInformationen zu diesem ProgrammInvertiere ClipIonIon IonenfarbeIon InfoIonennameIonentransformIonen VolumenIoneninfoIon&en... Ctrl+NIon. TransformierenIonID IonenIsosurfaceIsovalueJetLässt das Programm via Internet überprüfen ob Updates für diese Programmversion verfügbar sind. Danach informiert es über die neuen Updates.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffBeschränkung der Screenshot Dimensionen; stellen Sie bitte sicher, dass Breite und Höhe die ursprünglichen Werte überschreiten, oder dass diese kleiner als die ursprünglichen Werte sind. Sollte Sie dies stören, melden Sie bitte einen Bug.LinienbreiteLinienListe der verfügbaren FilterListe der Rangedateien im FilterbaumLadelimit (MB)Lade Datenquelle (Datei->öffnen) vor dem Auswählen eines neuen FiltersFehler beim LadenLokale DichteSperrenAchsen Vergr. sperrenAchsen Vergr. sperrenLogarithmischAnleitung konnte lokal nicht gefunden werden. Starte WebbrowserMassen-ZentrumMaxMax GrößeMax WertMax. RAM-Nutzung (%)Max. Sep + ErodeSpeicherzuweisungsfeher beim Laden der pos-DateiDatei zusammengeführt.MinMin GrößeMin WertBewegungsgeschwindigkeitGleit.Durchschn.NN MaxNeuer Kameraname...Nächster Vollbildmodus: ohne WerkzeugleistenKeine Daten zum SichernKeine Filterstashes zum Bearbeiten.Keine Filter bedeutet keine Daten zum ExportierenKeine numerischen Daten gefundenKein Plot vefügbar. Plot muss vor dem Exportieren erzeugt werden.Kein Plot ausgewählt.Keine Rangedaten. Clusteranalyse nicht möglich.Kein Range für "bulk" ausgewählt. Kann mit Clusteranalyse nicht weitermachen.Kein Range für cluster "core" ausgewählt. Kann mit Clusteranalyse nicht weitermachen.KeinerKeine (Roh count)NormalisierenNormalisieren mitNicht verfügbarBin-Anz.Num RangesAnzahl MarkerNum XNum YNum ZBilderanzahlAnzahl der Punkte: ZählerÜberprüfe online:Onlinezugang für nicht Win32/apple systeme wurde absichtlich deaktiviert.Kontaktseite öffnenStatusdatei öffnenOpenGL fehlgeschlagenÖffne Kontaktseite in externem BrowserUrsprungOrthogonalAusgabe AnteilAusgabe AnzahlÜberschreiben?P&lot...PNG Datei (*.png)|*.png|Alle Dateien (*)|*Pos-DatenPa&ket... Ctrl+KPaketverzeichnisPaketverzeichnis existiert bereits. Werde es nicht überschreiben.Anlegen des Paketverzeichnisses fehlgeschlagen Überprüfen Sie ob der angegenbene Ort schreibgeschützt ist.PaketnameParam.Nach SpeziesEbenePlane NormalPlotPlotfarbe PlotlistePlot TypPlotfarbe Plot-Funktion meldete einen Fehler: PunktwolkePunktePOS-DatenPos-Datei ist leerPos-Dateigröße scheint eine nicht ganzzahlige Anzahl an Einträgen zu habenPos laden durch Interrupt abgebrochen.Position APosition BPostPostprozessVoreinstellungenEingabe drücken um Kamera wiederherzustellenEingabe drücken um Stash wiederherzustellenEingabe drücken um neue Kamera zu speichernEingabe drücken um neuen Filterstash zu speichernPrimitivProgrammeinschränkungProgramm TextausgabeProjektionEigenschaft"Quick and dirty" Analyse von Punktdaten.Radialer AbstandRadial DistributionRadiusRadius.Ran&ges... Ctrl+GRangeRangedateiRange AnfangRange EndeRangedatei scheint leer zu sein. Prüfe ob die Datei wirklich ein Rangedatei und nicht leer ist.Rangedatei schein inkonsistent zu sein (z.B. überlappende Ranges)Ranged Dichte (pts / vol):RangesRangingVerhältnis (Zähler/Nenner)RohRohdatenfensterGeradlinigGeradlinige Grenzen:Rot-BlauRot-ZyanRot-GrünReflexiveAktualisieren abgebrochenZuletzt verwendetAusgewählte Kamera entfernenRenderreihenfolge...RepresentationZurücksetzenAlle zurücksetzenWiederhergestellte Kamera: RotierenRotieren+Rotieren-LinealSpeichern &als... Ctrl+Shift+SDatei speichern...Speichere Bild...Aktuellen Status als neue Datei speichernFehler speichernPlot speichern...pos speichern...Speichere Rohdaten in DateiStatus in Datei speichernSpeichere Status...Gespeicherte 3D AnsichtGespeicherte Ionen:Gespeicherte Pakete: Gespeicherter Plot:Gespeicherter Status: Speichere Bild SkalierungsfaktorSicherheitswarnungDaten oder Statusdatei auswählen...RNG Datei auswählen...Aktivieren Sie zuerst ein Punkt aus dem Filterverlauf bevor Sie einen neuen Filter auswählenDaten auswählenAuswahlEinstellungen für den ausgewählten StashZeige WinkelZeige BalkenZeige PrimitivZeige AuswahlZeige alle FensterZeige alle Fenster beim ProgrammstartHilfedateien und Dokumentation anzeigenZeige MarkierungBeim Programmstart zuletzt eingeschaltete Fenster anzeigen.Zeige ausgewählte Fenster beim ProgrammstartGrößeneinschrankungenGrößenverteilungGlatte && durchsichtige ObjekteQuelleX-AbstandY-AbstandZ-AbstandRäumliche AnalyseAngebenSpectral FarbeSpektrumKugelKugelgrößeKugelgrößeStandardabweichungAnfangStart rng StartupStash NameZwischengelagerte FilterStatus wurde von einer neueren Version dieses Programmes erstellt.. StufenStereoGespeicherte Kamera: OberflächeTapsim-DatenZielTextText-DatenText Datei (*.txt)|*.txt|Alle Dateien (*)|*TextgrößeDiese Datei ist ein "Status" Datei für das Programm 3Depict. Sie speichert Informationen über die jeweiligen Analysesitzung. Dies sollte ein gültige "XML" Datei sein.Diese Statusdatei enthält Filter deren Anwendung möglicherweise unsicher ist. Wollen Sie diese entfernen.Dies ist ein Problem wenn zwei oder mehrere Cluster auf dasselbe "bulk" Ion Anspruch erheben. MarkerabstandTip: Sie können strg zum Zusammen führen verwendenTip: Sie können ⌘ (command) zum Zusammenführen verwendenLegende anzeigen ein/ausHauptachsen ein/aus schaltenLinkes Kontrollfenster ein/aus schaltenPlotliste ein/aus schaltenRohdatenfenster (unten)Zu viele Ranges scheinen ungültige Einträge zu haben (z.B. alle leer)Werkz.Total (inkl. nicht geranged)Gesamtdichte (pts / vol):Gesamt rangedTransformationsparameterTranslateTranslate WertTransparenzKann Speicher nicht zuordnenKann den notwendigen Speicher nicht zuordnen. Versuche eine geringer Auflösung oder speichere als Vektografik (svg).Kann Volumen nicht berechnenStash kann nicht erstellt werden, Auswahl ungültigKann den Filtertyp im Defaultslisting nicht bestimmen.Kann "showaxis" node nicht interpretierenKann "Eigenschaftswert" für "Kamera->aktiv" Node nicht finden.Kann "backcolour" node nicht finden.Kann "writer" node nicht findenKann das OpenGL (3D)-Panel nicht initialisieren. Das Programm kann nicht gestartet werden. Bitte überprüfen Sie Ihren Video-Treiber.Kann "backColour" node's "b" Wert nicht interpretieren.Kann "backColour" node's "g" Wert nicht interpretieren.Kann "backColour" node's "r" Wert nicht interpretieren.Kann "Eigenschaftswert" für "Kamera->aktiv" Node nicht interpretieren.Kann den letzten Dateieintrag nicht interpretierenKann Autosavedatei nicht laden..Kann Datei nicht laden..Kann "filtertree" node nicht finden.Kann den Stashnamen für Stash nicht findenKann den Dateiinhalt nach dem Öffnen nich lesenKann Anfangs und Endwert des Range nicht lesenKann Rangetabelleneintrag nich lesenSpeichern nicht möglichSpeichern nicht möglich. Bitte überprüfen Sie ob der Ausgabepfad schreibgeschützt ist.Unbekannte Dateierweiterung. Bitte verwenden Sie "svg" oder "png"Nicht GerangedNichterkannter Effekt :Up dirUpdatenotiz: Neue Version Verwende KamerakoordinatenVerwenden Sie Shift / Strg-Leertaste oder doppeltippen, um Achsen zurückzusetzen oder zu verändernWertWert2AnzeigegrößeSichtbarVolumenVolumen (Dichte)Volumen (Läng.^3)VoxelVoxel Grenzen (min,max): (VoxelisationWARNUNG: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warnung,Warnung, Warnung: Nicht lesbare Versionsnummer in Statusdatei. Datei wird weiter eingelesen kann aber unter Umständen fehlschlagen.Warnung: Ihre Konfigurationsdatei scheint ungültig zu sein. Warnung: Eine oder mehrere Grenzen der geladenen Daten erreichen das Limit der numerischen Stabilität des internen Datentyps (Größenordnung zu groß). Erwägen Sie die Daten vor dem Laden zu skalieren. ArbeitsverzeichnisXYSie könne das machen, das ist in Ordnung, aber die Ausgabe ist nicht länger unabhängig vom BerechnungsprozessZZoomgeschwindigkeitgesternvor zehn Jahrenvor einigen Tagenvor einigen Dekadenvor einigen Stundenvor einigen Minutenvor einigen Monatenvor einigen Sekundenvor einigen Wochenvor einigen Jahrenvor einer Minutevor einem Monatvor einer Sekundevor einer Wochevor einem Jahrvor einer StundeAnzahldXdYdZFehlerDatei wird weiter eingelesen kann aber unter Umständen fehlschlagen.in Zukunft?kürzlichNutzen Sie Ihren Paketmanager um up-to-date zu sein unabhängig von den Einstellungen die Sie hier verwendenx-yx-zy-xy-zz-xz-y§Kons.3Depict-0.0.22/src/0000755000175000017500000000000013451744166013254 5ustar pcuserpcuser3Depict-0.0.22/src/gl/0000755000175000017500000000000013451744166013656 5ustar pcuserpcuser3Depict-0.0.22/src/gl/select.h0000644000175000017500000001426313305612110015271 0ustar pcuserpcuser/* * select,h - Opengl interaction header. * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SELECT_H #define SELECT_H #include class DrawableObj; class Filter; class Point3D; //Mouse button flags enum { SELECT_BUTTON_LEFT=1, SELECT_BUTTON_MIDDLE=2, SELECT_BUTTON_RIGHT=4 }; //!Keyboard keydown flags enum { FLAG_NONE=0, FLAG_CMD=1, //control (non-mac) or "clover" key (mac) FLAG_SHIFT=2, //Left or right shift key. }; //!Allowable binding modes enum { BIND_MODE_FLOAT_SCALE, //Object scaling only (fp value) BIND_MODE_FLOAT_TRANSLATE, //Floating point translation BIND_MODE_POINT3D_TRANSLATE, //3D point translation in 2D plane perpendicular to camera BIND_MODE_POINT3D_SCALE, //3D point translation in 2D plane perpendicular to camera; but indicate to user that this performs some kind of scaling operation BIND_MODE_POINT3D_ROTATE, //3D rotation in 2D plane perpendicular to camera BIND_MODE_POINT3D_ROTATE_LOCK, // 3D rotation in 2D plane perpendicular to camera, but with locked magnitude }; //!Bindable data types (data types that SelectionBinding can work with) enum { BIND_TYPE_FLOAT, BIND_TYPE_POINT3D }; //!This class is used to pool together a graphical representation (via the drawable), of //an object with its internal data structural representation. This allows the user //to grapple with the drawable representation and feed this into the scene. //This class binds ONE drawable object to a set of actions based upon key and button combinations. class SelectionBinding { private: //Pointer to drawable that generates selection events. //calls recomputeParams function DrawableObj *obj; //ID number for parent to know which of its bindings this is unsigned int bindingId; //ID number to bind the action for the drawable object unsigned int drawActionId; //Binding type unsigned int dataType; //Binding button (ORed together) unsigned int bindButtons; //Binding key (ORed together) unsigned int bindKeys; //Binding mode unsigned int bindMode; //Original value of data type (probably more mem efficient ot use a void*...) float cachedValFloat; Point3D cachedValPoint3D; bool valModified; //limits in floating point float fMin,fMax; public: SelectionBinding(); //!Returns true if this binding will be activated given the current flags bool isActive(unsigned int button,unsigned int curModifierFlags); //!Set the binding for a float DO NOT CACHE THE DRAWABLEOBJ-> THAT IS BAD void setBinding(unsigned int buttonFlags, unsigned int modifierFlags, unsigned int drawActionId, unsigned int bindingID, float initVal, DrawableObj *d); //!Set the binding for a Point3D. DO NOT CACHE THE DRAWABLEOBJ-> THAT IS BAD void setBinding(unsigned int buttonFlags, unsigned int modifierFlags, unsigned int drawActionId,unsigned int bindingID, const Point3D &initVal, DrawableObj *d); //!Set the interaction method. (example translate, scale, rotate etc) void setInteractionMode(unsigned int bindMode); //!Get the interaction mode unsigned int getInteractionMode() const { return bindMode;}; //!Get the mouse button unsigned int getMouseButtons() const { return bindButtons;}; //!Get the mouse button unsigned int getKeyFlags() const { return bindKeys;}; //!Set the limits for a floating point data type void setFloatLimits(float min,float max); //!Is this binding for the following object? bool matchesDrawable(const DrawableObj *d, unsigned int mouseFlags, unsigned int keyFlags) const; //!Is this binding for the following object? bool matchesDrawable(const DrawableObj *d) const; //!Apply the user ineraction specified. set permanent=true to //make it such that this is not undone during the next transform, //or call to reset() //worldvec is the vector along which to transform the object (subject to //interpretation by the "interaction mode" (bindmode) setting) void applyTransform(const Point3D &worldVec,bool permanent=false); //!Map the screen coords world coords, given the mouse and keyflags //coeffs are 0: right 1: forwards 2: up ( right hand rule) void computeWorldVectorCoeffs(unsigned int buttonFlags, unsigned int modifierFlags,Point3D &xCoeffs,Point3D &yCoeffs) const; //!Retrieve the current value from the drawable representation void getValue(float &f) const; //!Retreive the current value from the drawable representation void getValue(Point3D &p) const; unsigned int getID() const { return bindingId;}; //!True if the binding has modified the data bool modified() const {return valModified;}; void resetModified() { valModified=false; } }; class SelectionDevice { private: std::vector bindingVec; const Filter *target; public: //!Create a new selection device SelectionDevice(const Filter *p); //!Copy constructor (not implemented) SelectionDevice(const SelectionDevice ©Src); //!Bind a floating point type between the graphical and internal reps. //note that it is a BUG to attempt to bind any object that uses a //display list in its internal representation. void addBinding(SelectionBinding b); bool getBinding(const DrawableObj *d, unsigned int mouseFlags, unsigned int keyFlags, SelectionBinding* &b); bool getAvailBindings(const DrawableObj *d, std::vector &b) const; void getModifiedBindings(std::vector > &bindings); //!Return any devices that have been modified since their creation void resetModifiedBindings() ; size_t getNumBindings() const { return bindingVec.size(); } }; #endif 3Depict-0.0.22/src/gl/tr.cpp0000644000175000017500000003072213414250067015002 0ustar pcuserpcuser//Tile Rendering Library, // http://www.mesa3d.org/brianp/TR.html /* TR Tile rendering library Copyright (C) 1997 Brian Paul This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* $Id: tr.c,v 1.9 1998/01/29 16:56:54 brianp Exp $ */ /* * $Log: tr.c,v $ * Revision 1.9 1998/01/29 16:56:54 brianp * allow trOrtho() and trFrustum() to be called at any time, minor clean-up * * Revision 1.8 1998/01/28 19:47:39 brianp * minor clean-up for C++ * * Revision 1.7 1997/07/21 17:34:38 brianp * added tile borders * * Revision 1.6 1997/07/21 15:47:35 brianp * renamed all "near" and "far" variables * * Revision 1.5 1997/04/26 21:23:25 brianp * added trRasterPos3f function * * Revision 1.4 1997/04/26 19:59:36 brianp * set CurrentTile to -1 before first tile and after last tile * * Revision 1.3 1997/04/22 23:51:15 brianp * added WIN32 header stuff, removed tabs * * Revision 1.2 1997/04/19 23:26:10 brianp * many API changes * * Revision 1.1 1997/04/18 21:53:05 brianp * Initial revision * */ /* * Tiled Rendering library * Version 1.1 * Copyright (C) Brian Paul */ #include "common/assertion.h" #include #include #ifdef WIN32 #include #endif #ifdef __APPLE__ #include #include #else #include #include #endif #include "tr.h" #define DEFAULT_TILE_WIDTH 256 #define DEFAULT_TILE_HEIGHT 256 #define DEFAULT_TILE_BORDER 0 struct _TRctx { /* Final image parameters */ GLint ImageWidth, ImageHeight; GLenum ImageFormat, ImageType; GLvoid *ImageBuffer; /* Tile parameters */ GLint TileWidth, TileHeight; GLint TileWidthNB, TileHeightNB; GLint TileBorder; GLenum TileFormat, TileType; GLvoid *TileBuffer; /* Projection parameters */ GLboolean Perspective; GLdouble Left; GLdouble Right; GLdouble Bottom; GLdouble Top; GLdouble Near; GLdouble Far; /* Misc */ TRenum RowOrder; GLint Rows, Columns; GLint CurrentTile; GLint CurrentTileWidth, CurrentTileHeight; GLint CurrentRow, CurrentColumn; GLint ViewportSave[4]; }; /* * Misc setup including computing number of tiles (rows and columns). */ static void Setup(TRcontext *tr) { if (!tr) return; tr->Columns = (tr->ImageWidth + tr->TileWidthNB - 1) / tr->TileWidthNB; tr->Rows = (tr->ImageHeight + tr->TileHeightNB - 1) / tr->TileHeightNB; tr->CurrentTile = 0; ASSERT(tr->Columns >= 0); ASSERT(tr->Rows >= 0); } TRcontext *trNew() { TRcontext *tr = (TRcontext *) calloc(1, sizeof(TRcontext)); if (tr) { tr->TileWidth = DEFAULT_TILE_WIDTH; tr->TileHeight = DEFAULT_TILE_HEIGHT; tr->TileBorder = DEFAULT_TILE_BORDER; tr->RowOrder = TR_BOTTOM_TO_TOP; tr->CurrentTile = -1; } return (TRcontext *) tr; } void trDelete(TRcontext *tr) { if (tr) free(tr); } void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border) { if (!tr) return; ASSERT(border >= 0); ASSERT(width >= 1); ASSERT(height >= 1); ASSERT(width >= 2*border); ASSERT(height >= 2*border); tr->TileBorder = border; tr->TileWidth = width; tr->TileHeight = height; tr->TileWidthNB = width - 2 * border; tr->TileHeightNB = height - 2 * border; Setup(tr); } void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->TileFormat = format; tr->TileType = type; tr->TileBuffer = image; } void trImageSize(TRcontext *tr, GLint width, GLint height) { if (!tr) return; tr->ImageWidth = width; tr->ImageHeight = height; Setup(tr); } void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->ImageFormat = format; tr->ImageType = type; tr->ImageBuffer = image; } GLint trGet(TRcontext *tr, TRenum param) { if (!tr) return 0; switch (param) { case TR_TILE_WIDTH: return tr->TileWidth; case TR_TILE_HEIGHT: return tr->TileHeight; case TR_TILE_BORDER: return tr->TileBorder; case TR_IMAGE_WIDTH: return tr->ImageWidth; case TR_IMAGE_HEIGHT: return tr->ImageHeight; case TR_ROWS: return tr->Rows; case TR_COLUMNS: return tr->Columns; case TR_CURRENT_ROW: if (tr->CurrentTile<0) return -1; else return tr->CurrentRow; case TR_CURRENT_COLUMN: if (tr->CurrentTile<0) return -1; else return tr->CurrentColumn; case TR_CURRENT_TILE_WIDTH: return tr->CurrentTileWidth; case TR_CURRENT_TILE_HEIGHT: return tr->CurrentTileHeight; case TR_ROW_ORDER: return (GLint) tr->RowOrder; default: return 0; } } void trRowOrder(TRcontext *tr, TRenum order) { if (!tr) return; if (order==TR_TOP_TO_BOTTOM || order==TR_BOTTOM_TO_TOP) tr->RowOrder = order; } void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_FALSE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_TRUE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ) { GLdouble xmin, xmax, ymin, ymax; ymax = zNear * tan(fovy * M_PI / 360.0); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; trFrustum(tr, xmin, xmax, ymin, ymax, zNear, zFar); } void trBeginTile(TRcontext *tr) { GLint matrixMode; GLint tileWidth, tileHeight, border; GLdouble left, right, bottom, top; if (!tr) return; if (tr->CurrentTile <= 0) { Setup(tr); /* Save user's viewport, will be restored after last tile rendered */ glGetIntegerv(GL_VIEWPORT, tr->ViewportSave); } /* which tile (by row and column) we're about to render */ if (tr->RowOrder==TR_BOTTOM_TO_TOP) { tr->CurrentRow = tr->CurrentTile / tr->Columns; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else if (tr->RowOrder==TR_TOP_TO_BOTTOM) { tr->CurrentRow = tr->Rows - (tr->CurrentTile / tr->Columns) - 1; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else { /* This should never happen */ abort(); } ASSERT(tr->CurrentRow < tr->Rows); ASSERT(tr->CurrentColumn < tr->Columns); border = tr->TileBorder; /* Compute actual size of this tile with border */ if (tr->CurrentRow < tr->Rows-1) tileHeight = tr->TileHeight; else tileHeight = tr->ImageHeight - (tr->Rows-1) * (tr->TileHeightNB) + 2 * border; if (tr->CurrentColumn < tr->Columns-1) tileWidth = tr->TileWidth; else tileWidth = tr->ImageWidth - (tr->Columns-1) * (tr->TileWidthNB) + 2 * border; /* Save tile size, with border */ tr->CurrentTileWidth = tileWidth; tr->CurrentTileHeight = tileHeight; glViewport(0, 0, tileWidth, tileHeight); /* tile size including border */ /* save current matrix mode */ glGetIntegerv(GL_MATRIX_MODE, &matrixMode); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* compute projection parameters */ left = tr->Left + (tr->Right - tr->Left) * (tr->CurrentColumn * tr->TileWidthNB - border) / tr->ImageWidth; right = left + (tr->Right - tr->Left) * tileWidth / tr->ImageWidth; bottom = tr->Bottom + (tr->Top - tr->Bottom) * (tr->CurrentRow * tr->TileHeightNB - border) / tr->ImageHeight; top = bottom + (tr->Top - tr->Bottom) * tileHeight / tr->ImageHeight; if (tr->Perspective) glFrustum(left, right, bottom, top, tr->Near, tr->Far); else glOrtho(left, right, bottom, top, tr->Near, tr->Far); /* restore user's matrix mode */ glMatrixMode(matrixMode); } int trEndTile(TRcontext *tr) { GLint prevRowLength, prevSkipRows, prevSkipPixels, prevAlignment; if (!tr) return 0; ASSERT(tr->CurrentTile>=0); /* be sure OpenGL rendering is finished */ glFlush(); /* save current glPixelStore values */ glGetIntegerv(GL_PACK_ROW_LENGTH, &prevRowLength); glGetIntegerv(GL_PACK_SKIP_ROWS, &prevSkipRows); glGetIntegerv(GL_PACK_SKIP_PIXELS, &prevSkipPixels); glGetIntegerv(GL_PACK_ALIGNMENT, &prevAlignment); if (tr->TileBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->TileWidthNB; GLint srcHeight = tr->TileHeightNB; glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->TileFormat, tr->TileType, tr->TileBuffer); } if (tr->ImageBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->CurrentTileWidth - 2 * tr->TileBorder; GLint srcHeight = tr->CurrentTileHeight - 2 * tr->TileBorder; GLint destX = tr->TileWidthNB * tr->CurrentColumn; GLint destY = tr->TileHeightNB * tr->CurrentRow; /* setup pixel store for glReadPixels */ glPixelStorei(GL_PACK_ROW_LENGTH, tr->ImageWidth); glPixelStorei(GL_PACK_SKIP_ROWS, destY); glPixelStorei(GL_PACK_SKIP_PIXELS, destX); glPixelStorei(GL_PACK_ALIGNMENT, 1); /* read the tile into the final image */ glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->ImageFormat, tr->ImageType, tr->ImageBuffer); } /* restore previous glPixelStore values */ glPixelStorei(GL_PACK_ROW_LENGTH, prevRowLength); glPixelStorei(GL_PACK_SKIP_ROWS, prevSkipRows); glPixelStorei(GL_PACK_SKIP_PIXELS, prevSkipPixels); glPixelStorei(GL_PACK_ALIGNMENT, prevAlignment); /* increment tile counter, return 1 if more tiles left to render */ tr->CurrentTile++; if (tr->CurrentTile >= tr->Rows * tr->Columns) { /* restore user's viewport */ glViewport(tr->ViewportSave[0], tr->ViewportSave[1], tr->ViewportSave[2], tr->ViewportSave[3]); tr->CurrentTile = -1; /* all done */ return 0; } else return 1; } /* * Replacement for glRastePos3f() which avoids the problem with invalid * raster pos. */ void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z) { if (tr->CurrentTile<0) { /* not doing tile rendering right now. Let OpenGL do this. */ glRasterPos3f(x, y, z); } else { GLdouble modelview[16], proj[16]; GLint viewport[4]; GLdouble winX, winY, winZ; /* Get modelview, projection and viewport */ glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, proj); viewport[0] = 0; viewport[1] = 0; viewport[2] = tr->CurrentTileWidth; viewport[3] = tr->CurrentTileHeight; /* Project object coord to window coordinate */ if (gluProject(x, y, z, modelview, proj, viewport, &winX, &winY, &winZ)){ /* set raster pos to window coord (0,0) */ glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0, tr->CurrentTileWidth, 0.0, tr->CurrentTileHeight, 0.0, 1.0); glRasterPos3f(0.0, 0.0, -winZ); /* Now use empty bitmap to adjust raster position to (winX,winY) */ { GLubyte bitmap[1] = {0}; glBitmap(1, 1, 0.0, 0.0, winX, winY, bitmap); } /* restore original matrices */ glPopMatrix(); /*proj*/ glMatrixMode(GL_MODELVIEW); glPopMatrix(); } } } 3Depict-0.0.22/src/gl/textures.cpp0000644000175000017500000001665113414250067016245 0ustar pcuserpcuser/* * textures.cpp - texture wrapper class implementation * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #if defined(WIN32) || defined(WIN64) #include #endif #include "textures.h" #include "wx/wxcommon.h" #include "common/pngread.h" #include #include using std::vector; using std::string; const char *TEXTURE_OVERLAY_PNG[] = { "textures/Left_clicked_mouse.png", "textures/Left-Right-arrow.png", "textures/Right_clicked_mouse.png", "textures/rotateArrow.png", "textures/middle_clicked_mouse.png", "textures/scroll_wheel_mouse.png", "textures/enlarge.png", "textures/keyboard-ctrl.png", "textures/keyboard-command.png", "textures/keyboard-alt.png", "textures/keyboard-tab.png", "textures/keyboard-shift.png", }; TexturePool::~TexturePool() { closeAll(); } bool TexturePool::openTexture(const char *texName, unsigned int &texID) { std::string texPath; texPath = locateDataFile(texName); if(texPath.empty()) return false; //See if we already have this texture (use first frame as keyname) for(auto & openTexture : openTextures) { if(openTexture.first == texPath) { texID = openTexture.second.glID; return true; } } //Try to load the texture, as we don't have it texture tex; if(pngTexture2D(&tex,texPath.c_str())) return false; //record the texture in list of textures openTextures.emplace_back(texPath,tex); texID=tex.glID; return true; } bool TexturePool::openTexture3D(const std::vector &fileNames, unsigned int &texId) { ASSERT(fileNames.size()); vector fullNames; fullNames.resize(fileNames.size()); for(size_t ui=0;uiwidth = width; dest->height = height; dest->data = new unsigned char[4*width*height]; for (y=0; ydata[z++] = texture_rows[y][x]; } } free_pngrowpointers(texture_rows,height); //Retrieve the in-use texture, which we will reset later if (type == GL_TEXTURE_1D) glGetIntegerv(GL_TEXTURE_BINDING_1D, &curtex); else glGetIntegerv(GL_TEXTURE_BINDING_2D, &curtex); glGenTextures(1, &(dest->glID)); glBindTexture(type, dest->glID); //Send texture to video card if (type == GL_TEXTURE_1D) { glTexImage1D(type, 0, GL_RGBA, dest->width, 0, GL_RGBA, GL_UNSIGNED_BYTE, dest->data); } else { glTexImage2D(type, 0, GL_RGBA, dest->width, dest->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, dest->data); } //Sett scale-down // and scale-up interpolation to LINEAR glTexParameteri(type, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(type, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //Restore the current opengl texture glBindTexture(type, curtex); return (0); } int pngTexture3D(texture *dest, const vector &fileNames) { if(fileNames.empty()) return 0; dest->depth=fileNames.size(); //Copy data from disk into temporary storage auto dataArray=new vector[fileNames.size()]; for(size_t ui=0; uiwidth || height !=dest->height) { delete[] dataArray; free_pngrowpointers(texture_rows,height); return 3; } } //Copy data into texture structure dest->width = width; dest->height = height; dataArray[ui].resize(width*height*4); size_t arrayDest; arrayDest=0; for (size_t y=0; ydata = new unsigned char[4*dest->width*dest->height*dest->depth]; for(size_t ui=0;uidepth;ui++) { for(size_t uj=0;ujdata[offset++]=dataArray[ui][uj]; } } delete[] dataArray; glGenTextures(1, &(dest->glID)); glBindTexture(GL_TEXTURE_3D, dest->glID); //Send texture to video card glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, dest->width, dest->height, dest->depth, 0, GL_RGBA, GL_UNSIGNED_BYTE, dest->data); //Sett scale-down // and scale-up interpolation to LINEAR glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); return 0; } int pngTexture2D(texture* dest, const char* filename) { return (pngTexture(dest, filename, GL_TEXTURE_2D)); } int pngTexture1D(texture* dest, const char* filename) { return (pngTexture(dest, filename, GL_TEXTURE_1D)); } 3Depict-0.0.22/src/gl/select.cpp0000644000175000017500000001577513414250067015647 0ustar pcuserpcuser/* * select.cpp - filter selection binding implementation * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "common/mathfuncs.h" #include "common/assertion.h" #include "gl/drawables.h" #include "select.h" using std::vector; SelectionDevice::SelectionDevice(const Filter *p) : target(p) { } void SelectionDevice::addBinding(SelectionBinding b) { bindingVec.push_back(b); } bool SelectionDevice::getBinding(const DrawableObj *d,unsigned int mouseFlags, unsigned int keyFlags,SelectionBinding* &b) { unsigned int keyMask=0; bool found=false; for(auto & binding : bindingVec) { if(binding.matchesDrawable(d,mouseFlags,keyFlags)) { if(!found) { //we found one. found=true; b=&binding; keyMask=b->getKeyFlags(); continue; } //OK, we already have one, but we can be "trumped" //by a more complex keymask. if( (keyMask & binding.getKeyFlags() )== keyMask) { b=&binding; keyMask=b->getKeyFlags(); } } } //This selection device does not match //the targeted object. return found; } void SelectionDevice::getModifiedBindings(vector > &bindings) { ASSERT(target); for(unsigned int ui=0;ui &b) const { ASSERT(b.empty()); for(unsigned int ui=0;ui::max(); fMax=std::numeric_limits::max(); dataType=BIND_TYPE_FLOAT; } void SelectionBinding::setBinding(unsigned int button, unsigned int modifierFlags, unsigned int actionId, unsigned int bindID, const Point3D &initValue, DrawableObj *d) { bindingId=bindID; drawActionId=actionId; obj=d; bindKeys=modifierFlags; bindButtons=button; cachedValPoint3D = initValue; dataType=BIND_TYPE_POINT3D; } void SelectionBinding::setInteractionMode(unsigned int newBindMode) { //Rotation cannot have associated key flags. These are reserved //for changing the orientation of the rotation bindMode=newBindMode; } void SelectionBinding::setFloatLimits(float newMin,float newMax) { fMin=newMin; fMax=newMax; } void SelectionBinding::applyTransform(const Point3D &worldVec, bool permanent) { vector scalars; vector vecs; float fTmp; switch(bindMode) { case BIND_MODE_FLOAT_SCALE: { //Compute the new scalar as the magnitude of the difference vector fTmp = sqrtf(worldVec.sqrMag()); fTmp = std::max(fMin,fTmp); fTmp = std::min(fMax,fTmp); scalars.push_back(fTmp); break; } case BIND_MODE_FLOAT_TRANSLATE: { //Compute the new scalar as an offset by the mag of the scalar fTmp =0.5*cachedValFloat+sqrtf(worldVec.sqrMag()); fTmp = std::max(fMin,fTmp); fTmp = std::min(fMax,fTmp); scalars.push_back(fTmp); cachedValFloat=fTmp; break; } case BIND_MODE_POINT3D_TRANSLATE: case BIND_MODE_POINT3D_SCALE: { vecs.push_back(cachedValPoint3D+worldVec); //Only apply if this is a permanent change, //otherwise we will get an integrating effect if(permanent) cachedValPoint3D+=worldVec; break; } case BIND_MODE_POINT3D_ROTATE: { if(worldVec.sqrMag() > sqrtf(std::numeric_limits::epsilon())) { vecs.push_back(worldVec); cachedValPoint3D = worldVec; } break; } case BIND_MODE_POINT3D_ROTATE_LOCK: { if(worldVec.sqrMag() > sqrtf(std::numeric_limits::epsilon())) { //Renormalise the vector back to the same scale as the cached value vecs.push_back(worldVec*sqrtf(cachedValPoint3D.sqrMag()/worldVec.sqrMag())); if(permanent) cachedValPoint3D=vecs.back(); } break; } default: ASSERT(false); } if(vecs.size() || scalars.size()) { //Force a recomputation of the internal parameters //for the drawable object. Whatever they are. obj->recomputeParams(vecs,scalars,drawActionId); valModified=true; } } void SelectionBinding::computeWorldVectorCoeffs(unsigned int buttonFlags, unsigned int modifierFlags,Point3D &xCoeffs,Point3D &yCoeffs) const { switch(bindMode) { case BIND_MODE_FLOAT_TRANSLATE: case BIND_MODE_FLOAT_SCALE: //It is of no concern. we are going to pass this to sqrmag //anyway during applyTransform. xCoeffs=Point3D(1,0,0); yCoeffs=Point3D(0,1,0); break; case BIND_MODE_POINT3D_TRANSLATE: case BIND_MODE_POINT3D_SCALE: case BIND_MODE_POINT3D_ROTATE: case BIND_MODE_POINT3D_ROTATE_LOCK: { if(modifierFlags == FLAG_CMD && bindKeys!=FLAG_CMD) { //Mouse movement in x sends you forwards //y movement sends you up down (wrt camera) xCoeffs=Point3D(0,0,1); yCoeffs=Point3D(0,1,0); } else if(modifierFlags == FLAG_SHIFT && bindKeys != FLAG_SHIFT) { //Mouse movement in x sends you across //y movement sends you forwards (wrt camera) xCoeffs=Point3D(1,0,0); yCoeffs=Point3D(0,0,1); } else { //For example: FLAG_NONE //IN plane with camera. xCoeffs=Point3D(1,0,0); yCoeffs=Point3D(0,1,0); } break; } default: ASSERT(false); } } void SelectionBinding::getValue(float &f) const { f=cachedValFloat; } void SelectionBinding::getValue(Point3D &f) const { f=cachedValPoint3D; } bool SelectionBinding::matchesDrawable(const DrawableObj *d, unsigned int mouseFlags, unsigned int keyFlags) const { //Object and mouseflags must match. keyflags must be nonzero after masking with bindKeys if(bindKeys) return (obj == d && mouseFlags == bindButtons && (keyFlags &bindKeys) == bindKeys); else return (obj == d && mouseFlags == bindButtons); }; bool SelectionBinding::matchesDrawable(const DrawableObj *d) const { return (obj == d); } 3Depict-0.0.22/src/gl/effect.cpp0000644000175000017500000003256313331600075015612 0ustar pcuserpcuser/* * effect.cpp - 3D visuals effects implementation * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "effect.h" #include "common/xmlHelper.h" #include "common/stringFuncs.h" #include "common/constants.h" //OpenGL includes //MacOS is "special" and puts it elsewhere #ifdef __APPLE__ #include #else #include #endif Camera* Effect::curCam=0; BoundCube Effect::bc; const float MIN_CROP_FRACTION=0.0001; const unsigned int NUM_EFFECTS=2; const char *EFFECT_NAMES[] = { "boxcrop", "anaglyph" }; //factory functions Effect *makeEffect(unsigned int effectID) { Effect *e; switch(effectID) { case EFFECT_ANAGLYPH: e = new AnaglyphEffect; break; case EFFECT_BOX_CROP: e=new BoxCropEffect; break; default: ASSERT(false); } return e; } Effect *makeEffect(const std::string &str) { Effect *e=0; for(unsigned int ui=0;uigetType()]; } BoxCropEffect::BoxCropEffect() : openGLIdStart(0), useCamCoordinates(false) { effectType=EFFECT_BOX_CROP; } Effect *BoxCropEffect::clone() const { Effect *e = new BoxCropEffect; *e=*this; return e; } void BoxCropEffect::enable(unsigned int pass) const { //we only need to do anything on the first pass. All other passes are unchanged if(pass) return; //Compute the bounding box that is the clipped boundary Point3D pAAB[2]; //Axis aligned box bc.getBounds(pAAB[0],pAAB[1]); Point3D pCentre; pCentre = (pAAB[0] + pAAB[1])*0.5f; unsigned int glOffset=openGLIdStart; if(useCamCoordinates) { Point3f pBox[8]; for(unsigned int ui=0;ui<8;ui++) { //Counting in binary to generate box corner vertices. pBox[ui].fx = pAAB[(ui>>2) &1][0]; pBox[ui].fy = pAAB[(ui>>1) &1][1]; pBox[ui].fz = pAAB[ui&1][2]; } //Translate to rotate around the box centre for(unsigned int ui=0;ui<8;ui++) { pBox[ui].fx-=pCentre[0]; pBox[ui].fy-=pCentre[1]; pBox[ui].fz-=pCentre[2]; } Point3D x,y,z; //get camera orientation data z= curCam->getUpDirection(); y= curCam->getViewDirection(); //We need to first do a "passive" coordinate transformation on the box coordinates //to determine the box coordinates in camera basis vectors (after translation such tat //centre of box is in centre of world). //Active transformations are v'=Tv_orig. Passive transformation is that v_prime = T^-1 v_orig // z.normalise(); //Not needed, I think.. but can't hurt y.normalise(); x= z.crossProd(y); float angle; angle=z.angle(Point3D(0,0,1)); //If needed, perform a rotation to align the box up //vector with the camera up vector Point3f r; Point3D yTmpRot; if(fabs(angle) > sqrtf(std::numeric_limits::epsilon())) { Point3D rotateAxis; //Check for numerical stability problem when camera //& world z axes point exactly apart if( fabs(angle-M_PI) ::epsilon())) rotateAxis=Point3D(1,0,0); //Pick *any* vector in X-Y plane. else rotateAxis = z.crossProd(Point3D(0,0,1)); rotateAxis.normalise(); r.fx=rotateAxis[0]; r.fy=rotateAxis[1]; r.fz=rotateAxis[2]; for(unsigned int ui=0;ui<8;ui++) quat_rot(&(pBox[ui]),&r,angle); Point3f yRot; yRot.fx=0; yRot.fy=1; yRot.fz=0; quat_rot(&yRot,&r,angle); yTmpRot=Point3D(yRot.fx,yRot.fy,yRot.fz); ASSERT(yTmpRot.sqrMag() > sqrtf(std::numeric_limits::epsilon())); } else yTmpRot=Point3D(0,1,0); //Rotating around the z axis to set "spin" r.fx=z[0]; r.fy=z[1]; r.fz=z[2]; angle=y.angle(yTmpRot); if( fabs(angle) > sqrtf(std::numeric_limits::epsilon())) { //Spin the box around to match the final coordinate system for(unsigned int ui=0;ui<8;ui++) quat_rot(&(pBox[ui]),&r,angle); } //Now compute the box coordinates, then break their position //vectors (from box centre) down into the basis //coordinates of our camera Point3D pBoxVertices[8]; for(unsigned int ui=0;ui<8;ui++) pBoxVertices[ui]= Point3D(pBox[ui].fx, pBox[ui].fy,pBox[ui].fz); float dotValue[3]; dotValue[0]=dotValue[1]=dotValue[2]=-std::numeric_limits::max(); //Find the largest positive basis components (these form the camera BB limits) for(unsigned int ui=0;ui<8;ui++) { float tmp; tmp =x.dotProd(pBoxVertices[ui]); if(tmp > dotValue[0]) dotValue[0]=tmp; tmp =y.dotProd(pBoxVertices[ui]); if(tmp > dotValue[1]) dotValue[1]=tmp; tmp =z.dotProd(pBoxVertices[ui]); if(tmp > dotValue[2]) dotValue[2]=tmp; } //Compute the cropping deltas in the range [-1,1] float dC[6]; for(unsigned int ui=0;ui<6;ui++) { if(ui&1) { //upper dC[ui] =2.0*(0.5- cropFractions[ui]); } else { //Lower dC[ui]=2.0*(cropFractions[ui]-0.5); } } //Cropping delta * dotproduct *basisvector == crop point //Note the reversal of the Z and Y vectors pAAB[0] = pCentre + x*dotValue[0]*dC[0] +y*dotValue[1]*dC[2]+z*dotValue[2]*dC[4]; pAAB[1] = pCentre + x*dotValue[0]*dC[1] +y*dotValue[1]*dC[3]+z*dotValue[2]*dC[5]; //Draw crop iff crop fractions are +ve //X if(cropFractions[0] >=MIN_CROP_FRACTION) { doClip(pAAB[0],x,glOffset); glOffset++; } if(cropFractions[1] >=MIN_CROP_FRACTION) { doClip(pAAB[1],-x,glOffset); glOffset++; } //Y if(cropFractions[2] >=MIN_CROP_FRACTION) { doClip(pAAB[0],y,glOffset); glOffset++; } if(cropFractions[3] >=MIN_CROP_FRACTION) { doClip(pAAB[1],-y,glOffset); glOffset++; } //Z if(cropFractions[4] >=MIN_CROP_FRACTION) { doClip(pAAB[0],z,glOffset); glOffset++; } if(cropFractions[5] >=MIN_CROP_FRACTION) { doClip(pAAB[1],-z,glOffset++); glOffset++; } } else { pAAB[0] = pCentre + Point3D(0.5-cropFractions[0], 0.5-cropFractions[2],0.5-cropFractions[4])*(pAAB[0]-pCentre)*2.0; pAAB[1] = pCentre + Point3D(0.5-cropFractions[1], 0.5-cropFractions[3],0.5-cropFractions[5])*(pAAB[1]-pCentre)*2.0; for(unsigned int ui=0;ui<6;ui++) { Point3D normal; //Don't update minimum crop fractions if(cropFractions[ui] < MIN_CROP_FRACTION) continue; //Set up the normal & origin (use rectangular prism vertex as origin) normal=Point3D(0,0,0); normal.setValue(ui/2,1); if(ui&1) { normal=-normal; doClip(pAAB[1],normal,glOffset); } else doClip(pAAB[0],normal,glOffset); glOffset++; } } } void BoxCropEffect::doClip(const Point3D &origin, const Point3D &normal, unsigned int glOffset) const { double array[4]; //Ax + By + Cz + D =0. Prove from //n.dot(v-p_0)=0 array[0]=normal[0]; array[1]=normal[1]; array[2]=normal[2]; array[3] = -normal.dotProd(origin); glMatrixMode(GL_MODELVIEW); //Set up the effect glClipPlane(GL_CLIP_PLANE0 +glOffset, array); glEnable(GL_CLIP_PLANE0+glOffset); } void BoxCropEffect::disable() const { unsigned int startId=openGLIdStart; for(unsigned int ui=0; ui<6;ui++) { if(cropFractions[ui]>= MIN_CROP_FRACTION) { glDisable(GL_CLIP_PLANE0+startId); startId++; } } } bool BoxCropEffect::willDoSomething() const { for(unsigned int ui=0;ui<6;ui++) { if(cropFractions[ui]>=MIN_CROP_FRACTION) return true; } return false; } void BoxCropEffect::setFractions(const float *frac) { for(unsigned int ui=0;ui<6;ui++) cropFractions[ui]=frac[ui]; } float BoxCropEffect::getCropValue(unsigned int pos) const { ASSERT(pos<6); return cropFractions[pos]; } void BoxCropEffect::getCroppedBounds(BoundCube &b) const { Point3D pLow,pHi; b.getBounds(pLow,pHi); Point3D pCentre = (pLow+pHi)*0.5; pLow = pCentre + Point3D(0.5-cropFractions[0], 0.5-cropFractions[2],0.5-cropFractions[4])*(pLow-pCentre)*2.0; pHi = pCentre + Point3D(0.5-cropFractions[1], 0.5-cropFractions[3],0.5-cropFractions[5])*(pHi-pCentre)*2.0; b.setBounds(pLow,pHi); } bool BoxCropEffect::writeState(std::ofstream &f, unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: f << tabs(depth+1) << "" << endl; f << tabs(depth+2) << "" << endl; for(unsigned int ui=0;ui<6;ui++) { f << tabs(depth+3) << "" << endl; } f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; break; default: ASSERT(false); return false; } return true; } bool BoxCropEffect::readState(xmlNodePtr nodePtr) { using std::string; if(!nodePtr->xmlChildrenNode) return false; nodePtr=nodePtr->xmlChildrenNode; xmlNodePtr scalars; if(XMLHelpFwdToElem(nodePtr,"cropvalues")) return false; scalars=nodePtr->xmlChildrenNode; for(unsigned int ui=0;ui<6;ui++) { if(!XMLGetNextElemAttrib(scalars,cropFractions[ui],"scalar","value")) return false; } string s; if(!XMLGetNextElemAttrib(nodePtr,s,"usecamcoordinates","value")) return false; if(s=="0") useCamCoordinates=false; else if (s == "1") useCamCoordinates=true; else return false; return true; } AnaglyphEffect::AnaglyphEffect() : colourMode(ANAGLYPH_REDBLUE), eyeFlip(false), oldCam(0),baseShift(0.01f) { effectType=EFFECT_ANAGLYPH; } Effect *AnaglyphEffect::clone() const { Effect *e = new AnaglyphEffect; *e=*this; return e; } void AnaglyphEffect::enable(unsigned int passNumber) const { if(passNumber >1 || curCam->type() !=CAM_LOOKAT) return; if(passNumber==0) { ASSERT(!oldCam); oldCam=curCam->clone(); //Translate both the target, and the origin curCam->translate(baseShift,0); //Apply the frustum offset to restore the shifted focal plane ((CameraLookAt*)curCam)->setFrustumDistort(baseShift); } else { *curCam=*oldCam; //this time, in the reverse direction; //Translate both the target, and the origin curCam->translate(-baseShift,0); //Apply the frustum offset to restore the shifted focal plane ((CameraLookAt*)curCam)->setFrustumDistort(-baseShift); } //Different type of glasses use different colour masks. const bool maskArray[][6] = { {true,false,false,false,false,true}, //Red-blue {true,false,false,false,true,false}, //red-green {true,false,false,false,true,true}, // red-cyan {false,true,false,true,false,true} //green-magenta }; //Colour buffer masking method if(passNumber == 0) { glClear(GL_COLOR_BUFFER_BIT ); } else glClear(GL_DEPTH_BUFFER_BIT); //we flip either due to the pass, or because the user has //back to front glasses. unsigned int offset; if(passNumber ^ eyeFlip) offset=0; else offset=3; unsigned int idx = colourMode-ANAGLYPH_REDBLUE; glColorMask(maskArray[idx][offset],maskArray[idx][offset+1], maskArray[idx][offset+2],true); } void AnaglyphEffect::setMode(unsigned int mode) { ASSERT(colourMode" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; break; default: ASSERT(false); return false; } return true; } bool AnaglyphEffect::readState(xmlNodePtr nodePtr) { using std::string; if(!nodePtr->xmlChildrenNode) return false; nodePtr=nodePtr->xmlChildrenNode; if(!XMLGetNextElemAttrib(nodePtr,colourMode,"colourmode","value")) return false; if(colourMode >= ANAGLYPH_HALF_COLOUR) return false; string s; if(!XMLGetNextElemAttrib(nodePtr,s,"eyeflip","value")) return false; if(s == "0") eyeFlip=false; else if(s == "1") eyeFlip=true; else return false; if(!XMLGetNextElemAttrib(nodePtr,baseShift,"baseshift","value")) return false; return true; } 3Depict-0.0.22/src/gl/drawables.h0000644000175000017500000011323113414250067015763 0ustar pcuserpcuser/* * drawables.h - Opengl drawable objects header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DRAWABLES_H #define DRAWABLES_H //MacOS is "special" and puts it elsewhere #ifdef ENABLE_LIBVD #include #include #endif #ifdef __APPLE__ #include #else #include #endif #include #include "textures.h" #include "cameras.h" #include "isoSurface.h" template class Voxels; //TODO: Work out if there is any way of obtaining the maximum //number of items that can be drawn in an opengl context //For now Max it out at 10 million (~120MB of vertex data) const size_t MAX_NUM_DRAWABLE_POINTS=10; //OK, the new FTGL is fucked up. It actually uses defines from //freetype as arguments to #includes. Weird. So this sequence is important #include #include //!FTGL Font modes enum { FTGL_BITMAP=0, FTGL_PIXMAP, FTGL_OUTLINE, FTGL_POLYGON, FTGL_EXTRUDE, FTGL_TEXTURE }; //!Text aligment modes for DrawGLText enum { DRAWTEXT_ALIGN_LEFT, DRAWTEXT_ALIGN_CENTREX, DRAWTEXT_ALIGN_RIGHT, DRAWTEXT_ALIGN_HORIZ_ENUM_END }; enum { DRAWTEXT_ALIGN_LOWER, DRAWTEXT_ALIGN_CENTREY, DRAWTEXT_ALIGN_UPPER, DRAWTEXT_ALIGN_VERT_ENUM_END }; //!Primitve drawing mode. (wireframe/solid) enum { DRAW_WIREFRAME, DRAW_FLAT, DRAW_SMOOTH, DRAW_END_ENUM //Not a mode, just a marker to catch end-of-enum }; //!Axis styles enum { AXIS_IN_SPACE }; //!Polygon drawing styles enum { POLYGON_DRAW_OUTLINE, POLYGON_DRAW_ENUM_END }; //!Triangle mesh drawing styles enum { TRIMESH_DRAW_SURF, TRIMESH_DRAW_ENUM_END }; //!Drawable types enum { DRAW_TYPE_POINT, DRAW_TYPE_MANYPOINT, DRAW_TYPE_VECTOR, DRAW_TYPE_TRIANGLE, DRAW_TYPE_QUAD, DRAW_TYPE_POLYGON, DRAW_TYPE_SPHERE, DRAW_TYPE_CYLINDER, DRAW_TYPE_DISPLAYLIST, DRAW_TYPE_GLTEXT, DRAW_TYPE_GL2DTEXT, DRAW_TYPE_2D_CIRCLE, DRAW_TYPE_RECTPRISM, DRAW_TYPE_COLOURBAR, DRAW_TYPE_TEXTUREDOVERLAY, DRAW_TYPE_ANIMATEDOVERLAY, DRAW_TYPE_FIELD3D, DRAW_TYPE_ISOSURFACE, DRAW_TYPE_AXIS, DRAW_TYPE_LEGENDOVERLAY, DRAW_TYPE_PROGRESSCIRCLE_OVERLAY, DRAW_TYPE_TRIANGLE_MESH, }; //TODO: It seems unnecessary to have multiple types for the bind //!Binding enums. Needed to bind drawable selection //to internal modification actions inside the drawable enum { DRAW_SPHERE_BIND_ORIGIN, DRAW_SPHERE_BIND_RADIUS, DRAW_VECTOR_BIND_ORIENTATION, DRAW_VECTOR_BIND_ORIGIN_ONLY, DRAW_VECTOR_BIND_ORIGIN, DRAW_VECTOR_BIND_TARGET, DRAW_CYLINDER_BIND_ORIGIN, DRAW_CYLINDER_BIND_DIRECTION, DRAW_CYLINDER_BIND_RADIUS, DRAW_RECT_BIND_TRANSLATE, DRAW_RECT_BIND_CORNER_MOVE, DRAW_TEXT_BIND_ORIGIN, DRAW_QUAD_BIND_ORIGIN, //DRAW_TEXT_BIND_TEXTDIR, //FIXME: Implement me for annotation todo. //DRAW_TEXT_BIND_UPDIR, DRAW_TRIMESH_BIND_ORIGIN, DRAW_BIND_ENUM_END }; struct RGBFloat { float v[3]; }; struct TRI_IDX { size_t idx[3]; RGBFloat col[3]; }; //!An abstract bas class for drawing primitives class DrawableObj { protected: //!Is the drawable active? bool active; //!Is the object changed since last set? bool haveChanged; //!Pointer to current scene camera static const Camera *curCamera; //Background colour static float backgroundR,backgroundG,backgroundB; //Pointer to texture pool object static TexturePool *texPool; static bool useAlphaBlend; //Size of the opengl window static unsigned int winX,winY; static float getHighContrastValue(); public: //!Can be selected from openGL viewport interactively? bool canSelect; //!Wants lighting calculations active during render? bool wantsLight; static void setUseAlphaBlending(bool willBlend) { useAlphaBlend =willBlend;} //!Is this an overlay? By default, no virtual bool isOverlay() const { return false;} //!Constructor DrawableObj(); //Obtain the type mask for this drawable virtual unsigned int getType() const =0; //Obtain a copy of this object, which is still valid // after destruction of the original // Disallowed by default Implement in derived object! //TODO: Once most sub-objects have this function, make pure virtual virtual DrawableObj *clone() const {ASSERT(false); return 0;} //!Do we need to do element based depth sorting? virtual bool needsDepthSorting() const { return false; } ; //!Can we break this object down into constituent elements? virtual bool isExplodable() const { return false;}; //!Break object down into simple elements virtual void explode(std::vector &simpleObjects); virtual bool hasChanged() const { return haveChanged; } //!Set the active state of the object void setActive(bool active); //!Pure virtual function - draw the object virtual void draw() const =0; //!Set if user can interact with object, needed for opengl hit testing void setInteract(bool canAct){canSelect=canAct;}; virtual void getBoundingBox(BoundCube &b) const = 0; //!Drawable destructor virtual ~DrawableObj(); //!If we offer any kind of external pointer interface; use this to do a recomputation as needed. This is needed for selection binding behaviour virtual void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode) {}; //!Set the current camera static void setCurCamera(const Camera *c){curCamera=c;}; //!Set the current camera static void setTexPool(TexturePool *t); static void clearTexPool(); //!Get the centre of the object. Only valid if object is simple virtual Point3D getCentroid() const ; static void setWindowSize(unsigned int x, unsigned int y){winX=x;winY=y;}; static void setBackgroundColour(float r, float g,float b) {backgroundR=r; backgroundG=g;backgroundB=b;} }; //Abstract class as base for overlays class DrawableOverlay : public DrawableObj { protected: //alpha (transparancy) value float a; //!Height and width of overlay (total) float height,width; //Fractional coordinates for the top left of the overlay float position[2]; public: DrawableOverlay() {} ; //Declared as pure virtual to force ABC virtual ~DrawableOverlay() =0; void setAlpha(float alpha) { a=alpha;}; void setSize(float widthN, float heightN) {height=heightN, width=widthN;} void setSize(float size) {width=height=size;}; void setPosition(float newTLX,float newTLY) { position[0]=newTLX; position[1]=newTLY;} void getBoundingBox(BoundCube &b) const {b.setInvalid();}; //!This is an overlay bool isOverlay() const {return true;}; }; //A single point drawing class class DrawPoint : public DrawableObj { protected: //!Point origin Point3D origin; //!Point colour (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; //!Size of point float size; public: //!Constructor DrawPoint(); //!Constructor that takes in positional augments DrawPoint(float,float,float); //!Constructor that takes in positional augments DrawPoint(const Point3D &p); //!Destructor virtual ~DrawPoint(); unsigned int getType() const {return DRAW_TYPE_POINT;} virtual DrawableObj *clone() const; //!Sets the color of the point to be drawn void setColour(float r, float g, float b, float alpha); //!Draws the points void draw() const; //!Sets the location of the point void setOrigin(const Point3D &); //!Set the size of the point void setSize(float s) { size=s;} void getBoundingBox(BoundCube &b) const { b.setInvalid();}; Point3D getCentroid() const{ return origin;} }; //!A point drawing class - for many points of same size & colour class DrawManyPoints : public DrawableObj { protected: //!Vector of points to draw std::vector pts; //!Point colours (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; //!Size of the point float size; mutable bool haveCachedBounds; mutable BoundCube cachedBounds; public: //!Constructor DrawManyPoints(); //!Destructor virtual ~DrawManyPoints(); virtual unsigned int getType() const {return DRAW_TYPE_MANYPOINT;}; virtual DrawableObj *clone() const; //!Swap out the internal vector with an extenal one void swap(std::vector &); //!Remove all points void clear(); //!Add points into the drawing vector void addPoints(const std::vector &); //!Add a single point into the drawing vector, at a particular offset // *must call resize first* void setPoint(size_t offset,const Point3D &); //!Reset the number of many points to draw void resize(size_t newSize); //! set the color of the points to be drawn void setColour(float r, float g, float b, float alpha); //!Set the display size of the drawn poitns void setSize(float); //!Draw the points void draw() const; //!Shuffle the points to remove anisotropic drawing effects. Thus must be done prior to draw call. void shuffle(); //!Get the bounding box that encapuslates this object void getBoundingBox(BoundCube &b) const; //!return number of points size_t getNumPts() const { return pts.size();}; }; //!Draw a vector class DrawVector: public DrawableObj { protected: //!Vector origin Point3D origin; Point3D vector; //!Do we draw the arrow head? bool drawArrow; //!Radius of tail of arrow float arrowSize; //!Scale arrow head by vector size bool scaleArrow; //!Whether to draw the arrow head at both ends bool doubleEnded; //!Vector colour (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; //!Size of "tail" line to draw float lineSize; public: //!Constructor DrawVector(); //!Destructor virtual ~DrawVector(); virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_VECTOR;}; //!Set if we want to draw the arrow or not void setDrawArrow(bool wantDraw) { drawArrow=wantDraw;} //!Sets the color of the point to be drawn void setColour(float r, float g, float b, float alpha); //!Draws the points void draw() const; //!Sets the location of the poitns void setOrigin(const Point3D &); //!Sets the location of the poitns void setVector(const Point3D &); //Set the start/end of vector in one go void setEnds(const Point3D &start, const Point3D &end); //Set to draw both ends void setDoubleEnded(bool wantDoubleEnd=true){doubleEnded=wantDoubleEnd;}; //!Gets the arrow axis direction Point3D getVector() const { return vector;}; //!Gets the arrow axis direction Point3D getOrigin() const{ return origin;}; //!Set the arrowhead size void setArrowSize(float size) { arrowSize=size;} //!Set the "tail" line size void setLineSize(float size) { lineSize=size;} void getBoundingBox(BoundCube &b) const; //!Recompute the internal parameters using the input vector information void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; //! A single colour triangle class DrawTriangle : public DrawableObj { protected: //!The vertices of the triangle Point3D vertices[3]; Point3D vertNorm[3]; //!Colour data - red, green, blue, alpha float r,g,b,a; public: //!Constructor DrawTriangle(); //!Destructor virtual ~DrawTriangle(); virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_TRIANGLE;}; //!Set one of three vertices (0-2) locations void setVertex(unsigned int, const Point3D &); //!Set the vertex normals void setVertexNorm(unsigned int, const Point3D &); //!Set the colour of the triangle void setColour(float r, float g, float b, float a); //!Draw the triangle void draw() const; //!Get bounding cube void getBoundingBox(BoundCube &b) const { b.setBounds(vertices,3);} }; //!A smooth coloured quad /* According to openGL, the quad's vertices need not be coplanar, * but they must be convex */ class DrawQuad : public DrawableObj { protected: //!Vertices of the quad Point3D vertices[4]; //!Colour data for the quad //!The lighting normal of the triangle /*! Lighting for this class is per triangle only no * per vertex lighting */ Point3D normal; //!Colours of the vertices (rgba colour model) float r[4],g[4],b[4],a[4]; public: //!Constructor DrawQuad() {}; //!Destructor virtual ~DrawQuad() {}; virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_QUAD;}; //!Get bounding cube virtual void getBoundingBox(BoundCube &b) const ; //!sets the vertices to defautl colours (r g b and white ) for each vertex respectively void colourVerticies(); //!Set vertex's location void setVertex(unsigned int, const Point3D &); void setVertices(const Point3D *); //!Set the colour of a vertex void setColour(unsigned int, float r, float g, float b, float a); //!Set the colour of all vertices void setColour(float r, float g, float b, float a); //!Update the normal to the surface from vertices /*!Uses the first 3 vertices to calculate the normal. */ void calcNormal(); //!Draw the triangle void draw() const; //!Gets the arrow axis direction Point3D getOrigin() const; //!Recompute the internal parameters using the input vector information // i.e. this is used for (eg) mouse interaction void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; class DrawTexturedQuad : public DrawQuad { private: //TODO: Move this back // into the texture pool unsigned char *textureData; size_t nX,nY; size_t channels; //FIXME: This should be non-mutable. We need // to move texture rebinding to a pre-processing step, not at draw time //ID of the texture to use when drawing, -1 if not bound // to opengl mutable unsigned int textureId; //disallow resetting base colour to white bool noColour; //we can only bind from the main thread. // this is true by default, until the texture is bound mutable bool needsBinding; public: DrawTexturedQuad(); ~DrawTexturedQuad(); DrawTexturedQuad(const DrawTexturedQuad &d); //Resize the texture contents, destroying any existing contents void resize(size_t nx, size_t nY, unsigned int nChannels); //Draw the texture void draw() const; //Set the specified pixel in the texture to this value void setData(size_t x, size_t y, unsigned char *entry); //Send the texture to the video card. void rebindTexture(unsigned int mode=GL_RGB) const; void setUseColouring(bool useColouring) {noColour= !useColouring;}; }; //Draw an irregular 2D n-gon in 3D. class DrawPolygon : public DrawableObj { protected: //!Vertices of the quad vector vertices; //!Colour data for the quad //!The lighting normal of the triangle /*! Lighting for this class is per triangle only no * per vertex lighting */ Point3D normal; //!Colours of polygon (rgba colour model) float r,g,b,a; //!The drawings style to use (eg filled, outline etc) unsigned int drawMode; public: //!Constructor DrawPolygon() {drawMode=POLYGON_DRAW_OUTLINE;}; //!Destructor virtual ~DrawPolygon() {}; virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_POLYGON;}; //!Get bounding cube virtual void getBoundingBox(BoundCube &b) const ; void setVertices(const vector &p); //!Set the colour of all vertices void setColour(float r, float g, float b, float a); //!Draw the triangle void draw() const; //!Gets the arrow axis direction Point3D getOrigin() const; }; //Coloured triangle mesh class DrawTriangleMesh : public DrawableObj { protected: //!Vector of points to draw std::vector pts; //!Indices of triangle vertices std::vector triIndices; //FIXME: Redo some of the selection code, so we don't need // this Point3D origCentroid,deltaOrigin; float alpha; bool drawDoubleSided; //If true, draw the mesh edges in addition to the // coloured triangles bool drawMeshEdges; unsigned int drawMode; mutable bool haveCachedBounds; mutable BoundCube cachedBounds; public: DrawTriangleMesh(); ~DrawTriangleMesh(); //Assign the triangle data - note this destroys the input data void setData(std::vector &pts, std::vector &idx); //Set whether the edges of the triangle should be drawn void setDrawMeshEdges(bool doDraw=true) { drawMeshEdges=true;} unsigned int getType() const {return DRAW_TYPE_TRIANGLE_MESH;} //!Draws the triangle mesh void draw() const; //!Get the bounding box that encapulates this object void getBoundingBox(BoundCube &b) const ; //!Recompute the internal parameters using the input vector information void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); //!Set the opacity value (alpha) void setAlpha(float f) { alpha=f;} }; //!A sphere drawing class DrawSphere : public DrawableObj { protected: //!Pointer to the GLU quadric doohicker GLUquadricObj *q; //!Origin of the object Point3D origin; //!Colour data - rgba float r,g,b,a; //!Sphere radius float radius; //!Number of lateral and longitudinal segments unsigned int latSegments,longSegments; public: //!Default Constructor DrawSphere(); //! Destructor virtual ~DrawSphere(); virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_SPHERE;}; //!Sets the location of the sphere's origin void setOrigin(const Point3D &p); //!Gets the location of the sphere's origin Point3D getOrigin() const { return origin;}; //!Set the number of lateral segments void setLatSegments(unsigned int); //!Set the number of longitudinal segments void setLongSegments(unsigned int); //!Set the radius void setRadius(float); //!get the radius float getRadius() const { return radius;}; //!Set the colour (rgba) of the object void setColour(float r,float g,float b,float a); //!Draw the sphere void draw() const; //!Get the bounding box that encapuslates this object void getBoundingBox(BoundCube &b) const ; //!Recompute the internal parameters using the input vector information // i.e. this is used for (eg) mouse interaction void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; //!A tapered cylinder drawing class class DrawCylinder : public DrawableObj { protected: //!Pointer to quadric, required for glu. Note the caps are defined as well GLUquadricObj *q,*qCap[2]; //!Colours for cylinder float r,g,b,a; //!Cylinder start and end radii float radius; //!Length of the cylinder float length; //!Origin of base and direction of cylinder Point3D origin, direction; //!number of sectors (pie slices) unsigned int slices; //!number of vertical slices (should be 1 if endradius equals start radius unsigned int stacks; //!Do we lock the drawing to only use the first radius? bool radiiLocked; public: //!Constructor DrawCylinder(); //!Destructor virtual ~DrawCylinder(); virtual unsigned int getType() const {return DRAW_TYPE_CYLINDER;}; //!Set the location of the base of the cylinder void setOrigin(const Point3D &pt); //!Number of cuts perpendicular to axis - ie disks void setSlices(unsigned int i); //!Number of cuts along axis - ie segments void setStacks(unsigned int i); //!Gets the location of the origin Point3D getOrigin() const { return origin;}; //!Gets the cylinder axis direction Point3D getDirection() const{ return direction;}; //!Set end radius void setRadius(float val); //!get the radius float getRadius() const { return radius;}; //!Set the orientation of cylinder void setDirection(const Point3D &pt); //!Set the length of cylinder void setLength(float len); //!Set the color of the cylinder void setColour(float r,float g,float b,float a); //!Draw the clyinder void draw() const; //!Get the bounding box that encapuslates this object void getBoundingBox(BoundCube &b) const ; //!Recompute the internal parameters using the input vector information void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); virtual bool needsDepthSorting() const; //!Lock (or unlock) the radius to the start radius (i.e. synch the two) void lockRadii(bool doLock=true) {radiiLocked=doLock;}; }; //!Drawing mode enumeration for scalar field enum { VOLUME_POINTS=0, // Display as a 3D field of points #ifdef ENABLE_LIBVD VOLUME_RENDER_ACCUMULATE, // Display using volume rendering #endif }; //!A display list generating class /*! This class allows for the creation of display lists for openGL objects * You can use this class to create a display list which will allow you to * reference cached openGL calls already stored in the video card. * This can be used to reduce the overhead in the drawing routines */ class DrawDispList : public DrawableObj { private: //!Static variable for the next list number to generate unsigned int listNum; //!True if the list is active (collecting/accumulating) bool listActive; //!Bounding box of objects in display list BoundCube boundBox; public: //!Constructor DrawDispList(); //!Destructor virtual ~DrawDispList(); virtual unsigned int getType() const {return DRAW_TYPE_DISPLAYLIST;} //!Execute the display list void draw() const; //!Set it such that many openGL calls map to the display list. /*!If "execute" is true, the commands will be excuted after * accumulating the display list buffer * For a complete list of which calls map to the dispaly list, * see the openGL spec, "Display lists" */ bool startList(bool execute); //!Add a drawable object - list MUST be active /* If the list is not active, this will simply exectue * the draw function of the drawable */ void addDrawable(const DrawableObj *); //!Close the list - this *will* clear the gl error system bool endList(); //!Get bounding cube void getBoundingBox(BoundCube &b) const { b=boundBox;} }; //!A class to draw text obects using FTGL /*May not be the best way to do this. * MIght be better to have static instances * of each possible type of font, then * render the text appropriately */ class DrawGLText : public DrawableObj { private: //!FTGL font instance FTFont *font; //!Font string std::string fontString; //!Current font mode unsigned int curFontMode; //!Text string std::string strText; //!Origin of text Point3D origin; //!Alignment mode unsigned int alignHorizMode; unsigned int alignVertMode; //!Colours for text float r,g,b,a; //Two vectors required to define //these should always give a dot prod of //zero //!Up direction for text Point3D up; //!Text flow direction Point3D textDir; //!Direction for which text should be legible /*! This will ensure that the text is legible from * the direction being pointed to by normal. It is * not the true normal of the quad. as the origin and the * up direction specify some of that data already */ Point3D readDir; //!True if no erro bool isOK; //!Ensure that the text is never mirrored from view direction bool ensureReadFromNorm; public: //!Constructor (font file & text mode) /* Valid font types are FTGL_x where x is * BITMAP * PIXMAP * OUTLINE * POLYGON * EXTRUDE * TEXTURE */ DrawGLText(std::string fontFile, unsigned int ftglTextMode); DrawGLText(const DrawGLText &oth); //!Destructor virtual ~DrawGLText(); virtual unsigned int getType() const {return DRAW_TYPE_GLTEXT;} //!Set the size of the text (in points (which may be GL units, //unsure)) inline void setSize(unsigned int size) {if(isOK){font->FaceSize(size);}}; //!Set the depth of the text (in points, may be GL units, unsure) inline void setDepth(unsigned int depth) {if(isOK){font->Depth(depth);}}; //!Returs true if the class data is good inline bool ok() const {return isOK;}; //!Set the text string to be displayed inline void setString(const std::string &str) {strText=str;}; //!Render the text string void draw() const; //!Set the up direction for the text /*!Note that this must be orthogonal to * the reading direction */ inline void setUp(const Point3D &p) { up=p;up.normalise();}; //!Set the origin inline void setOrigin(const Point3D &p) { origin=p;}; //!Set the reading direction /*!The reading direction is the direction * from which the text should be legible * This direction is important only if ensureReadFromNorm * is set */ inline void setReadDir(const Point3D &p) { readDir=p;}; //!Set the text flow direction /*! This *must* be orthogonal to the up vector * i.e. forms a right angle with */ inline void setTextDir(const Point3D &p) {textDir=p;textDir.normalise();} //!Return the location of the lower-left of the text inline Point3D getOrigin() const {return origin;}; inline void setReadFromNorm(bool b) {ensureReadFromNorm=b;} //!Set the colour (rgba) of the object void setColour(float r,float g,float b,float a); //!Get the bounding box for the text void getBoundingBox(BoundCube &b) const; //!Set the text horiz alignment (default is left) void setHorizAlignment(unsigned int mode); //!Set the text y alignment (default is bottom) void setVertAlignment(unsigned int mode); //Binding parameter recomputation void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; class DrawGL2DText : public DrawableOverlay { private: //!FTGL font instance FTFont *font; //!Font string std::string fontString; //!Text string std::string strText; //!Alignment mode unsigned int alignHorizMode; unsigned int alignVertMode; //!Colours for text - alpha handled separately float r,g,b; //!True if no erro bool isOK; public: DrawGL2DText(const std::string &fontFile); DrawGL2DText(const DrawGL2DText &other); virtual ~DrawGL2DText(); virtual unsigned int getType() const {return DRAW_TYPE_GL2DTEXT;} //!Set the object's text string inline void setString(std::string &s) { strText=s;} //!Returs true if the class data is good inline bool ok() const {return isOK;}; inline void setText(const std::string &s) { strText =s;}; //!Set the colour (rgba) of the object void setColour(float r,float g,float b); void draw() const; void getBoundingBox(BoundCube &b) const; DrawableObj *clone() const; }; //!A class to draw rectangluar prisms class DrawRectPrism : public DrawableObj { private: //!Drawing mode, (line or surface); unsigned int drawMode; //!Colours for prism float r,g,b,a; //!Lower left and upper right of box Point3D pMin, pMax; //!Thickness of line float lineWidth; public: DrawRectPrism(); ~DrawRectPrism(); virtual unsigned int getType() const {return DRAW_TYPE_RECTPRISM;} virtual DrawableObj *clone() const; //!Draw object void draw() const; //!Set the draw mode void setDrawMode(unsigned int n) { drawMode=n;}; //!Set colour of box void setColour(float rnew, float gnew, float bnew, float anew=1.0f); //!Set thickness of box void setLineWidth(float lineWidth); //!Set up box as axis-aligned rectangle using two points void setAxisAligned(const Point3D &p1,const Point3D &p2); //!Set up box as axis-aligned rectangle using bounding box void setAxisAligned(const BoundCube &b); void getBoundingBox(BoundCube &b) const; //!Recompute the internal parameters using the input vector information void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; class DrawColourBarOverlay : public DrawableOverlay { private: FTFont *font; //!Colours for each element std::vector rgb; //!Minimum and maximum values for the colour bar (for ticks) float min,max; public: DrawColourBarOverlay(); DrawColourBarOverlay(const DrawColourBarOverlay &o); ~DrawColourBarOverlay(){delete font;}; virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_COLOURBAR;} void setColourVec(const std::vector &r, const std::vector &g, const std::vector &b); //!Draw object void draw() const; void setMinMax(float minNew,float maxNew) { min=minNew;max=maxNew;}; }; //!A class to hande textures to draw class DrawTexturedQuadOverlay : public DrawableOverlay { private: unsigned int textureId; bool textureOK; public: DrawTexturedQuadOverlay(); ~DrawTexturedQuadOverlay(); virtual unsigned int getType() const {return DRAW_TYPE_TEXTUREDOVERLAY;} static void setWindowSize(unsigned int x, unsigned int y){winX=x;winY=y;}; //!Set the texture by name bool setTexture(const char *textureFile); //!Draw object void draw() const; }; //!Multi-frame texture - Animated overlay class DrawAnimatedOverlay : public DrawableOverlay { private: //ID of the texture to use when drawing, -1 if not bound // to opengl unsigned int textureId; timeval animStartTime; bool textureOK; //Time delta before repeating animation float repeatInterval; //Time before showing the image float delayBeforeShow; //Time for fadein after show float fadeIn; protected: void getAnimationStat(float &alpha, float &deltaTime) const; public: DrawAnimatedOverlay(); ~DrawAnimatedOverlay(); virtual unsigned int getType() const {return DRAW_TYPE_ANIMATEDOVERLAY;} //Set the time between repeats for the animation void setRepeatTime(float timeV) { repeatInterval=timeV;} //Set the time before the texture appears void setShowDelayTime(float showDelayTime) { ASSERT(showDelayTime >=0.0f); delayBeforeShow = showDelayTime;} //Set the time during which the alpha value will be ramped up. // activated after the delay time (ie time before 100% visible is fadeInTime + // delayTime. void setFadeInTime(float fadeInTime) { ASSERT(fadeInTime >=0.0f); fadeIn=fadeInTime;} //!Set the texture by name bool setTexture(const std::vector &textureFiles, float timeRepeat=1.0f); void resetTime() ; //!Draw object void draw() const; bool isOK() const { return textureOK; } }; //!Draw a progress (segments with completion) overlay class DrawProgressCircleOverlay : public DrawAnimatedOverlay { //Shows the progress of K filters, each with M steps, and each // step has a (0-100) progress. Result is drawn as filled arcs. // Each filter is one arc, and this is divided into steps. // each step then fills up private: //Progress in the current step, range [0,100] unsigned int stepProgress; //Number of steps in process unsigned int maxStep; //The step that we are currently in unsigned int step; //Number of filters that are to be analysed unsigned int totalFilters; //Filter that we are analysing (0->n-1) unsigned int curFilter; vector estimatedSteps; //Draw a 2D wheel shaped section. Complete variable toggles the style of the drawing from a completed, to a n incompleted segment void drawSection(unsigned int degreeStep, float rIn, float rOut,float startTheta, float stopTheta, bool complete) const; public: DrawProgressCircleOverlay(); ~DrawProgressCircleOverlay(); void setCurFilter(unsigned int v) { curFilter= v;} void setFilterStepEstimates(const vector &v); void setMaxStep(unsigned int v) { maxStep= v;} void setNumFilters(unsigned int v) { totalFilters= v;} void setProgress(unsigned int newProg) { ASSERT(newProg <=100); stepProgress = newProg;} void setStep(unsigned int v) { ASSERT(v<=maxStep); step= v;} void reset(); static void setWindowSize(unsigned int x, unsigned int y){winX=x;winY=y;}; virtual unsigned int getType() const {return DRAW_TYPE_PROGRESSCIRCLE_OVERLAY;} void draw() const; }; class DrawPointLegendOverlay : public DrawableOverlay { private: static bool quadSet; FTFont *font; //Items to draw n overlay, and colour to use to draw std::vector > legendItems; bool enabled; public: DrawPointLegendOverlay(); ~DrawPointLegendOverlay(); DrawPointLegendOverlay(const DrawPointLegendOverlay &); DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_LEGENDOVERLAY;} void draw() const; void clear(); void addItem(const std::string &s, float r, float g, float b); }; //FIXME: Remove this. struct RGBThis { unsigned char v[3]; }; //!This class allows for the visualisation of 3D scalar fields class DrawField3D : public DrawableObj { private: mutable std::vector > ptsCache; #ifdef ENABLE_LIBVD //Volume renderer interface mutable libvdDisplay::Volume volumeRenderer; mutable bool volumeRenderCacheOK; #endif mutable bool ptsCacheOK; protected: //!Alpha transparancy of objects in field float alphaVal; //!Size of points in the field - //only meaningful if the render mode is set to alpha blended points float pointSize; //!True if the scalar field's bounding box is to be drawn bool drawBoundBox; //!Colours for the bounding boxes float boxColourR,boxColourG,boxColourB,boxColourA; //!True if volume grid is enabled bool volumeGrid; //!Colour map lower and upper bounds float colourMapBound[2]; //!Which colourmap to use unsigned int colourMapID; //!Whether we should use eg a built-in colour map, custom // or something else unsigned int colourMapMode; //!Custom colour map to use (if custom map specified) std::vector > colourMap; //!Sets the render mode for the 3D volume /* Possible modes * 0: Alpha blended points */ unsigned int volumeRenderMode; //!The scalar field - used to store data values const Voxels *field; public: //!Default Constructor DrawField3D(); //!Destructor virtual ~DrawField3D(); virtual unsigned int getType() const {return DRAW_TYPE_FIELD3D;} //!Get the bounding box for this object void getBoundingBox(BoundCube &b) const; //!Set the render mode (see volumeRenderMode variable for details) void setRenderMode(unsigned int); //!Set the field pointer void setField(const Voxels *field); //!Set the alpha value for elemnts void setAlpha(float alpha); //!SEt which type of colour map method we would like to use (none, built-in ro void setColourMapMode(unsigned int mode); //!SEt the transfer function for a custom colour map void setCustomColourMap(const std::vector > &colourMap); //!Set the colour bar minima and maxima from current field values void setColourMinMax(float minV,float maxV); //!Set the colourMap ID - only valid if using built-in colour map mode void setColourMapID(unsigned int i){ colourMapID=i;}; //!Set if we want to draw the box surrounding the volume void setDrawBox(bool doDraw) { drawBoundBox =doDraw;}; //!Render the field void draw() const; //!Set the size of points void setPointSize(float size); //!Set the colours that ar ebeing used in the tempMap void setMapColours(unsigned int map); //!Set the coour of the bounding box void setBoxColours(float r, float g, float b, float a); //!Do we need depth sorting bool needsDepthSorting() const; }; class DrawIsoSurface: public DrawableObj { private: mutable bool cacheOK; //!Isosurface scalar threshold float threshold; Voxels *voxels; mutable std::vector mesh; //!Warning. Although I declare this as const, I do some naughty mutating to the cache. void updateMesh() const; //!Point colour (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; public: DrawIsoSurface(); ~DrawIsoSurface(); virtual unsigned int getType() const {return DRAW_TYPE_ISOSURFACE;} //!Transfer ownership of data pointer to class void swapVoxels(Voxels *v); //!Set the drawing method //Draw void draw() const; //!Set the isosurface value void setScalarThresh(float thresh) { threshold=thresh;cacheOK=false;mesh.clear();}; //!Get the bouding box (of the entire scalar field) void getBoundingBox(BoundCube &b) const ; //!Sets the color of the point to be drawn void setColour(float rP, float gP, float bP, float alpha) { r=rP;g=gP;b=bP;a=alpha;} ; //!Do we need depth sorting? bool needsDepthSorting() const; }; class DrawAxis : public DrawableObj { private: //!Drawing style unsigned int style; Point3D position; //!size float size; public: DrawAxis(); ~DrawAxis(); virtual unsigned int getType() const {return DRAW_TYPE_AXIS;} virtual DrawableObj *clone() const; //!Draw object void draw() const; void setStyle(unsigned int style); void setSize(float newSize); void setPosition(const Point3D &p); void getBoundingBox(BoundCube &b) const; }; //Draw a 2D filled circle class Draw2DCircle : public DrawableObj { private: float centre[2]; float angularStep; float radius; //Circle colour float r,g,b; //Should the circle be drawn as an outline, or as a filled object bool filled; public: Draw2DCircle(); void result() const; //Obtain the type mask for this drawable virtual unsigned int getType() const; virtual DrawableObj *clone() const; virtual void getBoundingBox(BoundCube &b) const; virtual void draw() const; void setCentre(float fx,float fy) { centre[0] = fx; centre[1]= fy;}; void setRadius(float rad) { radius=rad;} //Angular step in radiians void setAngularStep(float da) { angularStep = da;}; void setColour(float rP, float gP, float bP) { r=rP;g=gP;b=bP;} ; }; #endif 3Depict-0.0.22/src/gl/cameras.cpp0000644000175000017500000005655613414250067016005 0ustar pcuserpcuser/* * cameras.cpp - opengl camera implementations * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "cameras.h" #include "common/xmlHelper.h" #include "common/stringFuncs.h" #include "common/constants.h" //MacOS is "special" and puts it elsewhere #ifdef __APPLE__ #include #else #include #endif #include "common/translation.h" #include "glDebug.h" #include #include using std::cerr; using std::endl; using std::string; //TODO: FIXME: Orthogonal camera zooming is very slow, compared to // perspective camera dolly. Check equations of motion for equivalence const float ORTHO_SPEED_HACK=1.05; Camera::Camera() : lock(false),origin(0.0f,0.0f,0.0f), viewDirection(0.0f,0.0f,-1.0f), upDirection(0.0f,0.0f,1.0f), orthoScale(1) { } Camera::~Camera() = default; Point3D Camera::getOrigin() const { return origin; } Point3D Camera::getViewDirection() const { return viewDirection; } Point3D Camera::getUpDirection() const { return upDirection; } void Camera::setOrigin(const Point3D &pt) { if(lock) return; origin=pt; } void Camera::setViewDirection(const Point3D &pt) { if(lock) return; viewDirection=pt; viewDirection.normalise(); } void Camera::setUpDirection(const Point3D &pt) { if(lock) return; upDirection = pt; upDirection.normalise(); } void Camera::forwardsDolly(float moveRate) { if(lock) return; origin=origin+ viewDirection*moveRate; } void Camera::move(float moveLR, float moveUD) { if(lock) return; //Right is the cross product of up and //view direction (check sign) //Up is simply the up vector origin+=upDirection*moveUD + (upDirection.crossProd(viewDirection))*moveLR; } void Camera::translate(float moveLR, float moveUD) { if(lock) return; //This camera has no target. Just do plain move move(moveLR,moveUD); } void Camera::pivot(float lrRad, float udRad) { if(lock) return; Point3f viewNew, rotateAxis; //rotate normalised rOrig around axis one then two viewNew.fx=viewDirection[0]; viewNew.fy=viewDirection[1]; viewNew.fz=viewDirection[2]; //rotate around "right" axis Point3D tmp = upDirection.crossProd(viewDirection); rotateAxis.fx=tmp[0]; rotateAxis.fy=tmp[1]; rotateAxis.fz=tmp[2]; quat_rot(&viewNew,&rotateAxis,udRad); //rotate around original "up" axis rotateAxis.fx=upDirection[0]; rotateAxis.fy=upDirection[1]; rotateAxis.fz=upDirection[2]; quat_rot(&viewNew,&rotateAxis,lrRad); viewDirection[0] = rotateAxis.fx; viewDirection[1] = rotateAxis.fy; viewDirection[2] = rotateAxis.fz; } //===== //===== CameraLookAt::CameraLookAt() : target(Point3D(0,0,0)),fovAngle(90.0f), nearPlane(1.0f), frustumDistortion(0.0f) { origin=Point3D(0.0f,0.0f,1.0f); viewDirection=Point3D(0.0f,0.0f,-1.0f); upDirection=Point3D(0.0f,1.0f,0.0f); typeNum=CAM_LOOKAT; projectionMode=PROJECTION_MODE_PERSPECTIVE; } Camera *CameraLookAt::clone() const { auto retCam = new CameraLookAt; retCam->origin =origin; retCam->viewDirection=viewDirection; retCam->upDirection =upDirection; retCam->projectionMode=projectionMode; retCam->orthoScale=orthoScale; retCam->typeNum=typeNum; retCam->userString=userString; retCam->lock=lock; retCam->target = target; retCam->fovAngle = fovAngle; retCam->nearPlane=nearPlane; retCam->farPlane=farPlane; return retCam; } CameraLookAt::~CameraLookAt() = default; void CameraLookAt::setTarget(const Point3D &pt) { ASSERT(pt.sqrDist(origin)>10.0f*std::numeric_limits::epsilon()); target=pt; recomputeViewDirection(); } Point3D CameraLookAt::getTarget() const { return target; } void CameraLookAt::setOrigin(const Point3D &newOrigin) { if(lock) return; ASSERT(newOrigin.sqrDist(target)>std::numeric_limits::epsilon()); origin=newOrigin; recomputeViewDirection(); } void CameraLookAt::apply(float aspect, const BoundCube &bc, bool loadIdentity) const { glMatrixMode (GL_PROJECTION); if(loadIdentity) glLoadIdentity(); farPlane = 1.5*bc.getMaxDistanceToBox(origin); switch(projectionMode) { case PROJECTION_MODE_PERSPECTIVE: { gluPerspective(fovAngle/2.0,aspect,nearPlane,farPlane); glMatrixMode(GL_MODELVIEW); break; } case PROJECTION_MODE_ORTHOGONAL: { glOrtho(-orthoScale*aspect,orthoScale*aspect,-orthoScale,orthoScale,nearPlane,farPlane); glMatrixMode(GL_MODELVIEW); break; } default: ASSERT(false); } ASSERT(origin.sqrDist(target)>std::numeric_limits::epsilon()); if(loadIdentity) glLoadIdentity(); lookAt(); } void CameraLookAt::lookAt() const { //This check should be valid, but it causes problems at startup on Wine, // for which I cannot track down the cause #if defined(DEBUG) && !(defined(__WIN32__) || defined(__WIN64__)) GLint mode; glGetIntegerv( GL_MATRIX_MODE, &mode); ASSERT(mode == GL_MODELVIEW || mode == GL_MODELVIEW_MATRIX); #endif //Set up the "look-at" matrix onto the current matrix mode. // this causes the camera to gluLookAt(origin[0],origin[1],origin[2], target[0],target[1],target[2], upDirection[0],upDirection[1],upDirection[2]); } void CameraLookAt::translate(float moveLR, float moveUD) { if(lock) return; float fovMultiplier=1.0f; if(projectionMode== PROJECTION_MODE_PERSPECTIVE) { //Try to move such that the target sweeps our field of view //at a constant rate. Standard normaliser is view length at //a 90* camera //Use tan.. to normalise motion rate //Prevent numerical error near tan( 90*) if(fovAngle < 175.0f) fovMultiplier = tan(fovAngle/2.0*M_PI/180.0); else fovMultiplier = tan(175.0f/2.0*M_PI/180.0); } moveLR=moveLR*sqrtf(target.sqrDist(origin)*fovMultiplier); moveUD=moveUD*sqrtf(target.sqrDist(origin)*fovMultiplier); origin+=upDirection*moveUD + (upDirection.crossProd(viewDirection))*moveLR; target+=upDirection*moveUD + (upDirection.crossProd(viewDirection))*moveLR; } void CameraLookAt::forwardsDolly(float moveRate) { if(lock) return; if(projectionMode == PROJECTION_MODE_PERSPECTIVE) { Point3D newOrigin; //Prevent camera orientation inversion, which occurs when moving past the target if(moveRate > sqrt(target.sqrDist(origin))) { if((target-origin).sqrMag() < sqrtf(std::numeric_limits::epsilon())) return; //Yes, this simplifies analytically. However i think the numerics come into play. float moveInv = 1.0/(fabs(moveRate) + std::numeric_limits::epsilon()); newOrigin=origin+viewDirection*moveInv/(1.0+moveInv); } else { //scale moverate by orbit distance moveRate = moveRate*sqrtf(target.sqrDist(origin)); newOrigin=origin+viewDirection*moveRate; } //Only accept origin change if it is sufficiently far from the target if(newOrigin.sqrDist(target)>sqrtf(std::numeric_limits::epsilon())) origin=newOrigin; } else { float deltaSqr; deltaSqr = (target-origin).sqrMag(); if(deltaSqr< sqrtf(std::numeric_limits::epsilon())) return; Point3D virtualOrigin; virtualOrigin = origin+viewDirection*moveRate; float factor; factor = virtualOrigin.sqrDist(target)/deltaSqr; if( factor > 1.0) factor*=ORTHO_SPEED_HACK; else factor/=ORTHO_SPEED_HACK; orthoScale*=factor; } } //Clockwise roll looking from camera view by rollRad radians void CameraLookAt::roll(float rollRad) { if(lock) return; Point3f rNew,rotateAxis; rotateAxis.fx=viewDirection[0]; rotateAxis.fy=viewDirection[1]; rotateAxis.fz=viewDirection[2]; rNew.fx=upDirection[0]; rNew.fy=upDirection[1]; rNew.fz=upDirection[2]; quat_rot(&rNew,&rotateAxis,rollRad); upDirection=Point3D(rNew.fx,rNew.fy,rNew.fz); recomputeUpDirection(); } void CameraLookAt::pivot(float leftRightRad,float updownRad) { if(lock) return; Point3f rNew,rotateAxis; Point3D tmp; //rotate normalised rOrig around axis one then two tmp=target-origin; rNew.fx=tmp[0]; rNew.fy=tmp[1]; rNew.fz=tmp[2]; //rotate around "right" axis tmp = upDirection.crossProd(viewDirection); tmp.normalise(); rotateAxis.fx=tmp[0]; rotateAxis.fy=tmp[1]; rotateAxis.fz=tmp[2]; quat_rot(&rNew,&rotateAxis,updownRad); Point3D newDir; newDir=Point3D(rNew.fx,rNew.fy,rNew.fz)+origin; //rotate around original "up" axis rotateAxis.fx=upDirection[0]; rotateAxis.fy=upDirection[1]; rotateAxis.fz=upDirection[2]; quat_rot(&rNew,&rotateAxis,leftRightRad); newDir+= Point3D(rNew.fx,rNew.fy,rNew.fz); target = target+newDir; target.normalise(); target*=sqrtf((target).sqrDist(origin)); recomputeViewDirection(); recomputeUpDirection(); } //Make a given bounding box visible, as much as possible void CameraLookAt::ensureVisible(const BoundCube &boundCube, unsigned int face) { if(lock) return; //To make the camera visible, we must place the camera //outside the box, on the correct face, //at sufficient distance to ensure that the face closest //to the box is visible at the current FOV. //Box centroid Point3D boxCentroid = boundCube.getCentroid(); //Vector from box face to camera Point3D faceOutVector, tmpUpVec; //I labelled a physical box to work this table out. float boxToFrontDist,faceSize[2]; switch(face) { case CAMERA_DIR_ZPLUS: faceOutVector = Point3D(0,0,1); boxToFrontDist=boundCube.getSize(2); tmpUpVec = Point3D(0,1,0); faceSize[0]=boundCube.getSize(0); faceSize[1]=boundCube.getSize(1); break; case CAMERA_DIR_YMINUS: faceOutVector = Point3D(0,-1,0); boxToFrontDist=boundCube.getSize(1); tmpUpVec = Point3D(1,0,0); faceSize[0]=boundCube.getSize(1); faceSize[1]=boundCube.getSize(0); break; case CAMERA_DIR_XPLUS: faceOutVector = Point3D(1,0,0); boxToFrontDist=boundCube.getSize(0); tmpUpVec = Point3D(0,0,1); faceSize[0]=boundCube.getSize(1); faceSize[1]=boundCube.getSize(2); break; case CAMERA_DIR_YPLUS: faceOutVector = Point3D(0,1,0); boxToFrontDist=boundCube.getSize(1); tmpUpVec =Point3D(1,0,0); faceSize[0]=boundCube.getSize(0); faceSize[1]=boundCube.getSize(2); break; case CAMERA_DIR_ZMINUS: faceOutVector = Point3D(0,0,-1); boxToFrontDist=boundCube.getSize(2); tmpUpVec = Point3D(0,1,0); faceSize[0]=boundCube.getSize(0); faceSize[1]=boundCube.getSize(1); break; case CAMERA_DIR_XMINUS: faceOutVector = Point3D(-1,0,0); boxToFrontDist=boundCube.getSize(0); tmpUpVec = Point3D(0,0,1); faceSize[0]=boundCube.getSize(1); faceSize[1]=boundCube.getSize(2); break; default: ASSERT(false); } //Convert box to front distance to vector from //centroid to front face. boxToFrontDist/=2.0f; float halfMaxFaceDim=std::max(faceSize[0],faceSize[1])/2.0; ASSERT(fovAngle > 0); //Set camera target to inside box target=boxCentroid; float outDistance; if(projectionMode == PROJECTION_MODE_PERSPECTIVE) { //Minimal camera distance is given trigonometrically. //Add additional 1 to ensure that nearplane does not clip object outDistance=1.0+boxToFrontDist+halfMaxFaceDim/tan((fovAngle*M_PI/180)/2.0f); } else { outDistance=boxToFrontDist+halfMaxFaceDim; } //Multiply by 1.4 to give a bit of border. origin=boxCentroid+faceOutVector*1.4*outDistance; orthoScale = sqrtf(target.sqrDist(origin))/2.0; //Set the default up direction upDirection=tmpUpVec; //Reset the view direction recomputeViewDirection(); //Ensure up direction orthogonal recomputeUpDirection(); nearPlane = 1; } void CameraLookAt::recomputeViewDirection() { viewDirection=origin-target; viewDirection.normalise(); } void CameraLookAt::recomputeUpDirection() { //Use cross product of view and up to generate an across vector. Point3D across; upDirection.normalise(); across = viewDirection.crossProd(upDirection); across.normalise(); //Regenerate up vector by reversing the cross with a normalised across vector upDirection = across.crossProd(viewDirection); upDirection.normalise(); } void CameraLookAt::move(float moveLRAngle, float moveUDAngle) { if(lock) return; //Think of the camera as moving around the surface of a sphere Point3f curOrig; curOrig.fx = origin[0] - target[0]; curOrig.fy = origin[1] - target[1]; curOrig.fz = origin[2] - target[2]; //Perform "up" rotation Point3D rotateAxis; rotateAxis=upDirection; Point3f r,u; r.fx = rotateAxis[0]; r.fy = rotateAxis[1]; r.fz = rotateAxis[2]; u.fx = upDirection[0]; u.fy = upDirection[1]; u.fz = upDirection[2]; //Perform quaternion rotation around this axis quat_rot(&curOrig,&r, moveLRAngle); quat_rot(&curOrig,&u, moveLRAngle); recomputeViewDirection(); //Perform across rotation rotateAxis =upDirection.crossProd(viewDirection).normalise(); r.fx = rotateAxis[0]; r.fy = rotateAxis[1]; r.fz = rotateAxis[2]; quat_rot(&curOrig,&r, moveUDAngle); //Get transformed coordinates origin[0] = target[0] + curOrig.fx; origin[1] = target[1] + curOrig.fy; origin[2] = target[2] + curOrig.fz; recomputeViewDirection(); } void CameraLookAt::getProperties(CameraProperties &p) const { p.clear(); CameraProperty cp; p.addGroup(); cp.name=TRANS("Lock"); cp.data=boolStrEnc(lock); cp.type=PROPERTY_TYPE_BOOL; cp.key=CAMERA_KEY_LOOKAT_LOCK; p.addEntry(cp); //Add origin cp.name=TRANS("Origin"); stream_cast(cp.data,origin); cp.type=PROPERTY_TYPE_POINT3D; cp.key=CAMERA_KEY_LOOKAT_ORIGIN; p.addEntry(cp); //Add came target pt stream_cast(cp.data,target); cp.name=TRANS("Target"); cp.type=PROPERTY_TYPE_POINT3D; cp.key=CAMERA_KEY_LOOKAT_TARGET; p.addEntry(cp); stream_cast(cp.data,upDirection); cp.name=TRANS("Up Dir."); cp.type=PROPERTY_TYPE_POINT3D; cp.key=CAMERA_KEY_LOOKAT_UPDIRECTION; p.addEntry(cp); //add camera projection options std::vector > choices; string tmp; tmp=TRANS("Perspective"); choices.emplace_back((unsigned int)PROJECTION_MODE_PERSPECTIVE,tmp); tmp=TRANS("Orthogonal"); choices.emplace_back((unsigned int)PROJECTION_MODE_ORTHOGONAL,tmp); cp.data=choiceString(choices,projectionMode); cp.name=TRANS("Projection"); cp.type=PROPERTY_TYPE_CHOICE; cp.key=CAMERA_KEY_LOOKAT_PROJECTIONMODE; p.addEntry(cp); switch(projectionMode) { case PROJECTION_MODE_PERSPECTIVE: stream_cast(cp.data,fovAngle); cp.name=TRANS("Field of View (deg)"); cp.type=PROPERTY_TYPE_REAL; cp.key=CAMERA_KEY_LOOKAT_FOV; break; case PROJECTION_MODE_ORTHOGONAL: stream_cast(cp.data,orthoScale); cp.name=TRANS("View size"); cp.type=PROPERTY_TYPE_REAL; cp.key=CAMERA_KEY_LOOKAT_ORTHOSCALE; break; default: ASSERT(false); } p.addEntry(cp); } bool CameraLookAt::setProperty(unsigned int key, const string &value) { switch(key) { case CAMERA_KEY_LOOKAT_LOCK: { if(value == "1") lock=true; else if (value == "0") lock=false; else return false; break; } case CAMERA_KEY_LOOKAT_ORIGIN: { Point3D newPt; if(!newPt.parse(value)) return false; //Disallow origin to be set to same as target if(newPt.sqrDist(target) < sqrtf(std::numeric_limits::epsilon())) return false; origin= newPt; break; } case CAMERA_KEY_LOOKAT_TARGET: { Point3D newPt; if(!newPt.parse(value)) return false; //Disallow origin to be set to same as target if(newPt.sqrDist(origin) < sqrtf(std::numeric_limits::epsilon())) return false; target = newPt; break; } case CAMERA_KEY_LOOKAT_UPDIRECTION: { Point3D newDir; if(!newDir.parse(value)) return false; //View direction and up direction may not be the same if(viewDirection.crossProd(newDir).sqrMag() < sqrtf(std::numeric_limits::epsilon())) return false; upDirection=newDir; //Internal up direction should be perp. to view direction. //use double cross product method to restore recomputeUpDirection(); break; } case CAMERA_KEY_LOOKAT_FOV: { float newFOV; if(stream_cast(newFOV,value)) return false; fovAngle=newFOV; break; } case CAMERA_KEY_LOOKAT_PROJECTIONMODE: { size_t ltmp; if(value == TRANS("Perspective")) ltmp=PROJECTION_MODE_PERSPECTIVE; else if( value == TRANS("Orthogonal")) { if(projectionMode!=PROJECTION_MODE_ORTHOGONAL) { //use the distance to the target as the orthographic //scaling size (size of parallel frustrum) orthoScale=sqrtf(target.sqrDist(origin)); } ltmp=PROJECTION_MODE_ORTHOGONAL; } else { ASSERT(false); return false; } projectionMode=ltmp; break; } case CAMERA_KEY_LOOKAT_ORTHOSCALE: { float newOrthoScale; if(stream_cast(newOrthoScale,value)) return false; orthoScale=newOrthoScale; break; } default: ASSERT(false); } return true; } bool CameraLookAt::writeState(std::ostream &f, unsigned int format, unsigned int nTabs) const { switch(format) { case STATE_FORMAT_XML: { using std::endl; //COMPAT_BREAK: "Persplookat" is f << tabs(nTabs) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; if(lock) f<< tabs(nTabs+1) << "" << endl; else f<< tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f<< tabs(nTabs+1) << "" << endl; f<< tabs(nTabs+1) << "" << endl; f << tabs(nTabs) << "" << endl; break; } default: ASSERT(false); } return true; } bool CameraLookAt::readState(xmlNodePtr nodePtr) { //Retrieve user string if(!XMLGetNextElemAttrib(nodePtr,userString,"userstring","value")) userString=""; std::string tmpStr; //Retrieve projection mode if(!XMLGetNextElemAttrib(nodePtr,projectionMode,"projectionmode","value")) return false; if(projectionMode > PROJECTION_MODE_ENUM_END) return false; //Retrieve orthographic scaling if(!XMLGetNextElemAttrib(nodePtr,orthoScale,"orthoscale","value")) return false; if(orthoScale <=0 || std::isnan(orthoScale)) { orthoScale=1.0f; } float x,y,z; xmlChar *xmlString; //retrieve lock state if(XMLHelpFwdToElem(nodePtr,"lock")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); std::string strTmp; strTmp=(char*)xmlString; if(strTmp == "1") lock=true; else if(strTmp == "0") lock=false; else return false; xmlFree(xmlString); //Retrieve origin //==== if(XMLHelpFwdToElem(nodePtr,"origin")) return false; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; origin=Point3D(x,y,z); //==== //Retrieve target //==== if(XMLHelpFwdToElem(nodePtr,"target")) return false; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; target=Point3D(x,y,z); //==== //Retrieve up direction //==== if(XMLHelpFwdToElem(nodePtr,"updirection")) return false; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; upDirection=Point3D(x,y,z); //==== //Get the FOV angle //==== if(!XMLGetNextElemAttrib(nodePtr,fovAngle,"fovangle","value")) return false; if(fovAngle<=0) return false; //==== //Get the near plane //==== if(!XMLGetNextElemAttrib(nodePtr,nearPlane,"nearplane","value")) return false; //==== recomputeViewDirection(); return true; } float CameraLookAt::getViewWidth(float depth) const { if(projectionMode == PROJECTION_MODE_PERSPECTIVE) return depth*tan(fovAngle/2.0f*M_PI/180.0); else if(projectionMode == PROJECTION_MODE_ORTHOGONAL) return -orthoScale*2.0f; //FIXME: Why is this negative??! ASSERT(false); } void CameraLookAt::repositionAroundTarget(unsigned int direction) { //Try to reposition the camera around the target float distance = sqrt(origin.sqrDist(target)); Point3D faceOutVector; switch(direction) { case CAMERA_DIR_XPLUS: faceOutVector = Point3D(1,0,0); break; case CAMERA_DIR_XMINUS: faceOutVector = Point3D(-1,0,0); break; case CAMERA_DIR_YPLUS: faceOutVector = Point3D(0,1,0); break; case CAMERA_DIR_YMINUS: faceOutVector = Point3D(0,-1,0); break; case CAMERA_DIR_ZPLUS: faceOutVector = Point3D(0,0,1); break; case CAMERA_DIR_ZMINUS: faceOutVector = Point3D(0,0,-1); break; default: ASSERT(false); } faceOutVector*=distance; setOrigin(target+faceOutVector); } std::ostream& operator<<(std::ostream &strm, const Camera &c) { strm << "origin: " << c.origin << std::endl; strm << "View Direction: " << c.viewDirection << std::endl; strm << "Up Direction: "<< c.upDirection << std::endl; return strm; } std::ostream& operator<<(std::ostream &strm, const CameraLookAt &c) { strm << "origin: " << c.origin << std::endl; strm << "Target : " << c.target << std::endl; strm << "View Direction: " << c.viewDirection << std::endl; strm << "Up Direction: "<< c.upDirection << std::endl; strm << "FOV (deg) : " << c.fovAngle << std::endl; strm << "Clip planes: " << c.nearPlane << " (near) " << std::endl; return strm; } 3Depict-0.0.22/src/gl/tr.h0000644000175000017500000000777112354012467014461 0ustar pcuserpcuser/* $Id: tr.h,v 1.5 1997/07/21 17:34:07 brianp Exp $ */ /* TR Tile rendering library Copyright (C) 1997 Brian Paul This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* * $Log: tr.h,v $ * Revision 1.5 1997/07/21 17:34:07 brianp * added tile borders, incremented version to 1.1 * * Revision 1.4 1997/07/21 15:47:35 brianp * renamed all "near" and "far" variables * * Revision 1.3 1997/04/26 21:23:25 brianp * added trRasterPos3f function * * Revision 1.2 1997/04/19 23:26:10 brianp * many API changes * * Revision 1.1 1997/04/18 21:53:05 brianp * Initial revision * */ /* * Tiled Rendering library * Version 1.1 * Copyright (C) Brian Paul * * * This library allows one to render arbitrarily large images with OpenGL. * The basic idea is to break the image into tiles which are rendered one * at a time. The tiles are assembled together to form the final, large * image. Tiles and images can be of any size. * * Basic usage: * * 1. Allocate a tile rendering context: * TRcontext t = trNew(); * * 2. Specify the final image buffer and tile size: * GLubyte image[W][H][4] * trImageSize(t, W, H); * trImageBuffer(t, GL_RGBA, GL_UNSIGNED_BYTE, (GLubyte *) image); * * 3. Setup your projection: * trFrustum(t, left, right, bottom top, near, far); * or * trOrtho(t, left, right, bottom top, near, far); * or * trPerspective(t, fovy, aspect, near, far); * * 4. Render the tiles: * do { * trBeginTile(t); * DrawMyScene(); * } while (trEndTile(t)); * * You provide the DrawMyScene() function which calls glClear() and * draws all your stuff. * * 5. The image array is now complete. Display it, write it to a file, etc. * * 6. Delete the tile rendering context when finished: * trDelete(t); * */ #ifndef TR_H #define TR_H #ifdef __APPLE__ #include #else #include #endif typedef struct _TRctx TRcontext; typedef enum { TR_TILE_WIDTH = 100, TR_TILE_HEIGHT, TR_TILE_BORDER, TR_IMAGE_WIDTH, TR_IMAGE_HEIGHT, TR_ROWS, TR_COLUMNS, TR_CURRENT_ROW, TR_CURRENT_COLUMN, TR_CURRENT_TILE_WIDTH, TR_CURRENT_TILE_HEIGHT, TR_ROW_ORDER, TR_TOP_TO_BOTTOM, TR_BOTTOM_TO_TOP } TRenum; extern TRcontext *trNew(void); extern void trDelete(TRcontext *tr); extern void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border); extern void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trImageSize(TRcontext *tr, GLint width, GLint height); extern void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trRowOrder(TRcontext *tr, TRenum order); extern GLint trGet(TRcontext *tr, TRenum param); extern void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ); extern void trBeginTile(TRcontext *tr); //Returns zero if this was the last tile. extern int trEndTile(TRcontext *tr); extern void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z); #endif 3Depict-0.0.22/src/gl/cameras.h0000644000175000017500000002024413305612110015421 0ustar pcuserpcuser/* * cameras.h - 3D cameras for opengl * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef CAMERAS_H #define CAMERAS_H #include "common/basics.h" //libxml2 headers #ifdef ATTRIBUTE_PRINTF #pragma push_macro("ATTRIBUTE_PRINTF") #include #pragma pop_macro(" ATTRIBUTE_PRINTF") #else #include #undef ATTRIBUTE_PRINTF #endif enum CAM_ENUM { CAM_FREE=1, CAM_LOOKAT }; enum { PROJECTION_MODE_PERSPECTIVE, PROJECTION_MODE_ORTHOGONAL, PROJECTION_MODE_ENUM_END //not a valid mode. }; //!Key types for property setting and getting properties enum { CAMERA_KEY_LOOKAT_LOCK, CAMERA_KEY_LOOKAT_ORIGIN, CAMERA_KEY_LOOKAT_TARGET, CAMERA_KEY_LOOKAT_UPDIRECTION, CAMERA_KEY_LOOKAT_FOV, CAMERA_KEY_LOOKAT_PROJECTIONMODE, CAMERA_KEY_LOOKAT_ORTHOSCALE }; //visible direction enum //Face is defined by the following net // 0 ^ z+ // 1 2 3 | // 4 ---> y+ // 5 //2 is the face directed to the +ve x axis, //with the "up"" vector on the 3 aligned to z, //so "0" is parallel to the Z axis and is "visible" //from the top +ve side of the z axis (at sufficient distance) enum { CAMERA_DIR_ZPLUS, //0 CAMERA_DIR_YMINUS, //1 CAMERA_DIR_XPLUS, //2 CAMERA_DIR_YPLUS, //3 CAMERA_DIR_ZMINUS, //4 CAMERA_DIR_XMINUS, //5 }; class CameraProperty { public: unsigned int type; unsigned int key; std::string data; std::string name; }; class CameraProperties { public: std::vector > props; void clear() { props.clear();}; void addGroup() {props.resize(props.size()+1);} void addEntry(CameraProperty &p) { ASSERT(props.size()); props.back().push_back(p);} }; //!An abstract base class for a camera class Camera { protected: bool lock; //!Camera location Point3D origin; //!Direction camera is looking in Point3D viewDirection; //!Up direction for camera (required to work out "roll") Point3D upDirection; //!Projection mode (otho, perspective...)_ unsigned int projectionMode; //!The current orthographic scaling float orthoScale; //!Type number unsigned int typeNum; //!user string, e.g. camera name std::string userString; public: //!constructor Camera(); //!Destructor virtual ~Camera(); //!Duplication routine. Must delete returned pointer manually. virtual Camera *clone() const=0; //!Streaming output operator, presents human readable text friend std::ostream &operator<<(std::ostream &stream, const Camera &); //!Return the origin of the camera Point3D getOrigin() const; //!Return the view direction for the camera Point3D getViewDirection() const; //!Return the up direction for the camera Point3D getUpDirection() const; //!return the projection mode unsigned int getProjectionMode() const{ return projectionMode;}; float getOrthoScale() const { return orthoScale; } //!Set the camera's position virtual void setOrigin(const Point3D &); //!set the direction that the camera looks towards void setViewDirection(const Point3D &); //!set the direction that the camera considers "up" void setUpDirection(const Point3D &); //!Set the user string void setUserString(const std::string &newString){ userString=newString;}; //!Get the user string std::string getUserString() const { return userString;}; //!Do a forwards "dolly",where the camera moves along its viewing axis. In ortho mode, instead of moving along axis, a scaling is performed virtual void forwardsDolly(float dollyAmount); //!Move the camera origin virtual void move(float leftRightAmount,float UpDownAmount); //!Move the camera origin virtual void translate(float leftRightAmount,float UpDownAmount); //!pivot the camera /* First pivots the camera around the across direction * second pivot sthe camera around the up direction */ virtual void pivot(float rollAroundAcross, float rollaroundUp); //!Roll around the view direction virtual void roll(float roll) =0; //!Applies the camera settings to openGL. Ensures the far planes //is set to make the whole scene visible virtual void apply(float outputRatio,const BoundCube &b,bool loadIdentity=true) const=0; //!Ensures that the given boundingbox should look nice, and be visible virtual void ensureVisible(const BoundCube &b, unsigned int face=3)=0; //!Obtain the properties specific to a camera virtual void getProperties(CameraProperties &p) const =0; //!Set the camera property from a key & string pair virtual bool setProperty(unsigned int key, const std::string &value) =0; unsigned int type() const {return typeNum;}; //!Write the state of the camera virtual bool writeState(std::ostream &f, unsigned int format, unsigned int tabs) const =0; //!Read the state of the camera from XML document virtual bool readState(xmlNodePtr nodePtr)=0; }; //!A perspective camera that looks at a specific location class CameraLookAt : public Camera { protected: //!Location for camera to look at Point3D target; void recomputeViewDirection(); //!Perspective FOV float fovAngle; //!Near clipping plane distance. float nearPlane; //!Far plane is computed on-the-fly. cannot be set directly. Oh no! mutable. gross! mutable float farPlane; //!Distort to the viewing frustum. (eg for stero) ( a frustum is a rectangular pyramid with the top cut off) float frustumDistortion; public: //!Constructor CameraLookAt(); //!Streaming output operator, presents human readable text friend std::ostream &operator<<(std::ostream &stream, const CameraLookAt &); //!clone function Camera *clone() const; //!Destructor virtual ~CameraLookAt(); //!Set the look at target void setOrigin(const Point3D &); //!Set the look at target void setTarget(const Point3D &); //!Get the look at target Point3D getTarget() const; //!Get the camera's FOV angle (full angle across) float getFOV() const {return fovAngle;} float getNearPlane() const { return nearPlane; } //!Applies the view transform void apply(float outAspect, const BoundCube &boundCube,bool loadIdentity=true) const; //!Only apply the look-at opengl transform void lookAt() const; //!Do a forwards "dolly",where the camera moves along its viewing axis void forwardsDolly(float dollyAmount); //!Move the camera origin void move(float leftRightAmount,float UpDownAmount); //!Simulate pivot of camera /* Actually I pivot by moving the target internally. */ void pivot(float lrRad,float udRad); void translate(float lrTrans, float udTrans); //Clockwise roll looking from camera view by rollRad radians void roll(float rollRad); //!Ensure that up direction is perpendicular to view direction void recomputeUpDirection(); void repositionAroundTarget(unsigned int direction); //!Ensure that the box is visible /*! Face is set by cube net 0 1 2 3 4 5 2 is the face directed to the +ve x axis, with the "up"" vector on the 3 aligned to z, so "0" is perpendicular to the Z axis and is "visible" */ virtual void ensureVisible(const BoundCube &b, unsigned int face=3); //!Return the user-settable properties of the camera void getProperties(CameraProperties &p) const; //!Set the camera property from a key & string pair bool setProperty(unsigned int key, const std::string &value); //!Write the state of the camera bool writeState(std::ostream &f, unsigned int format, unsigned int tabs=0) const; //!Read the state of the camera bool readState(xmlNodePtr nodePtr) ; float getViewWidth(float depth) const; void setFrustumDistort(float offset){frustumDistortion=offset;}; }; #endif 3Depict-0.0.22/src/gl/scene.cpp0000644000175000017500000006546613414250067015467 0ustar pcuserpcuser/* * scene.cpp - OpenGL 3D static scene implementation * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #if defined(WIN32) || defined(WIN64) #include #endif #include "scene.h" #include "./backend/viscontrol.h" #include "./backend/filter.h" using std::vector; using std::string; //Animation progress texture information const unsigned int ANIMATE_PROGRESS_NUMFRAMES=3; const char ANIMATE_PROGRESS_BASENAME[] = { "textures/animProgress"}; Scene::Scene() : tempCam(nullptr), cameraSet(true), outWinAspect(1.0f), noticeText(getDefaultFontFile()) { MESSAGE("Scene Constructor"); glewInited=false; visControl=nullptr; lastHovered=lastSelected=(unsigned int)(-1); lockInteract=false; hoverMode=selectionMode=false; useAlpha=true; useLighting=true; useEffects=false; showAxis=true; attemptedLoadProgressAnim=false; witholdCamUpdate=false; //default to black rBack=gBack=bBack=0.0f; activeCam = new CameraLookAt; lightPosition[0]= 1.0; lightPosition[1]= 1.0; lightPosition[2]= 1.0; lightPosition[3]=0.0; lastMessageTime.tv_sec=lastMessageTime.tv_usec=0; noticeText.setPosition(0.02,0.95); noticeText.setSize(0.015); DrawableObj::setTexPool(new TexturePool); } Scene::~Scene() { clearAll(); DrawableObj::clearTexPool(); delete activeCam; } unsigned int Scene::initDraw() { //Initialise GLEW #if defined(WIN32) || defined(WIN64) if(!glewInited) { unsigned int errCode; errCode=glewInit(); if(errCode!= GLEW_OK) { cerr << "Opengl context could not be created, aborting." << endl; cerr << "Glew reports:" << glewGetErrorString(errCode) << endl; //Blow up without opengl exit(1); } glewInited=true; } #endif glClearColor( rBack, gBack, bBack,1.0f ); glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glColorMaterial ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ) ; glEnable(GL_POINT_SMOOTH); glEnable(GL_LINE_SMOOTH); //Will it blend? That is the question... // let the objects know about this, so they // can pick the right algorithm DrawableObj::setUseAlphaBlending(useAlpha); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); if(useAlpha) glEnable(GL_BLEND); else glDisable(GL_BLEND); glDisable(GL_LIGHTING); glEnable(GL_LIGHT0); glShadeModel(GL_SMOOTH); //Set up the scene lights //== //Set up default lighting const float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; const float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); // The direction the light shines in glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); //== //Use the active if set if(cameraSet) { if(!boundCube.isValid()) computeSceneLimits(); } //Attempt to load the progress animation, if we have not tried before if(!attemptedLoadProgressAnim) { attemptedLoadProgressAnim=true; //Load the animation textures vector animFiles; animFiles.resize(ANIMATE_PROGRESS_NUMFRAMES); string animFilename,tmpStr; for(size_t ui=0;uinumPassesNeeded()); } return passes; } bool Scene::hasOverlays() const { for(auto object : objects) { if(object->isOverlay()) return true; } for(auto refObject : refObjects) { if(refObject->isOverlay()) return true; } return false; } void Scene::updateCam(const Camera *camToUse, bool useIdent=true) const { Point3D lightNormal; camToUse->apply(outWinAspect,boundCube,useIdent); lightNormal=camToUse->getViewDirection(); glNormal3f(lightNormal[0],lightNormal[1],lightNormal[2]); } void Scene::updateProgressOverlay() { const float xPos= 0.85*winX; const float yPos=0.85*winY; progressAnimTex.setPosition(xPos,yPos); progressAnimTex.setSize(0.1*winX); //Draw the progress animation bar progressCircle.setPosition(xPos,yPos); progressCircle.setSize(0.15*winX); } void Scene::draw(bool noUpdateCam) { glError(); ASSERT(visControl); glPushMatrix(); Camera *camToUse; if(tempCam) camToUse=tempCam; else camToUse=activeCam; //Inform text about current camera, // so it can e.g. billboard if needed DrawableObj::setCurCamera(camToUse); DrawableObj::setWindowSize(winX,winY); DrawableObj::setBackgroundColour(rBack,gBack,bBack); Effect::setCurCam(camToUse); bool lightsOn=false; //Find number of passes to perform unsigned int numberTotalPasses; numberTotalPasses=initDraw(); if(cameraSet && !noUpdateCam) updateCam(camToUse); //FIXME: Don't always sort - use a "dirty" flag on camera change { //FIXME: Unify refObjects and objects into a single // vector, so we can sort them together unsigned int depthSortCount=0; //Perform depth sorting of object vectors if needed for(auto & refObject : refObjects) { if(refObject->needsDepthSorting()) depthSortCount++; } if(depthSortCount>1 ) depthSort(refObjects); depthSortCount=0; for(auto & object : objects) { if(object->needsDepthSorting()) depthSortCount++; } if(depthSortCount>1 ) depthSort(objects); } for(unsigned int passNumber=0; passNumberenable(passNumber); needCamUpdate|=effect->needCamUpdate(); } if(cameraSet && !noUpdateCam && needCamUpdate ) updateCam(camToUse); } if(showAxis) { if(useLighting) glEnable(GL_LIGHTING); DrawAxis a; a.setStyle(AXIS_IN_SPACE); a.setSize(boundCube.getLargestDim()); a.setPosition(boundCube.getCentroid()); a.draw(); if(useLighting) glDisable(GL_LIGHTING); } //First sub-pass with opaque objects //----------- //Draw the referenced objects drawObjectVector(refObjects,lightsOn,true); //Draw normal objects drawObjectVector(objects,lightsOn,true); //----------- //Second sub-pass with transparent objects //----------- //Draw the referenced objects drawObjectVector(refObjects,lightsOn,false); //Draw normal objects drawObjectVector(objects,lightsOn,false); //----------- } //Disable effects if(useEffects) { //Disable them in reverse order to simulate a stack-type //behaviour. for(unsigned int ui=effects.size();ui!=0;) { ui--; effects[ui]->disable(); } } glPopMatrix(); //Only draw 2D components if we // are using normal camera if(!noUpdateCam) { //Now draw 2D overlays if(!lockInteract&& lastHovered != (unsigned int)(-1) ) drawHoverOverlay(); //Update text notifications updateNotifications(); //Draw all overlays drawOverlays(noUpdateCam); //Draw progress, if needed drawProgressAnim(); } glError(); } void Scene::drawObjectVector(const vector &drawObjs, bool &lightsOn, bool drawOpaques) const { for(unsigned int ui=0; uineedsDepthSorting() == drawOpaques) continue; //overlays need to be drawn later if(drawObjs[ui]->isOverlay()) continue; if(useLighting) { if(!drawObjs[ui]->wantsLight && lightsOn ) { //Object prefers doing its thing in the dark glDisable(GL_LIGHTING); lightsOn=false; } else if (drawObjs[ui]->wantsLight && !lightsOn) { glEnable(GL_LIGHTING); lightsOn=true; } } //If we are in selection mode, draw the bounding box //if the object is selected. if(ui == lastSelected && selectionMode) { //May be required for selection box drawing BoundCube bObject; DrawRectPrism p; //Get the bounding box for the object & draw it drawObjs[ui]->getBoundingBox(bObject); p.setAxisAligned(bObject); p.setColour(0,0.2,1,0.5); //blue-greenish if(lightsOn) glDisable(GL_LIGHTING); p.draw(); if(lightsOn) glEnable(GL_LIGHTING); } #ifdef DEBUG //Ensure that the gl matrix sizes are correctly restored int curDepth[3]; int oldMatMode; curDepth[0] = glCurStackDepth(GL_MODELVIEW_STACK_DEPTH); curDepth[1] = glCurStackDepth(GL_PROJECTION_STACK_DEPTH); curDepth[2] = glCurStackDepth(GL_TEXTURE_STACK_DEPTH); glGetIntegerv( GL_MATRIX_MODE, &oldMatMode); #endif drawObjs[ui]->draw(); #ifdef DEBUG ASSERT(curDepth[0] == glCurStackDepth(GL_MODELVIEW_STACK_DEPTH)); ASSERT(curDepth[1] == glCurStackDepth(GL_PROJECTION_STACK_DEPTH)); ASSERT(curDepth[2] == glCurStackDepth(GL_TEXTURE_STACK_DEPTH)); ASSERT(curDepth[0] && curDepth[1] && curDepth[2]); int newMatMode; glGetIntegerv( GL_MATRIX_MODE, &newMatMode); ASSERT(oldMatMode == newMatMode); #endif } } void Scene::drawOverlays(bool noUpdateCam) const { //Custom projection matrix glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); //Set the opengl camera state back into modelview mode if(!noUpdateCam) { //clear projection and modelview matrices glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, outWinAspect, 1.0, 0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); } for(auto refObject : refObjects) { if(refObject->isOverlay()) { refObject->draw(); } } for(auto object : objects) { if(object->isOverlay()) { object->draw(); } } //Draw any scene notifications drawNotifications(); if(!noUpdateCam) { //pop our modelview matrix glPopMatrix(); //pop projection atrix glMatrixMode(GL_PROJECTION); glPopMatrix(); //return to modelview mode glMatrixMode(GL_MODELVIEW); } glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); } void Scene::drawHoverOverlay() { glEnable(GL_ALPHA_TEST); glDisable(GL_DEPTH_TEST); //Search for a binding bool haveBinding; haveBinding=false; //Prevent transparent areas from interacting //with the depth buffer glAlphaFunc(GL_GREATER,0.01f); vector binder; //!Devices for interactive object properties const std::vector &selectionDevices = visControl->getSelectionDevices(); for(auto selectionDevice : selectionDevices) { if(selectionDevice->getAvailBindings(objects[lastHovered],binder)) { haveBinding=true; break; } } if(haveBinding) { glPushAttrib(GL_LIGHTING); glDisable(GL_LIGHTING); //Now draw some hints for the binding itself as a 2D overlay // //Draw the action type (translation, rotation etc) //and the button it is bound to DrawTexturedQuadOverlay binderIcons,mouseIcons,keyIcons; const float ICON_SIZE= 0.05; binderIcons.setSize(ICON_SIZE*winY); mouseIcons.setSize(ICON_SIZE*winY); keyIcons.setSize(ICON_SIZE*winY); unsigned int iconNum=0; for(unsigned int ui=0;uigetInteractionMode()) { case BIND_MODE_FLOAT_SCALE: case BIND_MODE_FLOAT_TRANSLATE: case BIND_MODE_POINT3D_SCALE: foundIconTex=binderIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_ENLARGE]); break; case BIND_MODE_POINT3D_TRANSLATE: foundIconTex=binderIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_TRANSLATE]); break; case BIND_MODE_POINT3D_ROTATE: case BIND_MODE_POINT3D_ROTATE_LOCK: foundIconTex=binderIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_ROTATE]); default: break; } //Draw the mouse action switch(binder[ui]->getMouseButtons()) { case SELECT_BUTTON_LEFT: foundMouseTex=mouseIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_LEFT_CLICK]); break; case SELECT_BUTTON_MIDDLE: foundMouseTex=mouseIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_MIDDLE_CLICK]); break; case SELECT_BUTTON_RIGHT: foundMouseTex=mouseIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_RIGHT_CLICK]); break; default: //The flags are or'd together, so we can get other combinations break; } bool foundKeyTex; foundKeyTex=false; //Draw the keyboard action, if any switch(binder[ui]->getKeyFlags()) { case FLAG_CMD: #ifdef __APPLE__ foundKeyTex=keyIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_COMMAND]); #else foundKeyTex=keyIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_CTRL]); #endif break; case FLAG_SHIFT: foundKeyTex=keyIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_SHIFT]); break; default: //The flags are or'd together, so we can get other combinations break; } if(foundIconTex && foundMouseTex ) { const float SPACING=0.75*ICON_SIZE; if(foundKeyTex) { //Make room for keyTex binderIcons.setPosition((0.93+SPACING)*winX,ICON_SIZE*winY*(1+(float)iconNum)); keyIcons.setPosition(0.93*winX,ICON_SIZE*winY*(1+(float)iconNum)); mouseIcons.setPosition((0.93-SPACING)*winX,ICON_SIZE*winY*(1+(float)iconNum)); } else { binderIcons.setPosition(0.95*winX,ICON_SIZE*winY*(1+(float)iconNum)); mouseIcons.setPosition(0.90*winX,ICON_SIZE*winY*(1+(float)iconNum)); } binderIcons.draw(); mouseIcons.draw(); if(foundKeyTex) keyIcons.draw(); iconNum++; } } glPopAttrib(); } glDisable(GL_ALPHA_TEST); glEnable(GL_DEPTH_TEST); } void Scene::drawProgressAnim() const { if(!visControl->state.treeState.isRefreshing()) return; if(useLighting) glDisable(GL_LIGHTING); progressCircle.draw(); if(!progressAnimTex.isOK()) { if(useLighting) glEnable(GL_LIGHTING); return; } progressAnimTex.draw(); if(useLighting) glEnable(GL_LIGHTING); } void Scene::addNotice(const std::string &s) { noticeMessages.push_back(s); } void Scene::updateNotifications() { //Don't do anything if we've no messages if(noticeMessages.empty()) return; //Time until message completely fades out const float MESSAGE_FADE_TIME=2.5; //Seconds //Time from which we start fading the message const float MESSAGE_FADE_START=1.0; //Seconds ASSERT(MESSAGE_FADE_TIME > MESSAGE_FADE_START); timeval tNow; gettimeofday(&tNow,NULL); float deltaMessageTime; if(lastMessageTime.tv_sec ==0 && lastMessageTime.tv_usec == 0) { lastMessageTime=tNow; } deltaMessageTime = (tNow.tv_sec- lastMessageTime.tv_sec) + (tNow.tv_usec - lastMessageTime.tv_usec)/1e6; //Check the last message time if(deltaMessageTime > MESSAGE_FADE_TIME) { noticeMessages.pop_front(); lastMessageTime=tNow; } //Set up the text if(noticeMessages.empty()) { noticeText.setText(""); lastMessageTime.tv_usec=lastMessageTime.tv_sec=0; return; } else { //Set up the notification text noticeText.setText((noticeMessages.front())); } //cap the fade time deltaMessageTime=std::min(deltaMessageTime,MESSAGE_FADE_TIME); //Linear fade out float alphaV; alphaV = 1.0 - (deltaMessageTime - MESSAGE_FADE_START)/(MESSAGE_FADE_TIME-MESSAGE_FADE_START); noticeText.setAlpha(alphaV); float rC,gC,bC; getContrastingColour(rBack,gBack,bBack, rC,gC,bC); //HACK - make less stark if(rC > 0.5) { rC*=0.75; gC*=0.75; bC*=0.75; } else { rC+=0.25; gC+=0.25; bC+=0.25; } noticeText.setColour(rC,gC,bC); } void Scene::drawNotifications() const { noticeText.draw(); } void Scene::commitTempCam() { ASSERT(tempCam); std::swap(activeCam, tempCam); delete tempCam; tempCam=nullptr; } void Scene::discardTempCam() { delete tempCam; tempCam=nullptr; } void Scene::setTempCam() { //If a temporary camera is not set, set one. //if it is set, update it from the active camera if(!tempCam) tempCam =activeCam->clone(); else *tempCam=*activeCam; } void Scene::addDrawable(DrawableObj const *obj ) { objects.push_back(obj); BoundCube bc; obj->getBoundingBox(bc); if(bc.isValid()) boundCube.expand(bc); } void Scene::addRefDrawable(const DrawableObj *obj) { refObjects.push_back(obj); BoundCube bc; obj->getBoundingBox(bc); ASSERT(bc.isValid()); boundCube.expand(bc); } void Scene::clearAll() { //Invalidate the bounding cube boundCube.setInverseLimits(); clearObjs(); clearRefObjs(); } void Scene::clearObjs() { for(auto & object : objects) delete object; objects.clear(); lastHovered=-1; } void Scene::clearRefObjs() { refObjects.clear(); } void Scene::getLightPos(float *f) const { for(unsigned int ui=0;ui<4;ui++) f[ui] = lightPosition[ui]; } void Scene::setLightPos(const float *f) { for(unsigned int ui=0;ui<4;ui++) lightPosition[ui]=f[ui]; } void Scene::setAspect(float newAspect) { outWinAspect=newAspect; } void Scene::setActiveCam(Camera *c) { if(tempCam) discardTempCam(); if(activeCam) delete activeCam; activeCam = c; cameraSet=true; } void Scene::setActiveCamByClone(const Camera *c) { if(tempCam) discardTempCam(); if(activeCam) delete activeCam; activeCam = c->clone(); cameraSet=true; } void Scene::ensureVisible(unsigned int direction) { computeSceneLimits(); activeCam->ensureVisible(boundCube,direction); } void Scene::computeSceneLimits() { boundCube.setInverseLimits(); BoundCube b; for(auto & object : objects) { object->getBoundingBox(b); if(b.isValid()) boundCube.expand(b); } for(auto & refObject : refObjects) { refObject->getBoundingBox(b); if(b.isValid()) boundCube.expand(b); } if(!boundCube.isValid()) { //He's going to spend the rest of his life //in a one by one unit box. //If there are no objects, then set the bounds //to 1x1x1, centered around the origin boundCube.setBounds(-0.5,-0.5,-0.5, 0.5,0.5,0.5); } //NOw that we have a scene level bounding box, //we need to set the camera to ensure that //this box is visible ASSERT(boundCube.isValid()); //The scene bounds should be no less than 0.1 units BoundCube unitCube; Point3D centre; centre=boundCube.getCentroid(); unitCube.setBounds(centre+Point3D(0.05,0.05,0.05), centre-Point3D(0.05,0.05,0.05)); boundCube.expand(unitCube); } Camera *Scene::getActiveCam() { return activeCam; } Camera *Scene::getTempCam() { ASSERT(tempCam); return tempCam; } //Adapted from //http://chadweisshaar.com/robotics/docs/html/_v_canvas_8cpp-source.html //GPLv3+ permission obtained by email inquiry. unsigned int Scene::glSelect(bool storeSelected) { ASSERT(!lockInteract); glClear( GL_DEPTH_BUFFER_BIT ); glDisable(GL_CULL_FACE); //Turn off face culling //Shouldn't be using a temporary camera. //temporary cameras are only active during movement operations ASSERT(!tempCam); // Need to load a base name so that the other calls can replace it auto selectionBuffer = new GLuint[512]; glSelectBuffer(512, selectionBuffer); glRenderMode(GL_SELECT); glInitNames(); if(!boundCube.isValid()) computeSceneLimits(); glPushMatrix(); //Apply the camera, but do NOT load the identity matrix, as //we have set the pick matrix activeCam->apply(outWinAspect,boundCube,false); //Set up the objects. Only NON DISPLAYLIST items can be selected. for(unsigned int ui=0; uicanSelect) objects[ui]->draw(); glPopName(); } //OpengGL Faq: //The number of hit records is returned by the call to //glRenderMode(GL_RENDER). Each hit record contains the following //information stored as unsigned ints: // // * Number of names in the name stack for this hit record // * Minimum depth value of primitives (range 0 to 2^32-1) // * Maximum depth value of primitives (range 0 to 2^32-1) // * Name stack contents (one name for each unsigned int). // //You can use the minimum and maximum Z values with the device //coordinate X and Y if known (perhaps from a mouse click) //to determine an object coordinate location of the picked //primitive. You can scale the Z values to the range 0.0 to 1.0, //for example, and use them in a call to gluUnProject(). glFlush(); GLint hits = glRenderMode(GL_RENDER); //The hit query records are stored in an odd manner //as the name stack is returned with it. This depends //upon how you have constructed your name stack during drawing //(clearly). I didn't bother fully understanding this, as it does //what I want. GLuint *ptr = selectionBuffer; GLuint *closestNames = 0; GLuint minZ = 0xffffffff; GLuint numClosestNames = 0; for ( int i=0; itype()) { case CAM_LOOKAT: ((CameraLookAt *)activeCam)->recomputeUpDirection(); break; } } void Scene::resetProgressAnim() { progressAnimTex.resetTime(); progressCircle.resetTime(); progressCircle.reset(); }; //Values are in the range [0 1]. void Scene::applyDevice(float startX, float startY, float curX, float curY, unsigned int keyFlags, unsigned int mouseFlags, bool permanent) { ASSERT(!lockInteract); if(lastSelected == (unsigned int) (-1)) return; //Object should be in object array, and be selectable ASSERT(lastSelected < objects.size()) ASSERT(objects[lastSelected]->canSelect); //Grab basis vectors. (up, forwards and //across from camera view.) //--- Point3D forwardsDir,upDir; forwardsDir=getActiveCam()->getViewDirection(); upDir=getActiveCam()->getUpDirection(); forwardsDir.normalise(); upDir.normalise(); Point3D acrossDir; acrossDir=forwardsDir.crossProd(upDir); acrossDir.normalise(); //--- //Compute the distance between the selected object's //centroid and the camera //--- float depth; BoundCube b; objects[lastSelected]->getBoundingBox(b); //Camera-> object vector Camera *cam=getActiveCam(); Point3D camToObject; //Get the vector to the object camToObject = b.getCentroid() - cam->getOrigin(); depth = camToObject.dotProd(forwardsDir); //--- //Compute the width of the camera view for the object at //the plane that intersects the object's centroid, and is //normal to the camera direction float viewWidth; switch(cam->type()) { case CAM_LOOKAT: viewWidth=((CameraLookAt*)cam)->getViewWidth(depth); break; default: ASSERT(false); } //We have the object number, but we don't know which binding //corresponds to this object. Search all bindings. It may be that more than one //binding is enabled for this object SelectionBinding *binder; vector activeBindings; std::vector &selectionDevices = visControl->getSelectionDevices(); for(auto & selectionDevice : selectionDevices) { if(selectionDevice->getBinding( objects[lastSelected],mouseFlags,keyFlags,binder)) activeBindings.push_back(binder); } for(auto & activeBinding : activeBindings) { //Convert the mouse-XY coords into a world coordinate, depending upon mouse/ //key cobinations Point3D worldVec; Point3D vectorCoeffs[2]; activeBinding->computeWorldVectorCoeffs(mouseFlags,keyFlags, vectorCoeffs[0],vectorCoeffs[1]); //Apply vector coeffs, dependant upon binding worldVec = acrossDir*vectorCoeffs[0][0]*(curX-startX)*outWinAspect + upDir*vectorCoeffs[0][1]*(curX-startX)*outWinAspect + forwardsDir*vectorCoeffs[0][2]*(curX-startX)*outWinAspect + acrossDir*vectorCoeffs[1][0]*(curY-startY) + upDir*vectorCoeffs[1][1]*(curY-startY) + forwardsDir*vectorCoeffs[1][2]*(curY-startY); worldVec*=viewWidth; activeBinding->applyTransform(worldVec,permanent); } computeSceneLimits(); //Inform viscontrol about updates, if we have applied any if(activeBindings.size() && permanent) { visControl->state.treeState.setUpdates(); //If the viscontrol is in the middle of an update, //tell it to abort. if(visControl->state.treeState.isRefreshing()) visControl->state.treeState.setAbort(); } } void Scene::getEffects(vector &eff) const { eff.resize(effects.size()); for(unsigned int ui=0;ui &e) { clearEffects(); for(size_t ui=0;ui &objVec) { Point3D camOrigin = activeCam->getOrigin(); //We need to sort them by distance //from eye (back to front), otherwise they will not blend properly std::vector > eyeDists; eyeDists.resize(objVec.size()); //Set up an original index for the eye distances #pragma omp parallel for shared(camOrigin) for(unsigned int ui=0;uiisOverlay()) { BoundCube bc; objVec[ui]->getBoundingBox(bc); centroid=bc.getCentroid(); } else centroid=camOrigin; //Use the distance (actually distance^2) to the boundbox centre // as the sort key eyeDists[ui].first=centroid.sqrDist(camOrigin); eyeDists[ui].second=ui; } //Perform distance sort (furthest object at back) ComparePairFirstReverse cmp; std::sort(eyeDists.begin(),eyeDists.end(),cmp); //Re-order the vector contents //-- vector tmpV; tmpV.resize(objVec.size()); for(unsigned int ui=0;ui. */ #ifndef TEXTURES_H #define TEXTURES_H #include "common/basics.h" #ifdef CreateDialog #undef CreateDialog #endif #ifdef Yield #undef Yield #endif #ifdef __APPLE__ #include #include #else #include #include #endif #include #include //Named Textures enum { TEXTURE_LEFT_CLICK=0, TEXTURE_TRANSLATE, TEXTURE_RIGHT_CLICK, TEXTURE_ROTATE, TEXTURE_MIDDLE_CLICK, TEXTURE_SCROLL_WHEEL, TEXTURE_ENLARGE, TEXTURE_CTRL, TEXTURE_COMMAND, TEXTURE_ALT, TEXTURE_TAB, TEXTURE_SHIFT }; //Paths to named textures extern const char *TEXTURE_OVERLAY_PNG[]; typedef struct { GLuint glID; /* OpenGL name assigned by by glGenTexture*/ GLuint width; GLuint height; GLuint depth; unsigned char *data; } texture; class TexturePool { private: //Filename of textures, or "" if using a generated texture, bound to the texture data std::vector > openTextures; public: TexturePool() {MESSAGE("TexturePool Constructor");} ; ~TexturePool(); //Open the texture specified by the following file, and //then return the texture ID; or just return the texture //if already loaded. Return true on success. bool openTexture(const char *texName,unsigned int &texID); //Open a set of identically sized images into a 3D texture object bool openTexture3D(const std::vector &texName,unsigned int &texID); void genTexID(unsigned int &textureID, size_t texType=GL_TEXTURE_2D) ; //Close the specified texture, using its texture ID void closeTexture(unsigned int texID); //Close all textures void closeAll(); }; //!Type can be GL_TEXTURE_1D or GL_TEXTURE_2D int pngTexture(texture* dest, const char* filename, GLenum type); //Read a stack of equi-sized PNG images into a 3D opengl texture int pngTexture3D(texture*, const std::vector &filenames); //read a single PNG image as an opengl texture int pngTexture2D(texture*, const char*); int pngTexture1D(texture*, const char*); #endif 3Depict-0.0.22/src/gl/drawables.cpp0000644000175000017500000021763613416477043016343 0ustar pcuserpcuser/* * drawables.cpp - opengl drawable objects cpp file * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #if defined(WIN32) || defined(WIN64) #include #endif #include "drawables.h" #include "common/colourmap.h" #include "common/voxels.h" #include "glDebug.h" //Static class variables //==== const Camera *DrawableObj::curCamera = nullptr; float DrawableObj::backgroundR; float DrawableObj::backgroundG; float DrawableObj::backgroundB; bool DrawableObj::useAlphaBlend; TexturePool *DrawableObj::texPool=nullptr; unsigned int DrawableObj::winX; unsigned int DrawableObj::winY; #ifdef ENABLE_LIBVD bool glewInited=false; #endif //== //Draw a cone pointing in the axisVec direction, positioned at // - (if translateAxis is true, origin+axisVec, otherwise origin) // - void drawCone(const Point3D &axisVec, const Point3D &origin, float radius, float numConeRadiiLen, size_t numSegments,bool translateAxis=false) { Point3D axis; axis =axisVec; if(axis.sqrMag() < sqrtf(std::numeric_limits::epsilon())) axis=Point3D(0,0,1); else axis.normalise(); //Tilt space to align to cone axis Point3D zAxis(0,0,1); float tiltAngle; tiltAngle = zAxis.angle(axis); Point3D rotAxis; rotAxis=zAxis.crossProd(axis); auto ptArray = new Point3D[numSegments]; const float ROT_TOL=sqrtf(std::numeric_limits::epsilon()) ; //Only rotate if the angle is nonzero (note 2PI wraparound is possible from acos) if((tiltAngle > ROT_TOL || fabs(tiltAngle - 2*M_PI) > ROT_TOL) && rotAxis.sqrMag() > ROT_TOL) { //Draw an angled cone Point3f vertex,r; rotAxis.normalise(); r.fx=rotAxis[0]; r.fy=rotAxis[1]; r.fz=rotAxis[2]; //we have to rotate the cone points around the apex point for(unsigned int ui=0; ui ROT_TOL) { //Downwards pointing cone - note "-radius" for(unsigned int ui=0; ui 0.5f) { //"bright" scene, use black text contrastCol=0.0f; } else { //"Dark" background, use white text contrastCol=1.0f; } return contrastCol; } void DrawableObj::explode(std::vector &simpleObjects) { ASSERT(isExplodable()); } void DrawableObj::setTexPool(TexturePool *t) { if(texPool) delete texPool; texPool=t; } void DrawableObj::clearTexPool() { ASSERT(texPool); delete texPool; texPool=nullptr; } Point3D DrawableObj::getCentroid() const { ASSERT(!isExplodable()); //Deliberately do not return here, to force a detectable memory error // The function does not need to be called by all derived objects } //===== DrawPoint::DrawPoint() : origin(0.0f,0.0f,0.0f), r(1.0f), g(1.0f), b(1.0f), a(1.0f),size(1.0f) { } DrawPoint::DrawPoint(float x, float y, float z) : origin(x,y,z), r(1.0f), g(1.0f), b(1.0f),a(1.0f), size(1.0f) { } DrawPoint::DrawPoint(const Point3D &p) : origin(p), r(1.0f), g(1.0f), b(1.0f),a(1.0f),size(1.0f) { } DrawPoint::~DrawPoint() = default; DrawableObj* DrawPoint::clone() const { auto d = new DrawPoint(*this); return d; } void DrawPoint::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawPoint::setOrigin(const Point3D &pt) { origin = pt; } void DrawPoint::draw() const { glPointSize(size); glBegin(GL_POINTS); glColor4f(r,g,b,a); glVertex3fv(origin.getValueArr()); glEnd(); } DrawVector::DrawVector() : origin(0.0f,0.0f,0.0f), vector(0.0f,0.0f,1.0f),drawArrow(true), arrowSize(1.0f),scaleArrow(true),doubleEnded(false), r(1.0f), g(1.0f), b(1.0f), a(1.0f), lineSize(1.0f) { } DrawVector::~DrawVector() = default; DrawableObj* DrawVector::clone() const { auto d = new DrawVector(*this); return d; } void DrawVector::getBoundingBox(BoundCube &box) const { box.setBounds(origin,vector+origin); } void DrawVector::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawVector::setEnds(const Point3D &startNew, const Point3D &endNew) { origin = startNew; vector =endNew-startNew; } void DrawVector::setOrigin(const Point3D &pt) { origin = pt; } void DrawVector::setVector(const Point3D &pt) { vector= pt; } void DrawVector::draw() const { const unsigned int NUM_CONE_SEGMENTS=20; const float numConeRadiiLen = 1.5f; const float radius= arrowSize; glColor3f(r,g,b); //Disable lighting calculations for arrow stem glPushAttrib(GL_LIGHTING_BIT); glDisable(GL_LIGHTING); float oldLineWidth; glGetFloatv(GL_LINE_WIDTH,&oldLineWidth); glLineWidth(lineSize); glBegin(GL_LINES); if(drawArrow) { //Back off the distance a little, because otherwise the line can poke out // the sides of the cone. float backoffFactor = std::max(radius/sqrtf(vector.sqrMag()),0.0f); Point3D tmpVec=vector*(1.0f-backoffFactor) + origin; if(doubleEnded) { Point3D tmpOrigin; tmpOrigin = origin+vector*(backoffFactor); glVertex3fv(tmpOrigin.getValueArr()); glVertex3fv(tmpVec.getValueArr()); } else { glVertex3fv(origin.getValueArr()); glVertex3fv(tmpVec.getValueArr()); } } else { glVertex3fv(origin.getValueArr()); glVertex3f(vector[0]+origin[0],vector[1]+origin[1],vector[2]+origin[2]); } glEnd(); //restore the old line size glLineWidth(oldLineWidth); glPopAttrib(); //If we only wanted the line, then we are done here. if(arrowSize < sqrtf(std::numeric_limits::epsilon()) || !drawArrow) return ; //Now compute & draw the cone tip //---- drawCone(vector, origin, arrowSize, numConeRadiiLen,NUM_CONE_SEGMENTS,true); if(doubleEnded) drawCone(-vector,origin,arrowSize,numConeRadiiLen,NUM_CONE_SEGMENTS); //---- } void DrawVector::recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode) { switch(mode) { case DRAW_VECTOR_BIND_ORIENTATION: ASSERT(vecs.size() ==1 && scalars.size() ==0); vector=vecs[0]; break; case DRAW_VECTOR_BIND_ORIGIN: ASSERT(vecs.size() == 1 && scalars.size()==0); origin=vecs[0]; break; case DRAW_VECTOR_BIND_ORIGIN_ONLY: { ASSERT(vecs.size() == 1 && scalars.size()==0); Point3D dv; dv=vector-origin; origin=vecs[0]; vector=origin+dv; break; } case DRAW_VECTOR_BIND_TARGET: ASSERT(vecs.size() == 1 && scalars.size()==0); vector=vecs[0]-origin; break; default: ASSERT(false); } } DrawTriangle::DrawTriangle() : r(1.0f), g(1.0f),b(1.0f),a(1.0f) { } DrawTriangle::~DrawTriangle() = default; DrawableObj* DrawTriangle::clone() const { auto d = new DrawTriangle(*this); return d; } void DrawTriangle::setVertex(unsigned int ui, const Point3D &pt) { ASSERT(ui < 3); vertices[ui] = pt; } void DrawTriangle::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawTriangle::draw() const { glColor4f(r,g,b,a); glBegin(GL_TRIANGLES); for(const auto & vertex : vertices) glVertex3fv(vertex.getValueArr()); glEnd(); } DrawableObj* DrawQuad::clone() const { auto d = new DrawQuad(*this); return d; } void DrawQuad::getBoundingBox(BoundCube &box) const { box.setBounds(vertices,4); } void DrawQuad::draw() const { ASSERT(false); } void DrawQuad::setVertices(const Point3D *v) { for(size_t ui=0;ui<4;ui++) vertices[ui]=v[ui]; } void DrawQuad::setVertex(unsigned int v, const Point3D &p) { ASSERT(v <4); vertices[v] = p; } void DrawQuad::setColour(float rNew, float gNew, float bNew, float aNew) { ASSERT(rNew >=0 && rNew <=1.0f); ASSERT(gNew >=0 && gNew <=1.0f); ASSERT(bNew >=0 && bNew <=1.0f); ASSERT(aNew >=0 && aNew <=1.0f); for(unsigned int ui=0;ui<4; ui++) { r[ui]=rNew; g[ui]=gNew; b[ui]=bNew; a[ui]=aNew; } } Point3D DrawQuad::getOrigin() const { return Point3D::centroid(vertices,4); } void DrawQuad::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_QUAD_BIND_ORIGIN: { ASSERT(vecs.size() ==1 && scalars.size() ==0); Point3D curOrig=getOrigin(); Point3D delta = vecs[0]-curOrig; for(auto & vertex : vertices) vertex+=delta; break; } default: ASSERT(false); } } DrawTexturedQuad::DrawTexturedQuad() :textureData(nullptr), textureId((unsigned int)-1), noColour(false) , needsBinding(true) { } DrawTexturedQuad::DrawTexturedQuad(const DrawTexturedQuad &oth) { ASSERT(false); } DrawTexturedQuad::~DrawTexturedQuad() { //hack to work around static construct/destruct. // normally we use the texture pool do to everything if(texPool && textureId != (unsigned int)-1) { texPool->closeTexture(textureId); textureId=-1; } if(textureData) delete[] textureData; } void DrawTexturedQuad::draw() const { if(needsBinding) { rebindTexture(); } ASSERT(glIsTexture(textureId)); glEnable(GL_TEXTURE_2D); glPushAttrib(GL_CULL_FACE); glDisable(GL_CULL_FACE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D,textureId); const float COORD_SEQ_X[]={ 0,0,1,1}; const float COORD_SEQ_Y[]={ 0,1,1,0}; if(!noColour) { glBegin(GL_QUADS); for(size_t ui=0;ui<4;ui++) { glColor4f(r[ui],g[ui],b[ui],a[ui]); glTexCoord2f(COORD_SEQ_X[ui],COORD_SEQ_Y[ui]); glVertex3fv(vertices[ui].getValueArr()); } glEnd(); } else { glBegin(GL_QUADS); for(size_t ui=0;ui<4;ui++) { glColor4f(1.0f,1.0f,1.0f,a[ui]); glTexCoord2f(COORD_SEQ_X[ui],COORD_SEQ_Y[ui]); glVertex3fv(vertices[ui].getValueArr()); } glEnd(); } glPopAttrib(); glDisable(GL_TEXTURE_2D); } //Call sequence // - resize destination for texture // - set texture by pixels // - rebind texture void DrawTexturedQuad::resize(size_t numX, size_t numY, unsigned int nChannels) { //reallocate texture as required if(textureData) { if( numX*numY*nChannels != nX*nY*channels) { delete[] textureData; textureData = new unsigned char[numX*numY*nChannels]; } } else textureData = new unsigned char[numX*numY*nChannels]; nX=numX; nY=numY; channels=nChannels; } void DrawTexturedQuad::rebindTexture(unsigned int mode) const { ASSERT(texPool); ASSERT(textureData); if(textureId == (unsigned int)-1) texPool->genTexID(textureId); ASSERT(!(mode == GL_RGB && channels !=3 )); ASSERT(!(mode == GL_RGBA && channels !=4 )); //Construct the texture glBindTexture(GL_TEXTURE_2D,textureId); glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexImage2D(GL_TEXTURE_2D,0,mode,nX,nY, 0,mode,GL_UNSIGNED_BYTE,textureData); needsBinding=false; } void DrawTexturedQuad::setData(size_t x, size_t y, unsigned char *entry) { ASSERT(textureData); ASSERT(x < nX && y < nY); for(size_t ui=0;ui &p) { vertices = p; } DrawableObj *DrawPolygon::clone() const { auto d= new DrawPolygon; d->r=r; d->g=g; d->b=b; d->a=a; d->vertices=vertices; d->normal=normal; return d; } void DrawPolygon::setColour(float rN, float gN, float bN, float aN) { r=rN; g=gN; b=bN; a=aN; } void DrawPolygon::draw() const { switch(drawMode) { case POLYGON_DRAW_OUTLINE: { glColor4f(r,g,b,a); glBegin(GL_LINE_LOOP); for(const auto & vertex : vertices) glVertex3fv(vertex.getValueArr()); glEnd(); break; }; default: ASSERT(false); } } void DrawPolygon::getBoundingBox(BoundCube &box) const { box.setBounds(vertices); } DrawTriangleMesh::DrawTriangleMesh() { drawDoubleSided=true; drawMeshEdges=false; haveCachedBounds=false; drawMode=TRIMESH_DRAW_SURF; deltaOrigin=Point3D(0,0,0); alpha=1.0; } DrawTriangleMesh::~DrawTriangleMesh() = default; void DrawTriangleMesh::draw() const { if(drawDoubleSided) glDisable(GL_CULL_FACE); else glEnable(GL_CULL_FACE); switch(drawMode) { case TRIMESH_DRAW_SURF: { glPushMatrix(); if(deltaOrigin.sqrMag() > 0) glTranslatef(deltaOrigin[0],deltaOrigin[1],deltaOrigin[2]); glBegin(GL_TRIANGLES); for(const auto & triIndex : triIndices) { for(unsigned int uj=0;uj<3;uj++) { float rgba[4]; for( unsigned int uk=0;uk<3; uk++) rgba[uk]=triIndex.col[uj].v[uk]; rgba[3]=alpha; glColor4fv(rgba); glVertex3fv(pts[triIndex.idx[uj]].getValueArr()); } } glEnd(); //Draw the outline of the mesh as needed if(drawMeshEdges) { glBegin(GL_LINES); glColor4f(0,0,1.0f,1.0f); for(const auto & triIndex : triIndices) { for(unsigned int uj=0;uj<4;uj++) { glVertex3fv(pts[triIndex.idx[(uj%3)]].getValueArr()); } } glEnd(); } glPopMatrix(); break; } default: ASSERT(false); } glDisable(GL_CULL_FACE); } void DrawTriangleMesh::setData(std::vector &p, std::vector &idx) { ASSERT(p.size() >=3); pts.swap(p); idx.swap(triIndices); BoundCube bc; getBoundingBox(bc); origCentroid=bc.getCentroid(); } void DrawTriangleMesh::getBoundingBox(BoundCube &box) const { if(haveCachedBounds) { box=cachedBounds; return; } cachedBounds.setBounds(pts); box=cachedBounds; haveCachedBounds=true; return; } void DrawTriangleMesh::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_TRIMESH_BIND_ORIGIN: { //FIXME: This is a hack deltaOrigin=vecs[0]-origCentroid; break; } default: ASSERT(false); } } DrawSphere::DrawSphere() : radius(1.0f), latSegments(8),longSegments(8) { q=gluNewQuadric(); } DrawSphere::~DrawSphere() { if(q) gluDeleteQuadric(q); } DrawableObj *DrawSphere::clone() const { auto d = new DrawSphere(); d->r=r; d->g=g; d->b=b; d->a=a; d->origin=origin; d->radius=radius; d->latSegments=latSegments; d->longSegments=longSegments; d->q=gluNewQuadric(); return d; } void DrawSphere::getBoundingBox(BoundCube &box) const { for(unsigned int ui=0;ui<3;ui++) { box.setBound(ui,0,origin[ui] - radius); box.setBound(ui,1,origin[ui] + radius); } } void DrawSphere::setOrigin(const Point3D &p) { origin = p; } void DrawSphere::setLatSegments(unsigned int ui) { latSegments = ui; } void DrawSphere::setLongSegments(unsigned int ui) { longSegments = ui; } void DrawSphere::setRadius(float rad) { radius=rad; } void DrawSphere::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawSphere::draw() const { if(!q) return; glPushMatrix(); glTranslatef(origin[0],origin[1],origin[2]); glColor4f(r,g,b,a); gluSphere(q,radius,latSegments,longSegments); glPopMatrix(); } void DrawSphere::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_SPHERE_BIND_ORIGIN: ASSERT(vecs.size() ==1 && scalars.size() ==0); origin=vecs[0]; break; case DRAW_SPHERE_BIND_RADIUS: ASSERT(scalars.size() == 1 && vecs.size()==0); radius=scalars[0]; break; default: ASSERT(false); } } //=========== DrawCylinder::DrawCylinder() : radius(1.0f), origin(0.0f,0.0f,0.0f), direction(0.0f,0.0f,1.0f), slices(4),stacks(4) { q= gluNewQuadric(); qCap[0]= gluNewQuadric(); if(qCap[0]) gluQuadricOrientation(qCap[0],GLU_INSIDE); qCap[1]= gluNewQuadric(); if(qCap[1]) gluQuadricOrientation(qCap[1],GLU_OUTSIDE); radiiLocked=false; } bool DrawCylinder::needsDepthSorting() const { return a< 1 && a > std::numeric_limits::epsilon(); } DrawCylinder::~DrawCylinder() { if(q) gluDeleteQuadric(q); if(qCap[0]) gluDeleteQuadric(qCap[0]); if(qCap[1]) gluDeleteQuadric(qCap[1]); } void DrawCylinder::setOrigin(const Point3D& pt) { origin=pt; } void DrawCylinder::setDirection(const Point3D &p) { direction=p; } void DrawCylinder::draw() const { if(!q || !qCap[0] || !qCap[1]) return; //Cross product desired direction with default //direction to produce rotation vector Point3D dir(0.0f,0.0f,1.0f); glPushMatrix(); glTranslatef(origin[0],origin[1],origin[2]); Point3D dirNormal(direction); dirNormal.normalise(); float length=sqrtf(direction.sqrMag()); float angle = dir.angle(dirNormal); if(angle < M_PI - sqrtf(std::numeric_limits::epsilon()) && angle > sqrtf(std::numeric_limits::epsilon())) { //we need to rotate dir = dir.crossProd(dirNormal); glRotatef(angle*180.0f/M_PI,dir[0],dir[1],dir[2]); } //OpenGL defined cylinder starting at 0 and going to length. I want it starting at 0 and going to+-l/2 glTranslatef(0,0,-length/2.0f); glColor4f(r,g,b,a); //Draw the end cap at z=0 if(radiiLocked) { gluDisk(qCap[0],0,radius,slices,1); gluCylinder(q,radius,radius, length,slices,stacks); //Draw the start cap at z=l glTranslatef(0,0,length); gluDisk(qCap[1],0,radius,slices,1); } else { ASSERT(false); } glPopMatrix(); } void DrawCylinder::setSlices(unsigned int i) { slices=i; } void DrawCylinder::setStacks(unsigned int i) { stacks=i; } void DrawCylinder::setRadius(float rad) { radius=rad; } void DrawCylinder::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_CYLINDER_BIND_ORIGIN: ASSERT(vecs.size() ==1 && scalars.size() ==0); origin=vecs[0]; break; case DRAW_CYLINDER_BIND_DIRECTION: ASSERT(vecs.size() ==1 && scalars.size() ==0); direction=vecs[0]; break; case DRAW_CYLINDER_BIND_RADIUS: ASSERT(scalars.size() == 1 && vecs.size()==0); radius=scalars[0]; break; default: ASSERT(false); } } void DrawCylinder::setLength(float len) { ASSERT(direction.sqrMag()); direction=direction.normalise()*len; } void DrawCylinder::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawCylinder::getBoundingBox(BoundCube &box) const { float tmp; Point3D normAxis(direction); normAxis.normalise(); //Height offset for ending circles. //The joint bounding box of these two is the //overall bounding box Point3D offset; //X component tmp=sin(acos(normAxis.dotProd(Point3D(1,0,0)))); offset[0] = radius*tmp; //Y component tmp=sin(acos(normAxis.dotProd(Point3D(0,1,0)))); offset[1] = radius*tmp; //Z component tmp=sin(acos(normAxis.dotProd(Point3D(0,0,1)))); offset[2] = radius*tmp; vector p; p.resize(4); p[0]= offset+(direction*0.5+origin); p[1]= -offset+(direction*0.5+origin); p[2]= offset+(-direction*0.5+origin); p[3]= -offset+(-direction*0.5+origin); box.setBounds(p); } //====== DrawManyPoints::DrawManyPoints() : r(1.0f),g(1.0f),b(1.0f),a(1.0f), size(1.0f) { wantsLight=false; } DrawManyPoints::~DrawManyPoints() = default; DrawableObj* DrawManyPoints::clone() const { auto d = new DrawManyPoints(*this); return d; } void DrawManyPoints::getBoundingBox(BoundCube &box) const { //Update the cache as needed if(!haveCachedBounds) { haveCachedBounds=true; cachedBounds.setBounds(pts); } box=cachedBounds; return; } void DrawManyPoints::clear() { pts.clear(); } void DrawManyPoints::addPoints(const vector &vp) { pts.resize(pts.size()+vp.size()); std::copy(vp.begin(),vp.end(),pts.begin()); haveCachedBounds=false; } void DrawManyPoints::shuffle() { std::random_shuffle(pts.begin(),pts.end()); } void DrawManyPoints::resize(size_t resizeVal) { pts.resize(resizeVal); haveCachedBounds=false; } void DrawManyPoints::setPoint(size_t offset,const Point3D &p) { ASSERT(!haveCachedBounds); pts[offset]=p; } void DrawManyPoints::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawManyPoints::setSize(float f) { size=f; } void DrawManyPoints::draw() const { //Don't draw transparent objects if(a < std::numeric_limits::epsilon()) return; glPointSize(size); glBegin(GL_POINTS); glColor4f(r,g,b,a); //TODO: Consider Vertex buffer objects. would be faster, but less portable. for(const auto & pt : pts) { glVertex3fv(pt.getValueArr()); } glEnd(); } //====== DrawDispList::DrawDispList() : listNum(0),listActive(false) { } DrawDispList::~DrawDispList() { if(listNum) { ASSERT(!listActive); ASSERT(glIsList(listNum)); glDeleteLists(listNum,1); } } bool DrawDispList::startList(bool execute) { //Ensure that the user has appropriately closed the list ASSERT(!listActive); boundBox.setInverseLimits(); //If the list is already genned, clear it if(listNum) glDeleteLists(listNum,1); //Create the display list (ask for one) listNum=glGenLists(1); if(listNum) { if(execute) glNewList(listNum,GL_COMPILE_AND_EXECUTE); else glNewList(listNum,GL_COMPILE); listActive=true; } return (listNum!=0); } void DrawDispList::addDrawable(const DrawableObj *d) { ASSERT(listActive); BoundCube box; d->getBoundingBox(box); boundBox.expand(box); d->draw(); } bool DrawDispList::endList() { glEndList(); ASSERT(boundBox.isValid()); listActive=false; return (glGetError() ==0); } void DrawDispList::draw() const { ASSERT(!listActive); //Cannot select display list objects, //as we cannot modify them without a "do-over". ASSERT(!canSelect); ASSERT(glIsList(listNum)); //Execute the list glPushMatrix(); glCallList(listNum); glPopMatrix(); } //======== DrawGLText::DrawGLText(std::string fontFile, unsigned int mode) :font(nullptr),fontString(fontFile), curFontMode(mode), origin(0.0f,0.0f,0.0f), r(0.0),g(0.0),b(0.0),a(1.0), up(0.0f,1.0f,0.0f), textDir(1.0f,0.0f,0.0f), readDir(0.0f,0.0f,1.0f), isOK(true),ensureReadFromNorm(true) { font=nullptr; switch(mode) { case FTGL_BITMAP: font = new FTGLBitmapFont(fontFile.c_str()); break; case FTGL_PIXMAP: font = new FTGLPixmapFont(fontFile.c_str()); break; case FTGL_OUTLINE: font = new FTGLOutlineFont(fontFile.c_str()); break; case FTGL_POLYGON: font = new FTGLPolygonFont(fontFile.c_str()); break; case FTGL_EXTRUDE: font = new FTGLExtrdFont(fontFile.c_str()); break; case FTGL_TEXTURE: font = new FTGLTextureFont(fontFile.c_str()); break; default: //Don't do this. Use valid font numbers ASSERT(false); font=nullptr; } //In case of allocation failure or invalid font num if(!font || font->Error()) { isOK=false; return; } //Try to make it 100 point font->FaceSize(5); font->Depth(20); //Use unicode font->CharMap(ft_encoding_unicode); alignHorizMode = DRAWTEXT_ALIGN_LEFT; alignVertMode = DRAWTEXT_ALIGN_LOWER; } DrawGLText::DrawGLText(const DrawGLText &oth) : font(nullptr), fontString(oth.fontString), curFontMode(oth.curFontMode), origin(oth.origin), r(oth.r), g(oth.g), b(oth.b), a(oth.a), up(oth.up), textDir(oth.textDir), readDir(oth.readDir),isOK(oth.isOK), ensureReadFromNorm(oth.ensureReadFromNorm) { font=nullptr; switch(curFontMode) { case FTGL_BITMAP: font = new FTGLBitmapFont(fontString.c_str()); break; case FTGL_PIXMAP: font = new FTGLPixmapFont(fontString.c_str()); break; case FTGL_OUTLINE: font = new FTGLOutlineFont(fontString.c_str()); break; case FTGL_POLYGON: font = new FTGLPolygonFont(fontString.c_str()); break; case FTGL_EXTRUDE: font = new FTGLExtrdFont(fontString.c_str()); break; case FTGL_TEXTURE: font = new FTGLTextureFont(fontString.c_str()); break; default: //Don't do this. Use valid font numbers ASSERT(false); font=nullptr; } //In case of allocation failure or invalid font num if(!font || font->Error()) { isOK=false; return; } //Try to make it 100 point font->FaceSize(5); font->Depth(20); //Use unicode font->CharMap(ft_encoding_unicode); } void DrawGLText::draw() const { if(!isOK) return; //Translate the drawing position to the origin Point3D hOffsetVec=textDir; float advance, halfHeight; { FTBBox box; box=font->BBox(strText.c_str()); advance=box.Upper().X()-box.Lower().X(); halfHeight=box.Upper().Y()-box.Lower().Y(); halfHeight/=2.0f; } switch(alignHorizMode) { case DRAWTEXT_ALIGN_LEFT: break; case DRAWTEXT_ALIGN_CENTREX: hOffsetVec=hOffsetVec*advance/2.0f; break; case DRAWTEXT_ALIGN_RIGHT: hOffsetVec=hOffsetVec*advance; break; default: ASSERT(false); } Point3D vOffsetVec=Point3D(0,0,0); switch(alignVertMode) { case DRAWTEXT_ALIGN_LOWER: break; case DRAWTEXT_ALIGN_CENTREY: vOffsetVec=up*halfHeight; break; case DRAWTEXT_ALIGN_UPPER: hOffsetVec=up*(2*halfHeight); break; default: ASSERT(false); } Point3D offsetVec = hOffsetVec + vOffsetVec; glPushMatrix(); glPushAttrib(GL_CULL_FACE); glDisable(GL_CULL_FACE); if(curFontMode !=FTGL_BITMAP) { offsetVec=origin-offsetVec; glTranslatef(offsetVec[0],offsetVec[1],offsetVec[2]); //Rotate such that the new X-Y plane is set to the //desired text orientation. (ie. we want to draw the text in the //specified combination of updir-textdir, rather than in the X-y plane) //--- //Textdir and updir MUST be normal to one another ASSERT(textDir.dotProd(up) < sqrtf(std::numeric_limits::epsilon())); //rotate around textdir cross X, if the two are not the same Point3D newUp=up; float angle=textDir.angle(Point3D(1,0,0) ); if(angle > sqrtf(std::numeric_limits::epsilon())) { Point3D rotateAxis; rotateAxis = textDir.crossProd(Point3D(-1,0,0)); rotateAxis.normalise(); Point3f tmp,axis; tmp.fx=up[0]; tmp.fy=up[1]; tmp.fz=up[2]; axis.fx=rotateAxis[0]; axis.fy=rotateAxis[1]; axis.fz=rotateAxis[2]; glRotatef(angle*180.0f/M_PI,rotateAxis[0],rotateAxis[1],rotateAxis[2]); quat_rot(&tmp,&axis,angle); //angle is in radiians newUp[0]=tmp.fx; newUp[1]=tmp.fy; newUp[2]=tmp.fz; } //rotate new up direction into y around x axis angle = newUp.angle(Point3D(0,1,0)); if(angle > sqrtf(std::numeric_limits::epsilon()) && fabs(angle - M_PI) > sqrtf(std::numeric_limits::epsilon())) { Point3D rotateAxis; rotateAxis = newUp.crossProd(Point3D(0,-1,0)); rotateAxis.normalise(); glRotatef(angle*180.0f/M_PI,rotateAxis[0],rotateAxis[1],rotateAxis[2]); } //Ensure that the text is not back-culled (i.e. if the //text normal is pointing away from the camera, it does not //get drawn). Here we have to flip the normal, by spinning the //text by 180 around its up direction (which has been modified //by above code to coincide with the y axis. if(curCamera) { //This is not *quite* right in perspective mode //but is right in orthogonal Point3D textNormal,camVec; textNormal = up.crossProd(textDir); textNormal.normalise(); camVec = origin - curCamera->getOrigin(); //ensure the camera is not sitting on top of the text. if(camVec.sqrMag() > std::numeric_limits::epsilon()) { camVec.normalise(); if(camVec.dotProd(textNormal) < 0) { //move halfway along text, noting that //the text direction is now the x-axis glTranslatef(advance/2.0f,halfHeight,0); //spin text around its up direction 180 degrees glRotatef(180,0,1,0); //restore back to original position glTranslatef(-advance/2.0f,-halfHeight,0); } camVec=curCamera->getUpDirection(); if(camVec.dotProd(up) < 0) { //move halfway along text, noting that //the text direction is now the x-axis glTranslatef(advance/2.0f,halfHeight,0); //spin text around its front direction 180 degrees //no need to translate as text sits at its baseline glRotatef(180,0,0,1); //move halfway along text, noting that //the text direction is now the x-axis glTranslatef(-advance/2.0f,-halfHeight,0); } } } } else { //FIXME: The text ends up in a weird location //2D coordinate storage for bitmap text double xWin,yWin,zWin; //Compute the 2D coordinates double model_view[16]; glGetDoublev(GL_MODELVIEW_MATRIX, model_view); double projection[16]; glGetDoublev(GL_PROJECTION_MATRIX, projection); int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); //Apply the openGL coordinate transformation pipeline to the //specified coords gluProject(offsetVec[0],offsetVec[1],offsetVec[2] ,model_view,projection,viewport, &xWin,&yWin,&zWin); glRasterPos3f(xWin,yWin,zWin); } //--- glColor4f(r,g,b,a); //Draw text if(curFontMode == FTGL_TEXTURE) { glPushAttrib(GL_ENABLE_BIT); glEnable(GL_TEXTURE_2D); font->Render(strText.c_str()); glPopAttrib(); } else font->Render(strText.c_str()); glPopAttrib(); glPopMatrix(); } DrawGLText::~DrawGLText() { if(font) { delete font; font=nullptr; } } void DrawGLText::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawGLText::getBoundingBox(BoundCube &box) const { //Box forwards transformations // * Translation by [origin-textDir* (maxx - minx)] // * Rotate by textDir.angle([1 0 0 ]), around [ textdir x [ -1 0 0 ] ] // * Rotate by newUp.angle([0,1,0]), around [ newUp x [ 0 -1 0 ] ] if(isOK) { //Obtain the vertices around the untransformed text float minX,minY,minZ; float maxX,maxY,maxZ; font->BBox(strText.c_str(),minX,minY,minZ,maxX,maxY,maxZ); float dy=maxY-minY; box.setBounds(minX,minY,minZ, maxX,maxY,maxZ); vector p; box.getVertices(p,true); for(size_t ui=0;ui::epsilon()); Point3D r1Axis,r2Axis; bool degenR1,degenR2; r1Axis=Point3D(1,0,0); //Compute R1 axis, but do not apply //-- float r1Angle=r1Axis.angle(textDir); degenR1=( r1Angle < TOL_EPS || fabs(r1Angle-M_PI) < TOL_EPS ) ; Point3D newUp=up; if(!degenR1) { r1Axis=textDir.crossProd(r1Axis); r1Axis.normalise(); quat_rot(newUp,r1Axis,r1Angle); } //-- //Compute R2 axis //-- r2Axis=Point3D(0,-1,0); //In degenerate case, we don't do anything // otherwise we compute R2 //rotate new up direction into y around x axis float angle = newUp.angle(Point3D(0,1,0)); if(!degenR1 && (angle > sqrtf(std::numeric_limits::epsilon()) && fabs(angle - M_PI) > sqrtf(std::numeric_limits::epsilon())) ) { r2Axis= newUp.crossProd(Point3D(0,-1,0)); r2Axis.normalise(); } else r2Axis=up; //-- //Compute R2'(P) //-- float r2Angle=angle; degenR2 = r2Angle < TOL_EPS; if(!degenR2) { Point3f rotAx; rotAx.fx = r2Axis[0]; rotAx.fy = r2Axis[1]; rotAx.fz=r2Axis[2]; quat_rot_array(&p[0], p.size(), &rotAx,r2Angle); } //-- //Compute R1'(p) if(!degenR1) { Point3f rotAx; rotAx.fx = r1Axis[0]; rotAx.fy = r1Axis[1]; rotAx.fz=r1Axis[2]; quat_rot_array(&p[0], p.size(), &rotAx,-r1Angle); } for(size_t ui=0;ui &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_TEXT_BIND_ORIGIN: ASSERT(vecs.size() ==1 && scalars.size() ==0); origin=vecs[0]; break; default: ASSERT(false); } } DrawGL2DText::DrawGL2DText(const std::string &fontFile) { r=g=b=a=1.0f; fontString=fontFile; const unsigned int mode = FTGL_POLYGON; font=nullptr; switch(mode) { case FTGL_BITMAP: font = new FTGLBitmapFont(fontFile.c_str()); break; case FTGL_PIXMAP: font = new FTGLPixmapFont(fontFile.c_str()); break; case FTGL_OUTLINE: font = new FTGLOutlineFont(fontFile.c_str()); break; case FTGL_POLYGON: font = new FTGLPolygonFont(fontFile.c_str()); break; case FTGL_EXTRUDE: font = new FTGLExtrdFont(fontFile.c_str()); break; case FTGL_TEXTURE: font = new FTGLTextureFont(fontFile.c_str()); break; default: //Don't do this. Use valid font numbers ASSERT(false); font=nullptr; } if(!font || font->Error()) { isOK=false; return; } font->FaceSize(1); font->Depth(1); font->CharMap(ft_encoding_unicode); alignHorizMode=DRAWTEXT_ALIGN_LEFT; alignVertMode=DRAWTEXT_ALIGN_LOWER; isOK=true; } DrawGL2DText::~DrawGL2DText() { if(font) { delete font; font=nullptr; } } void DrawGL2DText::setColour(float rNew, float gNew,float bNew) { r=rNew; g=gNew; b=bNew; } void DrawGL2DText::draw() const { ASSERT(font); //There is only one scaling variable for this object ASSERT(height == width); ASSERT(height > 0); //skip if there is nothing to do, or if we are not good to go if(!isOK || strText.empty()) return; //FIXME: Ensure scene switches to overlay mode, then draw // to save continously flipping out the matrices glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, 1, 1, 0); glMatrixMode(GL_MODELVIEW); float ASPECT_RATIO; if(winX) ASPECT_RATIO=(float)winY/(float)winX; else ASPECT_RATIO=0.0f; if(ASPECT_RATIO) { glPushMatrix(); glLoadIdentity(); glColor4f(r,g,b,a); glDisable(GL_CULL_FACE); font->FaceSize(1.0); glPushMatrix(); glTranslatef(position[0],position[1],0); glScaled(height,-height/ASPECT_RATIO,height); font->Render(strText.c_str()); glPopMatrix(); glPopMatrix(); //Pop modelview matrix } glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } void DrawGL2DText::getBoundingBox(BoundCube &b) const { WARN(false,"Requested 3D bounding box for 2D object"); //This function is problematic b.setInverseLimits(); } DrawableObj *DrawGL2DText::clone() const { auto d = new DrawGL2DText(fontString); d->strText=strText; d->position[0]=position[0]; d->position[1]=position[1]; d->r=r; d->g=g; d->b=b; d->a=a; d->height=height; d->width=width; d->alignHorizMode = alignHorizMode; d->alignVertMode = alignVertMode; d->isOK=isOK; return d; } DrawRectPrism::DrawRectPrism() : drawMode(DRAW_WIREFRAME), r(1.0f), g(1.0f), b(1.0f), a(1.0f), lineWidth(1.0f) { } DrawRectPrism::~DrawRectPrism() = default; DrawableObj *DrawRectPrism::clone() const { auto dR= new DrawRectPrism(*this); return dR; } void DrawRectPrism::getBoundingBox(BoundCube &box) const { box.setBounds(pMin[0],pMin[1],pMin[2], pMax[0],pMax[1],pMax[2]); } void DrawRectPrism::draw() const { ASSERT(r <=1.0f && g<=1.0f && b <=1.0f && a <=1.0f); ASSERT(r >=0.0f && g>=0.0f && b >=0.0f && a >=0.0f); if(!active) return; switch(drawMode) { case DRAW_WIREFRAME: { glLineWidth(lineWidth); drawBox(pMin,pMax,r,g,b,a); break; } case DRAW_FLAT: { glBegin(GL_QUADS); glColor4f(r,g,b,a); glNormal3f(0,0,-1); //Along the bottom glVertex3f(pMin[0],pMin[1],pMin[2]); glVertex3f(pMin[0],pMax[1],pMin[2]); glVertex3f(pMax[0],pMax[1],pMin[2]); glVertex3f(pMax[0],pMin[1],pMin[2]); //Up the side glNormal3f(1,0,0); glVertex3f(pMax[0],pMax[1],pMax[2]); glVertex3f(pMax[0],pMin[1],pMax[2]); glVertex3f(pMax[0],pMin[1],pMin[2]); glVertex3f(pMax[0],pMax[1],pMin[2]); //Over the top glNormal3f(0,0,1); glVertex3f(pMax[0],pMin[1],pMax[2]); glVertex3f(pMax[0],pMax[1],pMax[2]); glVertex3f(pMin[0],pMax[1],pMax[2]); glVertex3f(pMin[0],pMin[1],pMax[2]); //and back down glNormal3f(-1,0,0); glVertex3f(pMin[0],pMax[1],pMin[2]); glVertex3f(pMin[0],pMin[1],pMin[2]); glVertex3f(pMin[0],pMin[1],pMax[2]); glVertex3f(pMin[0],pMax[1],pMax[2]); //Now the other two sides glNormal3f(0,-1,0); glVertex3f(pMax[0],pMin[1],pMax[2]); glVertex3f(pMin[0],pMin[1],pMax[2]); glVertex3f(pMin[0],pMin[1],pMin[2]); glVertex3f(pMax[0],pMin[1],pMin[2]); glNormal3f(0,1,0); glVertex3f(pMax[0],pMax[1],pMax[2]); glVertex3f(pMax[0],pMax[1],pMin[2]); glVertex3f(pMin[0],pMax[1],pMin[2]); glVertex3f(pMin[0],pMax[1],pMax[2]); glEnd(); break; } default: ASSERT(false); } } void DrawRectPrism::setAxisAligned( const Point3D &p1, const Point3D &p2) { for(unsigned int ui=0; ui<3; ui++) { pMin[ui]=std::min(p1[ui],p2[ui]); pMax[ui]=std::max(p1[ui],p2[ui]); } } void DrawRectPrism::setAxisAligned( const BoundCube &box) { box.getBounds(pMin,pMax); } void DrawRectPrism::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawRectPrism::setLineWidth(float newLineWidth) { ASSERT(newLineWidth > 0.0f); lineWidth=newLineWidth; } void DrawRectPrism::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_RECT_BIND_TRANSLATE: { ASSERT(vecs.size() ==1); Point3D delta; delta = (pMax - pMin)*0.5; //Object has been translated pMin = vecs[0]-delta; pMax = vecs[0]+delta; break; } case DRAW_RECT_BIND_CORNER_MOVE: { ASSERT(vecs.size() ==1); //Delta has changed, but origin should stay the same Point3D mean, corner; mean = (pMin + pMax)*0.5; //Prevent negative offset values, otherwise we can //get inside out boxes corner=vecs[0]; for(unsigned int ui=0;ui<3;ui++) corner[ui]= fabs(corner[ui]); pMin = mean-corner; pMax = mean+corner; break; } default: ASSERT(false); } } DrawableOverlay::~DrawableOverlay() = default; DrawTexturedQuadOverlay::DrawTexturedQuadOverlay() : textureId(-1),textureOK(false) { } DrawTexturedQuadOverlay::~DrawTexturedQuadOverlay() { texPool->closeTexture(textureId); } void DrawTexturedQuadOverlay::draw() const { if(!textureOK) return; ASSERT(height == width); ASSERT(glIsTexture(textureId)); //TODO: Is this redundant? might be already handled // by scene? glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, winX, winY, 0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,textureId); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // Draw overlay quad glColor3f(1.0f,1.0f,1.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex3f(position[0]-height/2.0,position[1]-height/2.0,0.0); glTexCoord2f(0.0f,1.0f); glVertex3f(position[0]-height/2.0,position[1]+height/2.0,0.0); glTexCoord2f(1.0f,1.0f); glVertex3f(position[0]+height/2.0,position[1]+height/2.0,0.0); glTexCoord2f(1.0f,0.0f); glVertex3f(position[0]+height/2.0,position[1]-height/2.0,0.0); glEnd(); glDisable(GL_TEXTURE_2D); /* draw stuff */ glPopMatrix(); //Pop modelview matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } bool DrawTexturedQuadOverlay::setTexture(const char *textureFile) { ASSERT(texPool); textureOK= texPool->openTexture(textureFile,textureId); return textureOK; } DrawProgressCircleOverlay::DrawProgressCircleOverlay() { stepProgress=0; step=0; maxStep=0; } DrawProgressCircleOverlay::~DrawProgressCircleOverlay() = default; void DrawProgressCircleOverlay::reset() { stepProgress=0; maxStep=0; totalFilters=0; curFilter=0; } void DrawProgressCircleOverlay::setFilterStepEstimates(const vector &v) { estimatedSteps=v; } void DrawProgressCircleOverlay::draw( )const { if(!totalFilters) return; ASSERT(estimatedSteps.size() == totalFilters); ASSERT(curFilter > thetaSegments; unsigned int nSegments=totalFilters; float thetaPerFilter = 360.0f/nSegments; //Pre-compute all the angles, so we are not summing all the time // which makes the code fragile for(auto ui=0;ui 0) stepStart+=STEP_SEP_DEG/2.0f; if(uj+1 < estimatedSteps[ui]) stepEnd-=STEP_SEP_DEG/2.0f; //Don't draw all the way to fill the whole arc, leave a gap // between steps, except for the last step drawSection(DEG_STEP, IN_RADIUS_FRACTION*radiusIn, radiusOut, stepStart,stepEnd,false); } } //Now draw the segments for the active filter { float startDeg,endDeg; startDeg=thetaSegments[curFilter].first; endDeg = thetaSegments[curFilter].second; const float STEP_SEP_DEG=4.0f; //Draw each step for the progress still to come, in incomplete style float thetaPerSubStep; thetaPerSubStep=(endDeg- startDeg)/estimatedSteps[curFilter]; for(size_t uj=0; uj 0) stepStart+=STEP_SEP_DEG/2.0f; if(uj+1 < estimatedSteps[curFilter]) stepEnd-=STEP_SEP_DEG/2.0f; //Don't draw all the way to fill the whole arc, leave a gap // between steps, except for the last step. // The step should be drawn as inactive if above current step drawSection(DEG_STEP, IN_RADIUS_FRACTION*radiusIn, radiusOut, stepStart,stepEnd,uj < step-1); if(uj+1 == step) { float partialStepEnd = (stepEnd-stepStart)*stepProgress/100 + stepStart; drawSection(DEG_STEP, IN_RADIUS_FRACTION*radiusIn, radiusOut, stepStart,partialStepEnd,true); } } } //Draw the sections for this fulter glPopMatrix(); //Pop modelview matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopAttrib(); glEnable(GL_CULL_FACE); } void DrawProgressCircleOverlay::drawSection(unsigned int degreeStep, float rIn, float rOut,float startTheta, float stopTheta, bool complete) const { //TODO: all calculations that call this should use radians float startThetaRad = startTheta*M_PI/180.0f; float endThetaRad = stopTheta*M_PI/180.0f; float degStepRad = degreeStep*M_PI/180.0f; unsigned int nSegments = (endThetaRad-startThetaRad)/degStepRad +1; if(!nSegments) return; float alphaBase,dt; getAnimationStat(alphaBase,dt); if(alphaBase == 0.0f) return; float visGrey= getHighContrastValue(); const float ALPHA_COMPLETE=0.5*alphaBase; const float ALPHA_INCOMPLETE=0.15*alphaBase; if(complete) glColor4f(visGrey,visGrey,visGrey,ALPHA_COMPLETE); else glColor4f(visGrey,visGrey,visGrey,ALPHA_INCOMPLETE); //Draw arc glBegin(GL_TRIANGLE_STRIP); float thetaOne=startThetaRad; float thetaTwo=startThetaRad+degStepRad; glVertex2f(position[0] + rIn*cos(thetaOne),position[1] + rIn*sin(thetaOne)); for(size_t ui=0;ui &texFiles, float replayTime) { repeatInterval=replayTime; textureOK=texPool->openTexture3D(texFiles, textureId); return textureOK; } void DrawAnimatedOverlay::getAnimationStat(float &alpha , float &animDeltaTime) const { timeval t; gettimeofday(&t,NULL); animDeltaTime=(float)(t.tv_sec - animStartTime.tv_sec) + (t.tv_usec-animStartTime.tv_usec)/1.0e6; //Skip if we wish to show later if(animDeltaTime < delayBeforeShow) { alpha= 0; return; } animDeltaTime-=delayBeforeShow; if(fadeIn > 0.0f && (fadeIn > animDeltaTime) ) { alpha= (animDeltaTime )/(fadeIn) ; } else alpha= 1.0f; } void DrawAnimatedOverlay::draw() const { if(!textureOK) return; float alphaVal, animDeltaTime; getAnimationStat(alphaVal,animDeltaTime); if(alphaVal== 0.0f) return; float texCoordZ; texCoordZ=fmod(animDeltaTime,repeatInterval); texCoordZ/=repeatInterval; ASSERT(glIsTexture(textureId)); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, winX, winY, 0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glEnable(GL_TEXTURE_3D); glBindTexture(GL_TEXTURE_3D,textureId); //TODO: Find correct blending mode. Default is good, but may change... // glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Draw overlay quad ASSERT(width == height); // width/height should be the same glColor4f(1.0f,1.0f,1.0f,alphaVal); glBegin(GL_QUADS); glTexCoord3f(0.0f,0.0f,texCoordZ); glVertex3f(position[0]-width/2.0,position[1]-width/2.0,0.0); glTexCoord3f(0.0f,1.0f,texCoordZ); glVertex3f(position[0]-width/2.0,position[1]+width/2.0,0.0); glTexCoord3f(1.0f,1.0f,texCoordZ); glVertex3f(position[0]+width/2.0,position[1]+width/2.0,0.0); glTexCoord3f(1.0f,0.0f,texCoordZ); glVertex3f(position[0]+width/2.0,position[1]-width/2.0,0.0); glEnd(); glDisable(GL_TEXTURE_3D); glPopMatrix(); //Pop modelview matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } DrawColourBarOverlay::DrawColourBarOverlay() { a=1.0; string f; f=getDefaultFontFile(); font = new FTGLPolygonFont(f.c_str()); }; DrawColourBarOverlay::DrawColourBarOverlay(const DrawColourBarOverlay &oth) { string f; f=getDefaultFontFile(); font = new FTGLPolygonFont(f.c_str()); a=oth.a; rgb=oth.rgb; min=oth.min; max=oth.max; height=oth.height; width=oth.width; position[0]=oth.position[0]; position[1]=oth.position[1]; }; void DrawColourBarOverlay::draw() const { //Draw quads float elemHeight; //80% of bar width is for the actual colour bar itself. float barWidth=0.8*width; elemHeight=height/(float)rgb.size(); glBegin(GL_QUADS); for(unsigned int ui=0;uiError()) { #ifdef DEBUG std::cerr << "Ah bugger. No font!" << std::endl; #endif return; } //FTGL units are a pain; The devs could not decide //whether to implement them in opengl coords or real coords //so they did neither, and implemented them in "points". //here we assume that we can transform 1 ftgl unit //to 1 opengl unit by inversion const float FTGL_DEFAULT_UNIT_SCALE=1.0/72.0; font->FaceSize(3); glDisable(GL_CULL_FACE); glPushMatrix(); glTranslatef(position[0]+width,position[1],0); string s; stream_cast(s,max); //Note negative sign to flip from y-down screen (opengl) to text dir //(y up) glScaled(FTGL_DEFAULT_UNIT_SCALE, -FTGL_DEFAULT_UNIT_SCALE,FTGL_DEFAULT_UNIT_SCALE); font->Render(s.c_str()); glPopMatrix(); glPushMatrix(); glTranslatef(position[0]+width,position[1]+height,0); stream_cast(s,min); //Note negative sign to flip from y-down screen (opengl) to text dir //(y up) glScaled(FTGL_DEFAULT_UNIT_SCALE, -FTGL_DEFAULT_UNIT_SCALE,FTGL_DEFAULT_UNIT_SCALE); font->Render(s.c_str()); glPopMatrix(); glEnable(GL_CULL_FACE); } DrawableObj *DrawColourBarOverlay::clone() const { DrawColourBarOverlay *newBar = new DrawColourBarOverlay(*this); return newBar; } void DrawColourBarOverlay::setColourVec(const vector &r, const vector &g, const vector &b) { ASSERT(r.size() == g.size()); ASSERT(g.size() == b.size()); rgb.resize(r.size()); for(unsigned int ui=0;ui0 && winY > 0); float curX = position[0]; float curY = position[1]; float delta = std::max(std::min(1.0f/legendItems.size(),0.02f),0.05f); float size = delta*0.9f; float maxTextWidth=0; if(font) font->FaceSize(1); for(unsigned int ui=0; uiv[0],f->v[1],f->v[2]); dCirc.draw(); //-- //Draw text, if possible if( font && !font->Error()) { float textGrey=getHighContrastValue(); glColor3f(textGrey,textGrey,textGrey); float fminX,fminY,fminZ; float fmaxX,fmaxY,fmaxZ; font->BBox(legendItems[ui].first.c_str(),fminX, fminY,fminZ,fmaxX,fmaxY,fmaxZ); glPushMatrix(); glTranslatef(curX+1.5*size,curY+0.85*size,0.0f); glScalef(size,-size,0); font->Render(legendItems[ui].first.c_str()); glPopMatrix(); maxTextWidth=std::max(fmaxX-fminX,maxTextWidth); } curY+=delta; } curX+=maxTextWidth + size; curY=position[1] + 0.5*delta; } } void DrawPointLegendOverlay::addItem(const std::string &s, float r, float g, float b) { RGBFloat rgb; rgb.v[0]=r; rgb.v[1]= g; rgb.v[2]= b; legendItems.emplace_back(s,rgb); } DrawField3D::DrawField3D() : ptsCacheOK(false), alphaVal(0.2f), pointSize(1.0f), drawBoundBox(true), boxColourR(1.0f), boxColourG(1.0f), boxColourB(1.0f), boxColourA(1.0f), volumeGrid(false), colourMapID(COLOURMAP_VIRIDIS), colourMapMode(COLOURMAP_MODE_BUILTIN), volumeRenderMode(0), field(0) { #ifdef ENABLE_LIBVD volumeRenderCacheOK=false; #endif } DrawField3D::~DrawField3D() { if(field) delete field; } void DrawField3D::getBoundingBox(BoundCube &box) const { ASSERT(field) box.setBounds(field->getMinBounds(),field->getMaxBounds()); } void DrawField3D::setField(const Voxels *newField) { field=newField; } #ifdef ENABLE_LIBVD void DrawField3D::setRenderMode(unsigned int mode) { volumeRenderMode=mode; } #endif void DrawField3D::setColourMinMax(float minV, float maxv) { colourMapBound[0]=minV; colourMapBound[1]=maxv; } void DrawField3D::setCustomColourMap(const std::vector > &cMap) { colourMap=cMap; } void DrawField3D::setColourMapMode(unsigned int mode) { ASSERT(mode < COLOURMAP_MODE_ENUM_END); colourMapMode=mode; } void DrawField3D::draw() const { if(alphaVal < sqrtf(std::numeric_limits::epsilon())) return; ASSERT(field); //Depend upon the render mode switch(volumeRenderMode) { case VOLUME_POINTS: { size_t fieldSizeX,fieldSizeY,fieldSizeZ; Point3D p; field->getSize(fieldSizeX,fieldSizeY, fieldSizeZ); Point3D delta; delta = field->getPitch(); delta*=0.5; if(!ptsCacheOK) { ptsCache.clear(); for(unsigned int uiX=0; uiXgetData(uiX,uiY,uiZ); if(v > std::numeric_limits::epsilon()) { unsigned char rgb[3]; if(colourMapMode == COLOURMAP_MODE_BUILTIN) { //Set colour and point loc colourMapWrap(colourMapID,rgb,v, colourMapBound[0],colourMapBound[1],false); } else if (colourMapMode ==COLOURMAP_MODE_CUSTOM) { //FIXME: At this point we are discarding the alpha channel information // we should preserve this. However the RGB storage needs to be adjusted unsigned char alphaThis; applyCustomColourMap(colourMap,rgb,alphaThis,v, colourMapBound[0],colourMapBound[1]); } else { ASSERT(false); } RGBThis rThis; rThis.v[0]=rgb[0]; rThis.v[1]=rgb[1];rThis.v[2]=rgb[2]; ptsCache.emplace_back(field->getPoint(uiX,uiY,uiZ)+delta,rThis); } } } } ptsCacheOK=true; } if(alphaVal < 1.0f && useAlphaBlend) { //We need to generate some points, then sort them by distance //from eye (back to front), otherwise they will not blend properly std::vector > eyeDists; Point3D camOrigin = curCamera->getOrigin(); eyeDists.resize(ptsCache.size()); //Set up an original index for the eye distances #pragma omp parallel for for(unsigned int ui=0;uigetSize(sx,sy,sz); unsigned short *data = new unsigned short[sx*sy*sz]; size_t fieldSize=field->size(); //Copy the contents of the field into an arry that the volume render // library can understand. for(unsigned int ui=0;uigetData(ui); f=(f - colourMapBound[0])/(colourMapBound[1]-colourMapBound[0])*255; data[ui]=std::min(std::max(0.0f,f),255.0f); } //Send the data to the volume renderer try { volumeRenderer.update(data,sx,sy,sz); } catch(...) { delete[] data; return; } delete[] data; //FIXME: We need to use a proper transfer function editor //Create the colour scale (look-up table "LUT") const unsigned int STEPS=256; float *lut = new float[STEPS*4]; //RGBA for(unsigned int ui=1;uigetBounds(bc); glPushAttrib(GL_CULL_FACE); glDisable(GL_CULL_FACE); glPushAttrib(GL_BLEND); //Resize and scale to correctly size the // volume to be rendered glPushMatrix(); glTranslatef(bc.getSize(0)/2.0f+ bc.getBound(0,0),bc.getSize(1)/2.0f+bc.getBound(1,0),bc.getSize(2)/2.0f+bc.getBound(2,0)); glScaled(bc.getSize(0),bc.getSize(1),bc.getSize(2)); //Draw the volume try { volumeRenderer.display(); } catch(...) { WARN(false,"excpetion when volume rendering"); } glPopAttrib(); glPopAttrib(); glPopMatrix(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_DST_ALPHA); glBlendEquation(GL_FUNC_ADD); break; } #endif default: //Not implemented ASSERT(false); } //Draw the bounding box as required if(drawBoundBox) { float alphaUse; if(useAlphaBlend) alphaUse=boxColourA; else alphaUse=1.0f; drawBox(field->getMinBounds(),field->getMaxBounds(), boxColourR, boxColourG,boxColourB,alphaUse); } } void DrawField3D::setAlpha(float newAlpha) { alphaVal=newAlpha; } void DrawField3D::setPointSize(float size) { pointSize=size; } void DrawField3D::setMapColours(unsigned int mapID) { ASSERT(mapID < COLOURMAP_ENUM_END); colourMapID= mapID; } void DrawField3D::setBoxColours(float rNew, float gNew, float bNew, float aNew) { boxColourR = rNew; boxColourG = gNew; boxColourB = bNew; boxColourA = aNew; } bool DrawField3D::needsDepthSorting() const { switch(volumeRenderMode) { case VOLUME_POINTS: return alphaVal < 1.0f; #ifdef ENABLE_LIBVD case VOLUME_RENDER_ACCUMULATE: return true; #endif } ASSERT(false); } DrawIsoSurface::DrawIsoSurface() : cacheOK(false), threshold(0.5f), r(0.5f), g(0.5f), b(0.5f), a(0.5f) { #ifdef DEBUG voxels=0; #endif } DrawIsoSurface::~DrawIsoSurface() { if(voxels) delete voxels; } bool DrawIsoSurface::needsDepthSorting() const { return a< 1 && a > std::numeric_limits::epsilon(); } void DrawIsoSurface::swapVoxels(Voxels *f) { std::swap(f,voxels); cacheOK=false; mesh.clear(); } void DrawIsoSurface::updateMesh() const { mesh.clear(); marchingCubes(*voxels, threshold,mesh); cacheOK=true; } void DrawIsoSurface::getBoundingBox(BoundCube &box) const { if(voxels) { box.setBounds(voxels->getMinBounds(), voxels->getMaxBounds()); } else box.setInverseLimits(); } void DrawIsoSurface::draw() const { if(a< sqrtf(std::numeric_limits::epsilon())) return; if(!cacheOK) { //Hmm, we don't have a cached copy of the isosurface mesh. //we will need to compute one, it would seem. updateMesh(); } //This could be optimised by using triangle strips //rather than direct triangles. if(a < 1.0f && useAlphaBlend ) { //We need to sort them by distance //from eye (back to front), otherwise they will not blend properly std::vector > eyeDists; Point3D camOrigin = curCamera->getOrigin(); eyeDists.resize(mesh.size()); //Set up an original index for the eye distances #pragma omp parallel for shared(camOrigin) for(unsigned int ui=0;ui 1,"Draw2D Circle, too few steps"); glColor4f(r,g,b,1.0f); if(filled) { glBegin(GL_TRIANGLE_FAN); //Central vertex glVertex2fv(centre); //vertices from [0,2PI) for(unsigned int ui=0;ui. */ #ifndef ISOSURFACE_H #define ISOSURFACE_H #include "common/voxels.h" class TriangleWithVertexNorm { public: Point3D p[3]; Point3D normal[3]; void getCentroid(Point3D &p) const; void computeACWNormal(Point3D &p) const; void safeComputeACWNormal(Point3D &p) const; float computeArea() const; bool isDegenerate() const; }; struct TriangleWithIndexedVertices { size_t p[3]; }; //Perform marching cube algorithm void marchingCubes(const Voxels &v,float isoValue, std::vector &tVec); #ifdef DEBUG bool testIsoSurface(); #endif #endif 3Depict-0.0.22/src/gl/scene.h0000644000175000017500000002527013305612110015107 0ustar pcuserpcuser/* * scene.h - Opengl interaction header. * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SCENE_H #define SCENE_H class Scene; class VisController; #include "drawables.h" //Custom includes #include "effect.h" #include "glDebug.h" #include #include #include //!The scene class brings together elements such as objects, lights, and cameras //to enable scene rendering class Scene { private: bool glewInited; //!Viscontroller. Needed for notification of updates during selection binding VisController *visControl; //!Objects that will be used for drawing std::vector objects; //!Objects used for drawing that will not be destroyed std::vector refObjects; //!Various OpenGL effects std::vector effects; Camera *activeCam; //!Temporary override camera Camera *tempCam; //!Texture pool TexturePool texPool; //!Size of window in px (needed if doing 2D drawing) unsigned int winX,winY; //!Is there a camera set? bool cameraSet; //!Aspect ratio of output window (x/y) -- needed for cams float outWinAspect; //!Effect ID handler UniqueIDHandler effectIDs; //!Cube that holds the scene bounds BoundCube boundCube; //!True if user interaction (selection/hovering) is forbidden bool lockInteract; //!Tells the scene if we are in selection mode or not bool selectionMode; //!Tells us if we are in hover mode (should we draw hover overlays?) bool hoverMode; //!Last selected object from call to glSelect(). -1 if last // call failed to identify an item unsigned int lastSelected; //Prevent camera updates from being passed to opengl bool witholdCamUpdate; //!Last hovered object unsigned int lastHovered; //!Should alpha blending be used? bool useAlpha; //!Should lighting calculations be performed? bool useLighting; //!Should we be using effects? bool useEffects; //!Should the world axis be drawn? bool showAxis; //!Background colour float rBack,gBack,bBack; //!Have we attempted to load the progress animation bool attemptedLoadProgressAnim; //texture to use for progress animation DrawAnimatedOverlay progressAnimTex; //Lighting vector float lightPosition[4]; ///!Draw the hover overlays void drawHoverOverlay(); void drawProgressAnim() const; //!initialise the drawing window unsigned int initDraw(); void updateCam(const Camera *camToUse, bool loadIdentity) const; //reset the position of the overlay void updateProgressOverlay(); //!Draw a specified vector of objects void drawObjectVector(const std::vector &objects, bool &lightsOn, bool drawOpaques=true) const; //!Draw the notifications as required void drawNotifications() const; //!Update the notification stack void updateNotifications(); //!Depth sort an object vector void depthSort(vector &objVec); //!Disable copy constructor by making private Scene &operator=(const Scene &); //!Current notification text DrawGL2DText noticeText; //Stack of messages to display to user one at a time std::deque noticeMessages; //last time a message was shown timeval lastMessageTime; public: DrawProgressCircleOverlay progressCircle; //!Constructor Scene(); //!Destructor virtual ~Scene(); //!Set the vis control void setVisControl(VisController *v) { visControl=v;}; //!Draw the objects in the active window. May adjust cameras and compute bounding as needed. void draw(bool noUpdateCam=false); //!Draw the normal overlays void drawOverlays(bool noCamUpdate=false) const; //!clear rendering vectors void clearAll(); //!Clear drawing objects vector void clearObjs(); //! Clear the reference object vector void clearRefObjs(); //!Do we have overlay items? bool hasOverlays() const; //!Obtain the scene's light coordinates in camera relative space // requires an array of size 4 (xyzw) void getLightPos(float *f) const; //!Obtain the scene's light coordinates in camera relative space // requires an array of size 4 (xyzw) void setLightPos(const float *f); //!Set the aspect ratio of the output window. Required. void setAspect(float newAspect); //!retrieve aspect ratio (h/w) of output win float getAspect() const { return outWinAspect;}; //!Add a drawable object /*!Pointer must be set to a valid (allocated) object. *!Scene will delete upon call to clearAll, clearObjs or *!upon destruction */ void addDrawable(const DrawableObj *); //!Add a drawable to the reference only section /* Objects referred to will not be modified or destroyed * by this class. It will only be used for drawing purposes * It is up to the user to ensure that they are in a good state */ void addRefDrawable(const DrawableObj *); bool setProgressAnimation(const std::vector &animFiles); void resetProgressAnim() ; //!Set the messages that will be shown to the user briefly void setNotificationMessages(const vector &messages); //!remove a drawable object void removeDrawable(unsigned int); //!Set the active camera directly // note that the pointer becomes "owned" by the scene. // any previous active camera will be deleted void setActiveCam(Camera *c); //! set the active camera void setActiveCamByClone(const Camera *c); //! get the active camera Camera *getActiveCam() ; //! get the active camera's location Point3D getActiveCamLoc() const; //!Construct (or refresh) a temporary camera /*! this temporary camera is discarded with * either killTempCam or reset to the active * camera with another call to setTempCam(). * The temporary camera overrides the existing camera setup */ void setTempCam(); //!Return pointer to active camera. Must init a temporary camera first! (use setTempCam) Camera *getTempCam() ; //!Make the temp camera permanent. void commitTempCam(); //!Discard the temporary camera void discardTempCam(); //!Are we using a temporary camera? bool haveTempCam() const { return tempCam!=0;}; //!Clone the active camera Camera *cloneActiveCam() const { return activeCam->clone(); }; //!Modify the active camera position to ensure that scene is visible void ensureVisible(unsigned int direction); //!Call if user has stopped interacting with camera briefly. void finaliseCam(); //!perform an openGL selection rendering pass. Return //closest object in depth buffer under position //if nothing, returns -1 unsigned int glSelect(bool storeSelection=true); //!Clear the current selection devices void clearDevices(); //!Apply the device given the following start and end //viewport coordinates. void applyDevice(float startX, float startY, float curX, float curY,unsigned int keyFlags, unsigned int mouseflags,bool permanent=true); // is interaction currently locked? bool isInteractionLocked() const { return lockInteract;} //!Prevent user interaction void lockInteraction(bool amLocking=true) { lockInteract=amLocking;}; //!Set selection mode true=select on, false=select off. //All this does internally is modify how drawing works. void setSelectionMode(bool selMode) { selectionMode=selMode;}; //!Set the hover mode to control drawing void setHoverMode(bool hMode) { hoverMode=hMode;}; //!Return the last object over which the cursor was hovered void setLastHover(unsigned int hover) { lastHovered=hover;}; //!Get the last selected object from call to glSelect() unsigned int getLastSelected() const { return lastSelected;}; //!Return the last object over which the cursor was hovered unsigned int getLastHover() const { return lastHovered;}; //!Duplicates the internal camera vector. return value is active camera //in returned vector unsigned int duplicateCameras(std::vector &cams) const; //!Get a copy of the effects pointers void getEffects(std::vector &effects) const; //!Set whether to use alpha blending void setAlpha(bool newAlpha) { useAlpha=newAlpha;}; //!Set whether to enable lighting void setLighting(bool newLight) { useLighting=newLight;}; //!Set whether to enable the XYZ world axes void setWorldAxisVisible(bool newAxis) { showAxis=newAxis;}; //!Get whether the XYZ world axes are enabled bool getWorldAxisVisible() const { return showAxis;}; //!Set window size void setWinSize(unsigned int x, unsigned int y) {winX=x;winY=y; updateProgressOverlay();} //!Get the scene bounding box BoundCube getBound() const { return boundCube;} //!Set the background colour void setBackgroundColour(float newR,float newG,float newB) { rBack=newR;gBack=newG;bBack=newB;}; void getBackgroundColour(float &newR,float &newG,float &newB) const { newR=rBack;newG=gBack;newB=bBack;}; //!Computes the bounding box for the scene. //this is locked to a minimum of 0.1 unit box around the origin. //this avoids nasty camera situations, where lookat cameras are sitting //on their targets, and don't know where to look. void computeSceneLimits(); //!Set whether to use effects or not void setEffects(bool enable) {useEffects=enable;} //!Set the effect vector /*! Pointers will become "owned" by scene * and will be deleted during destruction, clear, or next setEffectVec call * input vector will be cleared. */ void setEffectVec(std::vector &e); //!Add an effect unsigned int addEffect(Effect *e); //!Remove a given effect void removeEffect(unsigned int uniqueEffectID); //!Clear effects vector void clearEffects(); //!Add a text notification to be displayed at a future point void addNotice(const std::string &s); //!Return if we need to update for notification messages /// FIXME : This may be too aggressive. Perhaps a minimum alpha, or time difference bool messageRedrawNeeded() const { return !noticeMessages.empty(); } //!Remove all notifications void clearNotifications() { noticeMessages.clear() ; lastMessageTime.tv_sec=0; lastMessageTime.tv_usec=0;} static std::string getGlVersion() { return std::string((char *)glGetString(GL_VERSION)); } }; #endif 3Depict-0.0.22/src/gl/effect.h0000644000175000017500000001232013305612110015236 0ustar pcuserpcuser/* * effect.h - opengl 3D effects header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef EFFECT_H #define EFFECT_H #ifdef ATTRIBUTE_PRINTF #pragma push_macro("ATTRIBUTE_PRINTF") #include #pragma pop_macro(" ATTRIBUTE_PRINTF") #else #include #undef ATTRIBUTE_PRINTF #endif #include "cameras.h" //opengl allows up to 6 clipping planes const unsigned int MAX_OPENGL_CLIPPLANES=6; //Effect IDs enum { EFFECT_BOX_CROP=0, EFFECT_ANAGLYPH, EFFECT_ENUM_END }; enum{ //Colour mask methods ANAGLYPH_REDBLUE, ANAGLYPH_REDGREEN, ANAGLYPH_REDCYAN, ANAGLYPH_GREENMAGENTA, //Colour matrix +accumulation buffer methods ANAGLYPH_HALF_COLOUR, ANAGLYPH_MIXED, ANAGLYPH_ENUM_END //Not a method. end of enum }; class Effect { protected: static Camera *curCam; static BoundCube bc; unsigned int effectType; public: Effect(); virtual ~Effect() {}; virtual Effect *clone() const = 0; virtual void enable(unsigned int pass=0) const =0; virtual void disable() const=0; std::string getName() const; //Write the effect's state information to file virtual bool writeState(std::ofstream &f, unsigned int format, unsigned int depth) const=0; //read the effects state information from an XML file // Should be pointing to the top-level of effect element (eg ) virtual bool readState(xmlNodePtr n)=0; virtual bool needCamUpdate() const { return false;} //!Returns true if the effect has any influence on the output virtual bool willDoSomething() const=0; virtual unsigned int numPassesNeeded() const { return 1;} virtual unsigned int getType() const { return effectType;}; static void setCurCam(Camera *c) {curCam=c;} static void setBoundingCube(const BoundCube &c) {bc=c;} }; class BoxCropEffect : public Effect { private: //controlling ID values for gl plane. No more than MAX_OPENGL_CLIPPLANES allowed unsigned int openGLIdStart; //Cropping margins (Fraction from edge towards opposite edge (complete)). 0->1. //Opposing edges must sum to 0->1. (xLo,xHi,yLo...) float cropFractions[6]; //!True if we should transform to camera coordinates before applying crop bool useCamCoordinates; void doClip(const Point3D &origin, const Point3D & normal,unsigned int glOffset) const; public: BoxCropEffect(); virtual ~BoxCropEffect(){}; //Duplicate thi Effect *clone() const; //!Enable the clipping plane. Values *must* be set before calling void enable(unsigned int pass) const; //!DIsable the clipping plane void disable() const; //Write the effect's state information to file bool writeState(std::ofstream &f, unsigned int format, unsigned int depth) const; //read the effects state information from an XML file bool readState(xmlNodePtr n); //!Returns true if the effect has any influence on the output bool willDoSomething() const; //!Set the fractions of cube from margin //-- there should be 6 floats (x,y,z)_(low,high) (x_lo, x_hi....) // each low/hi should form a sum between 0 and 1. void setFractions(const float *fractionArray); void useCamCoords(bool enable){useCamCoordinates=enable;}; //!Alters the input box to generate cropping bounding box //note the box may be inside out if the cropping limits //exceed themselves.. void getCroppedBounds(BoundCube &b) const; float getCropValue(unsigned int pos) const; }; class AnaglyphEffect : public Effect { private: unsigned int colourMode; bool eyeFlip; mutable Camera *oldCam; float baseShift; public: AnaglyphEffect(); ~AnaglyphEffect(){}; //Duplicate thi Effect *clone() const; //!Enable the clipping plane. Values *must* be set before calling void enable(unsigned int pass) const; //!DIsable the clipping plane void disable() const; //Write the effect's state information to file bool writeState(std::ofstream &f, unsigned int format, unsigned int depth) const; //read the effects state information from an XML file bool readState(xmlNodePtr n); //!Whether we should be flipping the lens from its hard-coded left-right void setFlip(bool shouldFlip) {eyeFlip=shouldFlip;}; void setMode(unsigned int mode); void setBaseShift(float shift) { baseShift=shift;}; bool needCamUpdate() const { return true;} //!Returns true if the effect has any influence on the output bool willDoSomething() const {return true;}; virtual unsigned int numPassesNeeded() const { return 2;} float getBaseShift() const { return baseShift;}; unsigned int getMode() const { return colourMode;}; }; Effect *makeEffect(unsigned int effectID); Effect *makeEffect(const std::string &s); #endif 3Depict-0.0.22/src/gl/isoSurface.cpp0000644000175000017500000010020713351360145016453 0ustar pcuserpcuser/* * IsoSurface.cpp - Isosurface interface generation * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "isoSurface.h" #include "common/assertion.h" #include #include #include using std::list; using std::map; using std::vector; using std::pair; using std::make_pair; #ifdef DEBUG template bool mapUnique(const std::map &m) { vector vec; vec.reserve(m.size()); for(typename std::map::const_iterator it = m.begin(); it!=m.end(); ++it) { if(std::find(vec.begin(),vec.end(),it->second) != vec.end()) return false; vec.push_back(it->second); } return true; } #endif //input vector "vec" must be sorted and unique template void removeElements( const std::vector &elems,std::vector &vec) { if(vec.empty() || elems.empty()) return; if(vec.size() == elems.size()) { vec.clear(); return; } size_t offset=vec.size()-1; //Run backwards, swapping out for(size_t ui=elems.size();ui--;) { ASSERT(ui <= offset); std::swap(vec[elems[ui]],vec[offset]); offset--; } vec.resize(offset+1); } void TriangleWithVertexNorm::computeACWNormal(Point3D &n) const { Point3D a,b; a = p[0]-p[1]; b = p[0]-p[2]; n=a.crossProd(b); n.normalise(); } void TriangleWithVertexNorm::safeComputeACWNormal(Point3D &n) const { Point3D a,b; a = p[0]-p[1]; b = p[0]-p[2]; n=a.crossProd(b); if(n.sqrMag() < sqrt(std::numeric_limits::epsilon()) ) n=Point3D(0,0,1); else n.normalise(); } float TriangleWithVertexNorm::computeArea() const { Point3D a,b; a = p[0]-p[1]; b = p[0]-p[2]; return a.crossProd(b).sqrMag(); } bool TriangleWithVertexNorm::isDegenerate() const { return (p[0].sqrDist(p[1]) < std::numeric_limits::epsilon() || p[0].sqrDist(p[2]) < std::numeric_limits::epsilon() || p[2].sqrDist(p[1]) < std::numeric_limits::epsilon()); } void TriangleWithVertexNorm::getCentroid(Point3D &c) const { c=p[0]; c+=p[1]; c+=p[2]; c*=1.0f/3.0f; } //This code is a modified version of the following: //============== // Marching Cubes Example Program // by Cory Bloyd (corysama@yahoo.com) // // A simple, portable and complete implementation of the Marching Cubes // and Marching Tetrahedrons algorithms in a single source file. // There are many ways that this code could be made faster, but the // intent is for the code to be easy to understand. // // For a description of the algorithm go to // http://astronomy.swin.edu.au/pbourke/modelling/polygonise/ // // The original code is public domain, and is used here under the GNU General Public Licence, V3 or later. // ========= // For any edge, if one vertex is inside of the surface and the other is outside of the surface // then the edge intersects the surface // For each of the 8 vertices of the cube can be two possible states : either inside or outside of the surface // For any cube the are 2^8=256 possible sets of vertex states // This table lists the edges intersected by the surface for all 256 possible vertex states // There are 12 edges. For each entry in the table, if edge #n is intersected, then bit #n is set to 1 int aiCubeEdgeFlags[256]= { 0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, 0x190, 0x099, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, 0x230, 0x339, 0x033, 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, 0x3a0, 0x2a9, 0x1a3, 0x0aa, 0x7a6, 0x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, 0x460, 0x569, 0x663, 0x76a, 0x066, 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0x0ff, 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x055, 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0x0cc, 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0x0cc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x055, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0x0ff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x066, 0x76a, 0x663, 0x569, 0x460, 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0x0aa, 0x1a3, 0x2a9, 0x3a0, 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x033, 0x339, 0x230, 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x099, 0x190, 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000 }; // For each of the possible vertex states listed in aiCubeEdgeFlags there is a specific triangulation // of the edge intersection points. a2iTriangleConnectionTable lists all of them in the form of // 0-5 edge triples with the list terminated by the invalid value -1. // For example: a2iTriangleConnectionTable[3] list the 2 triangles formed when corner[0] // and corner[1] are inside of the surface, but the rest of the cube is not. // // I found this table in an example program someone wrote long ago. It was probably generated by hand int a2iTriangleConnectionTable[256][16] = { {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, {3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, {9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, {2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, {8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, {4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, {3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, {1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, {4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, {4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, {5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, {2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, {9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, {0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, {2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, {5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, {5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, {9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, {1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, {8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, {2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, {7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, {2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, {5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1}, {9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1}, {2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1}, {6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1}, {3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1}, {6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1}, {6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1}, {8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1}, {7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1}, {3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1}, {0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1}, {9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1}, {8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1}, {5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1}, {0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1}, {6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1}, {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1}, {1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1}, {0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1}, {3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1}, {6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1}, {9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1}, {8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1}, {3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1}, {6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1}, {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1}, {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1}, {2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, {7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, {7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, {2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, {1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, {8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, {0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, {7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, {2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, {6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, {7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, {2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, {0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, {7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, {6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, {8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, {9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, {6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, {4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, {8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, {0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, {1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, {8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, {4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, {9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, {6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, {7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, {3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, {7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, {3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, {6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, {9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, {1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, {4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, {7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, {6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, {3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, {0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, {6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, {0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} }; //a2fVertexOffset lists the positions, relative to vertex0, of each of the 8 vertices of a cube /*static const float a2fVertexOffset[8][3] = { {0.0, 0.0, 0.0},{1.0, 0.0, 0.0},{1.0, 1.0, 0.0},{0.0, 1.0, 0.0}, {0.0, 0.0, 1.0},{1.0, 0.0, 1.0},{1.0, 1.0, 1.0},{0.0, 1.0, 1.0} };*/ //The deltas for the vertex offsets. This is the int version of a2fVertexOffset const unsigned int VERTEX_OFFSET[8][3] = { {0, 0, 0},{1, 0, 0},{1, 1, 0},{0, 1, 0}, {0, 0, 1},{1, 0, 1},{1, 1, 1},{0, 1, 1} }; //a2iEdgeConnection lists the index of the endpoint vertices for each of the 12 edges of the cube /* static const int a2iEdgeConnection[12][2] = { {0,1}, {1,2}, {2,3}, {3,0}, {4,5}, {5,6}, {6,7}, {7,4}, {0,4}, {1,5}, {2,6}, {3,7} }; //a2fEdgeDirection lists the direction vector (vertex1-vertex0) for each edge in the cube static const float a2fEdgeDirection[12][3] = { {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0}, {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0}, {0.0, 0.0, 1.0},{0.0, 0.0, 1.0},{ 0.0, 0.0, 1.0},{0.0, 0.0, 1.0} }; */ //Mapping between edges as defined in a2iEdgeConenction, (and thus implicitly in edge table) //and the voxels.h definition int edgeRemap[12] ={ 0,6,1,4, 2,7,3,5, 8,10,11,9}; //vMarchingCubes iterates over the entire dataset, calling vMarchCube on each cube void marchingCubes(const Voxels &v,float isoValue, vector &tVec) { size_t nx,ny,nz; v.getSize(nx,ny,nz); ASSERT(nx > 1 && ny>1 && nz>1); //Don't try to isosurface a any volume with a unitary dimension. if(nx ==1 || ny ==1 || nz == 1) return; Point3D gridSpacing; gridSpacing=v.getPitch(); #ifdef DEBUG BoundCube boundC; boundC.setBounds(v.getMinBounds(),v.getMaxBounds()); #endif vector indexedTriVec; //Loop over the vertexs, with the mesh such that the //nominally cube centres are now on a grid that is dual //to the original grid (excluding the external boundary of course) #pragma omp parallel for for(size_t iX = 0; iX < nx-1; iX++) { int iEdgeFlags,iFlagIndex; for(size_t iY = 0; iY < ny-1; iY++) { for(size_t iZ = 0; iZ < nz-1; iZ++) { iFlagIndex=0; Point3D position; //Lower left corner of cell for dual grid position=v.getPoint(iX,iY,iZ) + gridSpacing*0.5; //Find which vertices are inside of the surface and which are outside for(int iVertexTest = 0; iVertexTest < 8; iVertexTest++) { float f; f=v.getData(iX+VERTEX_OFFSET[iVertexTest][0], iY+VERTEX_OFFSET[iVertexTest][1], iZ+VERTEX_OFFSET[iVertexTest][2]); //Compute position in triangle and edge connection //tables if(f <= isoValue) iFlagIndex |= 1< > edgeTriMap; #pragma omp parallel for for(size_t ui=0;ui >::iterator it; it = edgeTriMap.find(indexedTriVec[ui].p[uj]); if(it == edgeTriMap.end()) { list seedList; seedList.push_back(ui); #pragma omp critical edgeTriMap.insert( make_pair(indexedTriVec[ui].p[uj],seedList)); } else { it->second.push_back(ui); } } } //Generate the position points for each edge map pointMap; for(map >::iterator it=edgeTriMap.begin(); it!=edgeTriMap.end(); ++it) { Point3D low,high,voxelFrameIntersection; float lowF,highF; if(pointMap.find((it->first)) != pointMap.end()) continue; //Low/high sides of edge's scalar values v.getEdgeEndApproxVals(it->first,lowF,highF); //Get the edge's low and high end node positions v.getEdgeEnds(it->first,low,high); //OK, now we have that, lets use the values to "lever" the //solution point note node locations for isosurface if(fabs(highF-lowF) < sqrt(std::numeric_limits::epsilon())) { //Prevent divide by zero voxelFrameIntersection=(low+high)*0.5; } else { //interpolate float alpha; alpha= (isoValue- lowF) / (highF- lowF); voxelFrameIntersection=low + (high-low)*alpha; } pointMap.insert(make_pair(it->first,voxelFrameIntersection)); } tVec.resize(indexedTriVec.size()); vector popTris; //Set all triangle vertices #pragma omp parallel for for(size_t ui=0;ui origNormal; origNormal.resize(indexedTriVec.size()); #pragma omp parallel for for(size_t ui=0;ui::iterator it=pointMap.begin(); it!=pointMap.end();++it) it->second=Point3D(0,0,0); //Construct the shared normals float smallNum=sqrt(std::numeric_limits::epsilon()); for(size_t ui=0;ui smallNum) { for(int uj=0;uj<3;uj++) pointMap.at((indexedTriVec[ui].p[uj]))+=origNormal[ui]*weight; } } //re-normalise normals for(map::iterator it=pointMap.begin(); it!=pointMap.end();++it) { if(it->second.sqrMag() > smallNum) it->second.normalise(); else it->second=Point3D(0,0,1); } //assign these normals to the vertices of each triangle #pragma omp parallel for for(size_t ui=0;ui data; data.resize(4,4,4); data.fill(0); data.setData(1,1,1,1.0); vector tVec; marchingCubes(data,0.5,tVec); TEST(!tVec.empty(),"isosurface exists"); //Should be 2 rect. pyramids back to back, with no bases TEST(tVec.size() == 8, "isosurf. triangle count"); //Ensure that all the points are contained within the original data bounding box Point3D pMin,pMax; data.getBounds(pMin,pMax); BoundCube b; b.setBounds(pMin,pMax); for(size_t ui=0;ui. */ #ifndef GLDEBUG_H #define GLDEBUG_H //OpenGL debugging macro #if DEBUG #ifdef __APPLE__ #include #else #include #endif #include #define glError() { \ GLenum err = glGetError(); \ while (err != GL_NO_ERROR) { \ fprintf(stderr, "glError: %s caught at %s:%u\n", (char *)gluErrorString(err), __FILE__, (unsigned int)__LINE__); \ err = glGetError(); \ } \ } inline int glCurStackDepth(int stackDepthSelector) { ASSERT(stackDepthSelector == GL_MODELVIEW_STACK_DEPTH || stackDepthSelector == GL_PROJECTION_STACK_DEPTH || stackDepthSelector == GL_TEXTURE_STACK_DEPTH ); int gldepthdebug; glGetIntegerv (stackDepthSelector,&gldepthdebug); return gldepthdebug; } #define glStackDepths() { \ std::cerr << "OpenGL Stack Depths: ModelV:" \ << glCurStackDepth(GL_MODELVIEW_STACK_DEPTH) << " Pr: "\ << glCurStackDepth(GL_PROJECTION_STACK_DEPTH) << " Tex:" \ << glCurStackDepth(GL_TEXTURE_STACK_DEPTH) << std::endl;} inline void glPrintMatrix(int matrixMode ) { ASSERT(matrixMode == GL_PROJECTION_MATRIX || matrixMode == GL_MODELVIEW_MATRIX || matrixMode == GL_TEXTURE_MATRIX ); //Record old matrix mode, // then switch to new stack and retrieve the top float f[16]; { GLint oldMode; glGetIntegerv( GL_MATRIX_MODE, &oldMode); std::map remapMode; remapMode[GL_PROJECTION_MATRIX ] = GL_PROJECTION; remapMode[GL_MODELVIEW_MATRIX ] = GL_MODELVIEW; remapMode[GL_TEXTURE_MATRIX] = GL_TEXTURE; glMatrixMode (remapMode[matrixMode]); //retrieve glGetFloatv( matrixMode , f); glMatrixMode(oldMode); } std::cerr << "[ "; for(size_t ui=0; ui <4 ; ui++) { for(size_t uj=0;uj<4; uj++) { std::cerr << f[ui*4 + uj] << "\t" ; } if(ui !=3) std::cerr << std::endl; } std::cerr << " ] " << std::endl; } #else #define glStackDepths() #define glError() #endif #endif 3Depict-0.0.22/src/3Depict.rc0000644000175000017500000000007112103473656015067 0ustar pcuserpcusermyAppIcon ICON "myAppIcon.ico" #include "wx/msw/wx.rc" 3Depict-0.0.22/src/Makefile.am0000644000175000017500000001507213414250067015304 0ustar pcuserpcuserMSYS_PATH=/c/msys/1.0/local/include/ %.rc.o: $(WX_RESCOMP) $^ -o $@ 3Depict.rc 3Depict_LDFLAGS=$(LDFLAGS) $(FT_LDFLAGS) $(GSL_LIBS) $(MGL_LIBS) 3Depict_CXXFLAGS=$(CXXFLAGS) $(FT_INCLUDES) $(FTGL_CFLAGS) $(WX_CPPFLAGS) \ $(GL_FLAGS) $(GSL_CFLAGS) $(MGL_CFLAGS) $(XML_CFLAGS) $(PNG_CFLAGS) \ $(OPENMP_FLAGS) $(DEBUG_FLAGS) -pipe 3Depict_CFLAGS=$(CFLAGS) $(FT_INCLUDES) $(FTGL_CFLAGS) \ $(XML_CFLAGS) $(GSL_CFLAGS) $(MGL_CFLAGS) $(PNG_CFLAGS) $(QHULL_CFLAGS) \ $(OPENMP_FLAGS) $(DEBUG_FLAGS) -pipe 3Depict_LDADD=$(LIBS) $(GETTEXT_LIBS) $(WX_LIBS) $(MGL_LIBS) $(FTGL_LIBS) \ $(FT_LIBS) $(XML_LIBS) $(GSL_LIBS) $(GL_LIBS) $(GLU_LIBS) $(QHULL_LIBS) $(PNG_LIBS) bin_PROGRAMS= 3Depict #------- Common header files for all sub-modules COMMON_SOURCE_FILES = common/pngread.c common/stringFuncs.cpp common/constants.cpp common/xmlHelper.cpp\ common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp common/basics.cpp common/assertion.cpp \ common/mesh.cpp common/gsl_helper.cpp COMMON_HEADER_FILES = common/pngread.h common/stringFuncs.h common/constants.h common/xmlHelper.h common/colourmap.h \ common/mathfuncs.h common/basics.h common/translation.h common/endianTest.h common/assertion.h common/voxels.h \ common/array2D.h common/mesh.h common/gsl_helper.h #----------- #------- "Backend" calculation files (non-ui) ---------- FILTER_FILES = backend/filters/allFilter.cpp backend/filters/filterCommon.cpp \ backend/filters/dataLoad.cpp backend/filters/ionDownsample.cpp \ backend/filters/rangeFile.cpp backend/filters/voxelise.cpp \ backend/filters/spectrumPlot.cpp backend/filters/transform.cpp \ backend/filters/externalProgram.cpp backend/filters/ionClip.cpp \ backend/filters/ionColour.cpp backend/filters/boundingBox.cpp \ backend/filters/profile.cpp backend/filters/spatialAnalysis.cpp \ backend/filters/clusterAnalysis.cpp backend/filters/ionInfo.cpp \ backend/filters/annotation.cpp backend/filters/geometryHelpers.cpp \ backend/filters/algorithms/binomial.cpp backend/filters/algorithms/mass.cpp \ backend/filters/algorithms/convexHull.cpp backend/filters/voxelLoad.cpp FILTER_HEADER_FILES = backend/filters/allFilter.h backend/filters/filterCommon.h \ backend/filters/dataLoad.h backend/filters/ionDownsample.h \ backend/filters/rangeFile.h backend/filters/voxelise.h backend/filters/spectrumPlot.h \ backend/filters/transform.h backend/filters/externalProgram.h backend/filters/ionClip.h \ backend/filters/ionColour.h backend/filters/boundingBox.h \ backend/filters/profile.h backend/filters/spatialAnalysis.h \ backend/filters/clusterAnalysis.h backend/filters/ionInfo.h \ backend/filters/annotation.h backend/filters/geometryHelpers.h \ backend/filters/algorithms/binomial.h backend/filters/algorithms/mass.h \ backend/filters/algorithms/convexHull.h backend/filters/voxelLoad.h BACKEND_SOURCE_FILES = backend/animator.cpp backend/filtertreeAnalyse.cpp backend/filtertree.cpp \ backend/APT/ionhit.cpp backend/APT/APTFileIO.cpp backend/APT/APTRanges.cpp backend/APT/abundanceParser.cpp \ backend/APT/vtk.cpp backend/APT/3DapReader.cpp\ backend/filters/algorithms/K3DTree.cpp backend/filters/algorithms/K3DTree-mk2.cpp\ backend/filter.cpp backend/filters/algorithms/spatial.cpp \ backend/viscontrol.cpp backend/state.cpp backend/plot.cpp backend/configFile.cpp \ backend/APT/ionMapFile.cpp BACKEND_HEADER_FILES = backend/animator.h backend/filtertreeAnalyse.h backend/filtertree.h\ backend/APT/ionhit.h backend/APT/APTFileIO.h backend/APT/APTRanges.h backend/APT/abundanceParser.h \ backend/APT/vtk.h backend/APT/3DapReader.h backend/filters/algorithms/K3DTree.h backend/filters/algorithms/K3DTree-mk2.h \ backend/filter.h backend/filters/algorithms/spatial.h backend/viscontrol.h backend/state.h backend/plot.h backend/configFile.h \ backend/APT/ionMapFile.h backend/tree.hh #------------ #------------ OpenGL interface files OPENGL_HEADER_FILES = gl/scene.h gl/drawables.h gl/effect.h gl/textures.h gl/select.h gl/cameras.h gl/isoSurface.h gl/tr.h gl/glDebug.h OPENGL_SOURCE_FILES = gl/scene.cpp gl/drawables.cpp gl/effect.cpp gl/textures.cpp gl/select.cpp gl/cameras.cpp gl/isoSurface.cpp gl/tr.cpp #------------ #------------ Frontend (linked to UI in some way) files --- DIALOG_SOURCE_FILES = gui/dialogs/ExportPos.cpp gui/dialogs/ExportRngDialog.cpp gui/dialogs/prefDialog.cpp \ gui/dialogs/resolutionDialog.cpp gui/dialogs/StashDialog.cpp \ gui/dialogs/autosaveDialog.cpp gui/dialogs/filterErrorDialog.cpp \ gui/dialogs/animateFilterDialog.cpp \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp \ gui/dialogs/rangeEditDialog.cpp gui/dialogs/transferFuncDialog.cpp DIALOG_HEADER_FILES = gui/dialogs/ExportPos.h gui/dialogs/ExportRngDialog.h gui/dialogs/prefDialog.h \ gui/dialogs/StashDialog.h gui/dialogs/resolutionDialog.h \ gui/dialogs/autosaveDialog.h gui/dialogs/filterErrorDialog.h \ gui/dialogs/animateFilterDialog.h \ gui/dialogs/animateSubDialogs/realKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.h \ gui/dialogs/rangeEditDialog.h gui/dialogs/transferFuncDialog.h GUI_SOURCE_FILES=gui/mainFrame.cpp gui/mathglPane.cpp gui/cropPanel.cpp gui/glPane.cpp $(DIALOG_SOURCE_FILES) GUI_HEADER_FILES=gui/mainFrame.h gui/mathglPane.h gui/cropPanel.h gui/art.h gui/glPane.h $(DIALOG_HEADER_FILES) BASE_SOURCE_FILES= 3Depict.cpp testing/testing.cpp wx/wxcommon.cpp wx/wxcomponents.cpp winconsole.cpp wx/propertyGridUpdater.cpp BASE_HEADER_FILES= testing/testing.h wx/wxcommon.h wx/wxcomponents.h winconsole.h wx/propertyGridUpdater.h TEST_SOURCE_FILES = testing/mglTesting.cpp TEST_HEADER_FILES = testing/mglTesting.h #----------- #------------ Shull files #------------ SOURCE_FILES= $(BASE_SOURCE_FILES) $(BASE_HEADER_FILES) $(GUI_SOURCE_FILES) $(GUI_HEADER_FILES) \ $(FILTER_FILES) $(FILTER_HEADER_FILES) \ ${BACKEND_SOURCE_FILES} ${BACKEND_HEADER_FILES} $(OPENGL_SOURCE_FILES) $(OPENGL_HEADER_FILES) \ $(COMMON_SOURCE_FILES) $(COMMON_HEADER_FILES) $(TEST_SOURCE_FILES) $(TEST_HEADER_FILES) 3Depict_SOURCES=$(SOURCE_FILES) #Do we have or need windows-XP "resource" files for look and feel? if HAVE_WINDRES 3Depict_SOURCES+=3Depict.rc 3Depict_LDADD+= 3Depict.rc.o endif #Tarball options EXTRA_DIST = gui/glade-skeleton myAppIcon.ico testing/filtertesting.cpp testing/filtertesting.h 3Depict-0.0.22/src/wx/0000755000175000017500000000000013451744166013712 5ustar pcuserpcuser3Depict-0.0.22/src/wx/wxcomponents.cpp0000644000175000017500000003635313414250067017163 0ustar pcuserpcuser/* * wxcomponents.h - Custom wxWidgets components header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "wxcomponents.h" #include "wxcommon.h" #include "common/stringFuncs.h" #include "common/constants.h" #include "common/translation.h" #include #include using std::ofstream; using std::vector; using std::stack; void upWxTreeCtrl(const FilterTree &filterTree, wxTreeCtrl *t, std::map &filterMap,vector &persistentFilters, const Filter *visibleFilt) { TreePersist tPersist; tPersist.saveTreeExpandState(t); //Remove any filters that don't exist any more for(unsigned int ui=persistentFilters.size();ui--;) { if(!filterTree.contains(persistentFilters[ui])) { std::swap(persistentFilters[ui],persistentFilters.back()); persistentFilters.pop_back(); } } stack treeIDs; t->Freeze(); //Warning: this generates an event, //most of the time (some windows versions do not according to documentation) t->DeleteAllItems(); //Clear the mapping filterMap.clear(); size_t nextID=0; size_t lastDepth=0; //Add dummy root node. This will be invisible to wxTR_HIDE_ROOT controls wxTreeItemId tid; tid=t->AddRoot(wxT("TreeBase")); t->SetItemData(tid,new wxTreeUint(nextID)); // Push on stack to prevent underflow, but don't keep a copy, // as we will never insert or delete this from the UI treeIDs.push(tid); nextID++; std::map reverseFilterMap; //Depth first add for(tree::pre_order_iterator filtIt=filterTree.depthBegin(); filtIt!=filterTree.depthEnd(); ++filtIt) { //Push or pop the stack to make it match the iterator position if( lastDepth > filterTree.depth(filtIt)) { while(filterTree.depth(filtIt) +1 < treeIDs.size()) treeIDs.pop(); } else if( lastDepth < filterTree.depth(filtIt)) { treeIDs.push(tid); } lastDepth=filterTree.depth(filtIt); //This will use the user label or the type string. tid=t->AppendItem(treeIDs.top(), ((*filtIt)->getUserString())); t->SetItemData(tid,new wxTreeUint(nextID)); //Record mapping to filter for later reference filterMap[nextID]=*filtIt; //Remember the reverse mapping for later in // this function when we reset visibility reverseFilterMap[*filtIt] = tid; nextID++; } //Try to restore the selection in a user friendly manner // - Try restoring all requested filter's visibility // - then restore either the first requested filter as the selection // or the specified parameter filter as the selection. if(persistentFilters.size()) { for(auto & persistentFilter : persistentFilters) t->EnsureVisible(reverseFilterMap[persistentFilter]); if(!visibleFilt) t->SelectItem(reverseFilterMap[persistentFilters[0]]); else t->SelectItem(reverseFilterMap[visibleFilt]); persistentFilters.clear(); } else if(visibleFilt) { ASSERT(reverseFilterMap.find(visibleFilt)!=reverseFilterMap.end()) t->SelectItem(reverseFilterMap[visibleFilt]); } t->GetParent()->Layout(); tPersist.restoreTreeExpandState(t); t->Thaw(); } //Convert my internal choice string format to comma delimited std::string choiceStringToCommaDelim(std::string choiceString) { std::string retStr; bool haveColon=false; bool haveBar=false; for(unsigned int ui=0;uiShowModal(); wxD->Destroy(); return; } // Number of rows and cols int rows,cols; rows=GetNumberRows(); cols=GetNumberCols(); // data variable contain text that must be set in the clipboard // For each cell in selected range append the cell value in the data //variable // Tabs '\\t' for cols and '\\r' for rows //print headers for(int c=0; cbr, // so you have to do this first int lastRow=cells[0].GetRow(); int lastCol=cells[0].GetCol(); for(int cell=0; cell lastRow) { lastRow=cells[cell].GetRow(); data+=endline; } data+=stlStr(GetCellValue(cells[cell].GetRow(), cells[cell].GetCol())); if(lastCol < cells[cell].GetCol()) { lastCol=cells[cell].GetCol(); data+="\t"; } } } */ else return; } // Put the data in the clipboard if (wxTheClipboard->Open()) { wxTextDataObject* clipData= new wxTextDataObject; // Set data object value clipData->SetText((data)); wxTheClipboard->UsePrimarySelection(false); wxTheClipboard->SetData(clipData); wxTheClipboard->Close(); } } BEGIN_EVENT_TABLE(TextTreeCtrl, wxTreeCtrl) EVT_PAINT(TextTreeCtrl::OnTreePaint) END_EVENT_TABLE() void TextTreeCtrl::OnTreePaint(wxPaintEvent &event) { //Draws a message in the text control, if the // control is otherwise empty //Call standard handler on exit event.Skip(true); //If there are items in the control, just abort if(GetCount() || messageStrs.empty()) return; //scan for the largest string size_t largestTextSize=0,idx=(size_t)-1; for(size_t ui=0;ui largestTextSize) { largestTextSize=messageStrs[ui].size(); idx=ui; } } if(idx ==(size_t) -1) return; //Check that the string we want fits in the control int w,h; GetClientSize(&w,&h); //Create drawing context auto dc = new wxPaintDC(this); //Set text font wxFont font; font.SetFamily(wxFONTFAMILY_SWISS); if(font.IsOk()) dc->SetFont(font); wxSize textSize=dc->GetTextExtent((messageStrs[idx])); //Don't go ahead with the drawing if the text // won't fit in the control const float HEIGHT_SPACING=1.1; float blockHeight=textSize.GetHeight()*messageStrs.size()*HEIGHT_SPACING; if(textSize.GetWidth() >=w || blockHeight> h) { delete dc; return; } //Draw each text in turn, advancing by spacing // start far enough back so that float startY= 0.5*(h - blockHeight); for(auto & messageStr : messageStrs) { textSize=dc->GetTextExtent(messageStr); int startX; startX=w/2 - textSize.GetWidth()/2; dc->DrawText(messageStr, startX,startY); startY+=HEIGHT_SPACING*textSize.GetHeight(); } delete dc; } std::string TTFFinder::findFont(const char *fontFile) { //Action is OS dependant #ifdef __APPLE__ return macFindFont(fontFile); #elif defined __UNIX_LIKE__ || defined __linux__ return nxFindFont(fontFile); #elif defined __WINDOWS__ return winFindFont(fontFile); #else #error OS not detected in preprocessor series #endif } #ifdef __APPLE__ std::string TTFFinder::macFindFont(const char *fontFile) { //This is a list of possible target dirs to search //(Oh look Ma, I'm autoconf!) const char *dirs[] = { ".", "/Library/Fonts", "" , }; //MUST end with "". wxPathList *p = new wxPathList; unsigned int ui=0; //Try a few standard locations while(strlen(dirs[ui])) { p->Add((dirs[ui])); ui++; }; wxString s; //execute the search for the file s= p->FindValidPath((fontFile)); std::string res; if(s.size()) { if(p->EnsureFileAccessible(s)) res = stlStr(s); } delete p; return res; } #elif defined __UNIX_LIKE__ || defined __linux__ std::string TTFFinder::nxFindFont(const char *fontFile) { //This is a list of possible target dirs to search //(Oh look Ma, I'm autoconf!) const char *dirs[] = { ".", "/usr/share/fonts/truetype", //Old debian "/usr/share/fonts/truetype/freefont", // New debian "/usr/share/fonts/truetype/ttf-dejavu", //New debian "/usr/local/share/fonts/truetype", // User fonts "/usr/X11R6/lib/X11/fonts/truetype", "/usr/X11R6/lib64/X11/fonts/truetype", "/usr/lib/X11/fonts/truetype",// Fedora 32 "/usr/lib64/X11/fonts/truetype", //Fedora 64 "/usr/local/lib/X11/fonts/truetype", // Fedora 32 new "/usr/local/lib64/X11/fonts/truetype",// Fedora 64 new "", }; //MUST end with "". auto p = new wxPathList; unsigned int ui=0; //Try a few standard locations while(strlen(dirs[ui])) { p->Add((dirs[ui])); ui++; }; wxString s; //execute the search for the file s= p->FindValidPath((fontFile)); std::string res; if(s.size()) { if(p->EnsureFileAccessible(s)) res = stlStr(s); } delete p; return res; } #elif defined __WINDOWS__ std::string TTFFinder::winFindFont(const char *fontFile) { //This is a list of possible target dirs to search //(Oh look Ma, I'm autoconf!) const char *dirs[] = { ".", "C:\\Windows\\Fonts", "", }; //MUST end with "". wxPathList *p = new wxPathList; unsigned int ui=0; //Try a few standard locations while(strlen(dirs[ui])) { p->Add((dirs[ui])); ui++; }; wxString s; //execute the search for the file s= p->FindValidPath((fontFile)); std::string res; if(s.size()) { if(p->EnsureFileAccessible(s)) res = stlStr(s); } delete p; return res; } #endif std::string TTFFinder::suggestFontName(unsigned int fontType, unsigned int index) { //Possible font names const char *sansFontNames[] = { //First fonts are fonts I have a preference for in my app //in my preference order "FreeSans.ttf", "DejaVuSans.ttf", "Arial.ttf", "ArialUnicodeMS.ttf", "NimbusSansL.ttf", "LiberationSans.ttf", "Courier.ttf", //These are simply in semi-alphabetical order //may not even be font names (font families) :) "AkzidenzGrotesk.ttf", "Avenir.ttf", "BankGothic.ttf", "Barmeno.ttf", "Bauhaus.ttf", "BellCentennial.ttf", "BellGothic.ttf", "BenguiatGothic.ttf", "Beteckna.ttf", "Calibri.ttf", "CenturyGothic.ttf", "Charcoal.ttf", "Chicago.ttf", "ClearfaceGothic.ttf", "Clearview.ttf", "Corbel.ttf", "Denmark.ttf", "Droid.ttf", "Eras.ttf", "EspySans.ttf", "Eurocrat.ttf", "Eurostile.ttf", "FFDax.ttf", "FFMeta.ttf", "FranklinGothic.ttf", "Frutiger.ttf", "Futura.ttf", "GillSans.ttf", "Gotham.ttf", "Haettenschweiler.ttf", "HandelGothic.ttf", "Helvetica.ttf", "HelveticaNeue.ttf", "HighwayGothic.ttf", "Hobo.ttf", "Impact.ttf", "Johnston.ttf", "NewJohnston.ttf", "Kabel.ttf", "LucidaGrande.ttf", "Macintosh.ttf", "Microgramma.ttf", "Motorway.ttf", "Myriad.ttf", "NewsGothic.ttf", "Optima.ttf", "Pricedown.ttf", "RailAlphabet.ttf", "ScalaSans.ttf", "SegoeUI.ttf", "Skia.ttf", "Syntax.ttf", "", }; //FIXME: Suggest some font names const char *serifFontNames[] = {""}; //FIXME: Suggest some font names const char *monoFontNames[] = {""}; std::string s; switch(fontType) { case TTFFINDER_FONT_SANS: s = sansFontNames[index]; break; case TTFFINDER_FONT_SERIF: s = serifFontNames[index]; break; case TTFFINDER_FONT_MONO: s = monoFontNames[index]; break; } return s; } std::string TTFFinder::getBestFontFile(unsigned int type) { unsigned int index=0; std::string s; do { s=suggestFontName(type,index); if(s.size()) { index++; s=findFont(s.c_str()); if(s.size()) { return s; } } else return s; } while(true); ASSERT(false); return s; } 3Depict-0.0.22/src/wx/wxcommon.cpp0000644000175000017500000004272513451522513016265 0ustar pcuserpcuser/* * wxcommon.cpp - Comon wxwidgets functionality * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "wxcommon.h" #include "common/stringFuncs.h" #include "common/constants.h" #include #include #include #include #if defined(WIN32) || defined(WIN64) #include #endif #ifdef __APPLE__ #include "CoreFoundation/CoreFoundation.h" #endif using std::stack; using std::pair; using std::map; using std::make_pair; using std::string; //Auto update checking RSS URL const char *RSS_FEED_LOCATION="http://threedepict.sourceforge.net/rss.xml"; //Auto update event for posting back to main thread upon completion wxEventType RemoteUpdateAvailEvent = wxNewEventType(); // You get to choose the name yourself //Signalling event for main frame that it is completed wxEventType RefreshCompleteEvent= wxNewEventType(); // You get to choose the name yourself //Maximum amount of content in RSS header is 1MB. const unsigned int MAX_RSS_CONTENT_SIZE=1024*1024; //Unlikely text string that can be appended to treepersist const char *PATH_NONCE="%$-"; std::string locateDataFile(const char *name) { //Current strategies: //Linux: // - Look in cwd & some common hard-coded install locations. //Mac: // - look in bundle //Windows // - Locate a registry key that has the install path, which is preset by // application installer #if defined(WIN32) || defined(WIN64) //This must match the key used in the installer wxRegKey *pRegKey = new wxRegKey(wxT("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\3Depict.exe")); if( pRegKey->Exists() ) { //Now we are talkin. Regkey exists //OK, lets see if this dir actually exists or if we are being lied to (old dead regkey, for example) wxString keyVal; //Get the default key pRegKey->QueryValue(wxT(""),keyVal); //Strip the "3Depict.exe" from the key string std::string s; s = (const char *)keyVal.mb_str(); if(s.size() > 11) { s=s.substr(0,s.size()-11); s+=name; if(wxFileExists((s))) return s; } } std::string s; s =name; if(s.size() && wxFileExists((s))) { return string(name); } else return std::string(""); #elif defined( __linux__) //Possible search paths. Must have trailing slash. will //be searched in sequence. const char *possibleDirs[] = { "./", "/usr/local/share/3Depict/", "/usr/share/3Depict/", "/usr/share/3depict/", //Under debian, we have to use lowercase according to the debian guidelines, so handle this case. "../data/", "./data/" }; const unsigned int NUM_SEARCH_DIRS=THREEDEP_ARRAYSIZE(possibleDirs); std::string s; for(auto & possibleDir : possibleDirs) { s=std::string(possibleDir) + name; if(wxFileExists((s))) return s; } //Return empty string, as we can't find it return std::string(""); #elif defined (__APPLE__) CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); char path[PATH_MAX]; if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) { // error! return std::string(""); } CFRelease(resourcesURL); std::string s=std::string(path) + "/" + name; if(wxFileExists((s))) return s; else return std::string(""); #else // - Look in cwd if(wxFileExists(wxCStr(name))) return std::string(name); else return std::string(""); #endif } VersionCheckThread::VersionCheckThread(wxWindow *target) : wxThread(wxTHREAD_JOINABLE) { complete=false; retrieveOK=false; targetWindow=target; url.GetProtocol().Initialize(); } void *VersionCheckThread::Entry() { wxCommandEvent event( RemoteUpdateAvailEvent); ASSERT(targetWindow); wxInputStream* inputStream; versionStr.clear(); //Try to download RSS feed std::string strUrl; wxString rssUrl; //Build the rss query string, encoding 3depict version and OS description strUrl = std::string(RSS_FEED_LOCATION) + std::string("?progver=") + std::string(PROGRAM_VERSION) + std::string("&os=") + stlStr(::wxGetOsDescription()); wxURI uri((strUrl)); rssUrl = uri.BuildURI(); url.SetURL(rssUrl); //If the URL could not be downloaded, tough. if (url.GetError() != wxURL_NOERR) { retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } inputStream = url.GetInputStream(); if(!inputStream || !inputStream->CanRead()) { retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } wxXmlDocument *doc= new wxXmlDocument; if(!doc->Load(*inputStream)) { delete doc; retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } //FIXME : leaking inptustream? //Check we grabbed an RSS feed if(doc->GetRoot()->GetName() != wxT("rss")) { delete doc; retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } //Find first channel wxXmlNode *child = doc->GetRoot()->GetChildren(); while(child) { if(child->GetName() == wxT("channel")) break; child = child->GetNext(); } if(!child) { delete doc; retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } std::vector itemStrs; //Spin through all the nodes in the first wxXmlNode *itemNode=child->GetChildren(); while(itemNode) { //OK, we have an item node,lets check its children if(itemNode->GetName() == wxT("item")) { child=itemNode->GetChildren(); while(child) { //OK, we found a child node; if(child->GetName() == wxT("title")) { std::string stlContent; wxString content = child->GetNodeContent(); stlContent=stlStr(content); if(stlContent.size() < MAX_RSS_CONTENT_SIZE && isVersionNumberString(stlContent)) itemStrs.push_back(stlContent); break; } child = child->GetNext(); } } itemNode = itemNode->GetNext(); } delete doc; if(itemStrs.empty()) { //hmm. thats odd. no items. guess we failed :( retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } //Find the greatest version number versionStr=getMaxVerStr(itemStrs); retrieveOK=true; complete=true; wxPostEvent(targetWindow,event); return 0; } void wxErrMsg(wxWindow *win, const std::string &title, const std::string &mesg) { wxMessageDialog *wxMesD =new wxMessageDialog(win,(mesg) ,(title),wxOK|wxICON_ERROR); wxMesD->ShowModal(); wxMesD->Destroy(); } //creates a temporary filename for use std::string createTmpFilename(const char *dir,const char *extension) { wxString tmpFilename,tmpDir; if(!dir) { tmpDir=wxFileName::GetTempDir(); #if defined(__WIN32__) || defined(__WIN64__) tmpDir=tmpDir + wxT("\\3Depict\\"); #else tmpDir=tmpDir + wxT("/3Depict/"); #endif } else tmpDir=dir; if(!wxDirExists(tmpDir)) wxMkdir(tmpDir); tmpFilename=wxFileName::CreateTempFileName(tmpDir+ wxT("unittest-")); wxRemoveFile(tmpFilename); if(extension) tmpFilename+=wxT(".pos"); return stlStr(tmpFilename); } bool canWriteToFile(const char *cpFilename) { wxFileName fName; fName.Assign(cpFilename); fName.MakeAbsolute(); //Check the actual filename is OK for write // and, if a new file, the parent dir is writabLe if(fName.Exists() && !wxIsWritable(cpFilename)) return false; else if (!wxFileName::IsDirWritable(fName.GetPath())) //Check dir return false; return true; } //Does a process with a given ID both (1) exist, and (2) match the process name? #if defined(__LINUX__) || defined(__BSD__) bool processMatchesName(size_t processID, const std::string &procName) { //Execute the ps process, then filter the output by processID wxArrayString stdOut; long res; res=wxExecute(wxT("ps ax"),stdOut, wxEXEC_BLOCK); if(res !=0 ) return false; std::string pidStr; stream_cast(pidStr,processID); //Parse stdout.. for(size_t ui=0;ui strVec; s=stripWhite(s); splitStrsRef(s.c_str()," \t",strVec); //Return true if *any* field returns true bool pidFound,procNameFound; procNameFound=pidFound=false; for(auto & str : strVec) { wxFileName fName(str); std::string maybeProcName; maybeProcName = stlStr(fName.GetFullName()); if( pidStr == str) pidFound=true; else if(procName == maybeProcName) procNameFound=true; if(procNameFound && pidFound) return true; } } return false; } #else #include typedef long NTSTATUS; #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) typedef enum _SYSTEM_INFORMATION_CLASS { SystemProcessInformation = 5 } SYSTEM_INFORMATION_CLASS; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING; typedef LONG KPRIORITY; // Thread priority typedef struct _SYSTEM_PROCESS_INFORMATION_DETAILD { ULONG NextEntryOffset; ULONG NumberOfThreads; LARGE_INTEGER SpareLi1; LARGE_INTEGER SpareLi2; LARGE_INTEGER SpareLi3; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ImageName; KPRIORITY BasePriority; HANDLE UniqueProcessId; ULONG InheritedFromUniqueProcessId; ULONG HandleCount; BYTE Reserved4[4]; PVOID Reserved5[11]; SIZE_T PeakPagefileUsage; SIZE_T PrivatePageCount; LARGE_INTEGER Reserved6[6]; } SYSTEM_PROCESS_INFORMATION_DETAILD, *PSYSTEM_PROCESS_INFORMATION_DETAILD; //Function ptr typedef NTSTATUS (WINAPI *PFN_NT_QUERY_SYSTEM_INFORMATION)( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT OPTIONAL PULONG ReturnLength ); bool processMatchesName(size_t processID, const std::string &procName) { //Construct the memory structures, and load the DLLs needed to grab the win32 api constructs required size_t bufferSize = 102400; PSYSTEM_PROCESS_INFORMATION_DETAILD pspid= (PSYSTEM_PROCESS_INFORMATION_DETAILD) malloc (bufferSize); ULONG ReturnLength; PFN_NT_QUERY_SYSTEM_INFORMATION pfnNtQuerySystemInformation = (PFN_NT_QUERY_SYSTEM_INFORMATION) GetProcAddress (GetModuleHandle(TEXT("ntdll.dll")), "NtQuerySystemInformation"); //Grab the process ID stuff, expanding the buffer until we can do the job we need. while (true) { NTSTATUS status; status = pfnNtQuerySystemInformation (SystemProcessInformation, (PVOID)pspid, bufferSize, &ReturnLength); if (status == STATUS_SUCCESS) break; else if (status != STATUS_INFO_LENGTH_MISMATCH) { // 0xC0000004L return false; // error } bufferSize *= 2; pspid = (PSYSTEM_PROCESS_INFORMATION_DETAILD) realloc ((PVOID)pspid, bufferSize); } PSYSTEM_PROCESS_INFORMATION_DETAILD pspidBase; pspidBase=pspid; //FIXME: Hack. Program name under windows is PROGRAM_NAME + ".exe" const char *EXENAME="3Depict.exe"; //Loop through the linked list of process data structures while( (pspid=(PSYSTEM_PROCESS_INFORMATION_DETAILD)(pspid->NextEntryOffset + (PBYTE)pspid)) && pspid->NextEntryOffset) { //If the name exists, is not null, and its the PID we are looking for if(pspid->ImageName.Length && pspid->ImageName.Buffer && (size_t)pspid->UniqueProcessId == processID ) { //FIXME: I am unsure about the multibyte handling here. I think this *only* works if the program name is within the ASCII region of the codepage wchar_t *name = new wchar_t[pspid->ImageName.Length+1]; sprintf((char*)name,"%ls",pspid->ImageName.Buffer); if(!strcmp(EXENAME,(char*)name)) { delete[] name; free(pspidBase); return true; } delete[] name; } } free(pspidBase); } #endif void copyRGBAtoWXImage(unsigned int width, unsigned int height, const unsigned char *rgbaBuf, wxImage &image, const unsigned char *mask) { //wx image must have an alpha channel ASSERT(image.HasAlpha()); ASSERT(image.GetWidth() == width && image.GetHeight() == height); //FIXME: This will likely be very slow const unsigned char *p=rgbaBuf; for(unsigned int uj=0;ujIsExpanded(t); selected = treeCtrl->IsSelected(t); } TreePersistNode::TreePersistNode() = default; void TreePersist::saveTreeExpandState(wxTreeCtrl *treeCtrl) { treeState.clear(); buildPathMapping(treeCtrl, treeState); } //TODO: Limit copy/paste code shared between overloads void TreePersist::buildPathMapping(wxTreeCtrl *treeCtrl,std::map &retMap) { //DFS walker stack for wxwidgets' tree item IDs stack > treeIDs; { wxTreeItemId baseItem; baseItem=treeCtrl->GetRootItem(); //If tree is empty, then baseItem may not be OK if(!baseItem.IsOk()) return; //Start with wx root node treeIDs.push(make_pair("",baseItem)); } //Build the map<> containing the flattened path in the tree // and while(!treeIDs.empty()) { std::string pathStr; wxTreeItemId curItem; pathStr= treeIDs.top().first; curItem = treeIDs.top().second; ASSERT(curItem.IsOk()); treeIDs.pop(); if(treeCtrl->ItemHasChildren(curItem)) { wxTreeItemId tmp; wxTreeItemIdValue token; std::string baseStr; tmp = treeCtrl->GetFirstChild(curItem,token); baseStr = pathStr; //Push all children onto processing stack //similarly, push down the tree<> content while(tmp.IsOk()) { pathStr=baseStr+ string("/") + stlStr(treeCtrl->GetItemText(tmp)); while(retMap.find(pathStr) != retMap.end()) pathStr+=PATH_NONCE; retMap[pathStr]=TreePersistNode(treeCtrl,tmp); treeIDs.push(make_pair(pathStr,tmp)); tmp=treeCtrl->GetNextChild(curItem,token); } } } } void TreePersist::buildPathMapping(wxTreeCtrl *treeCtrl,std::map &retMap) { //DFS walker stack for wxwidgets' tree item IDs stack > treeIDs; //Start with wx root node treeIDs.push(make_pair("",treeCtrl->GetRootItem())); //Build the map<> containing the flattened path in the tree // and while(!treeIDs.empty()) { std::string pathStr; wxTreeItemId curItem; pathStr= treeIDs.top().first; curItem = treeIDs.top().second; treeIDs.pop(); if(treeCtrl->ItemHasChildren(curItem)) { wxTreeItemId tmp; wxTreeItemIdValue token; std::string baseStr; tmp = treeCtrl->GetFirstChild(curItem,token); baseStr = pathStr; //Push all children onto processing stack while(tmp.IsOk()) { wxString s; s=treeCtrl->GetItemText(tmp); pathStr=baseStr+ string("/"); pathStr+=stlStr(s); while(retMap.find(pathStr) != retMap.end()) pathStr+=PATH_NONCE; treeIDs.push(make_pair(pathStr,tmp)); retMap[pathStr] = tmp; tmp=treeCtrl->GetNextChild(curItem,token); } } } } void TreePersist::restoreTreeExpandState(wxTreeCtrl *treeCtrl) const { map treeMap; buildPathMapping(treeCtrl,treeMap); for(map::const_iterator it=treeMap.begin(); it!=treeMap.end(); ++it) { map::const_iterator stateIt; stateIt= treeState.find(it->first); //If the path is found, then restore the item state if(stateIt!=treeState.end()) { if(stateIt->second.expanded) treeCtrl->Expand(it->second); } } } 3Depict-0.0.22/src/wx/propertyGridUpdater.h0000644000175000017500000000507013305612111020062 0ustar pcuserpcuser/* * propertyGridUpdater.h - Update a propertgy grid, using 3depict backend data * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PROPERTYGRIDUPDATER_H #define PROPERTYGRIDUPDATER_H #include #include #include "backend/filter.h" #include "gui/dialogs/transferFuncDialog.h" #include const long PROPERTY_GRID_STYLE= wxPG_SPLITTER_AUTO_CENTER; const long PROPERTY_GRID_EXTRA_STYLE= wxPG_EX_HELP_AS_TOOLTIPS; //Build a property grid for the // The filter key is stored as a string in the property name, for // each grid item in the property. // Due to a wx bug, the grid cannot contain items and be shown // when passed ot this function // statestring contains the previous grid' state (also part of bug workaround) void updateFilterPropertyGrid(wxPropertyGrid *g, const Filter *f, const std::string &stateString=""); void updateCameraPropertyGrid(wxPropertyGrid *g, const Camera *c); //Convert the property grid value into a 3depict-usable string std::string getPropValueFromEvent(wxPropertyGridEvent &event); class wxPGTransferFunctionDialog : public wxPGEditorDialogAdapter { TransferEditorDialog *dlg; public: wxPGTransferFunctionDialog(wxWindow *win) : wxPGEditorDialogAdapter() { dlg = new TransferEditorDialog(win,wxID_ANY,"Transfer Function Editor"); } ~wxPGTransferFunctionDialog() {delete dlg;} bool DoShowDialog(wxPropertyGrid *pg, wxPGProperty *prop); }; class wxPGTransferFunctionProperty : public wxStringProperty { private: wxWindow *parentWin; public: wxPGTransferFunctionProperty(const wxString &label, const wxString &name , const wxString &value) : wxStringProperty(label,name,value) { parentWin=NULL; } void setParent(wxWindow *p) { parentWin=p;} const wxPGEditor* DoGetEditorClass() const { return wxPGEditor_TextCtrlAndButton;} virtual wxPGEditorDialogAdapter *GetEditorDialog() const { return new wxPGTransferFunctionDialog(parentWin); } }; #endif 3Depict-0.0.22/src/wx/propertyGridUpdater.cpp0000644000175000017500000002015613414250067020430 0ustar pcuserpcuser/* * propertyGridUpdater.cpp - Update a propertgy grid, using 3depict backend data * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "propertyGridUpdater.h" #include "wxcommon.h" #include "common/stringFuncs.h" #include "common/basics.h" //For colour property #include //workaround for decimal separator bug #include #include #include using std::vector; using std::string; void updateFilterPropertyGrid(wxPropertyGrid *g, const Filter *f, const string &stateString) { ASSERT(f); ASSERT(g); FilterPropGroup p; f->getProperties(p); #ifdef DEBUG //If debugging, test self consistency p.checkConsistent(); #endif g->Freeze(); g->Clear(); //Create the keys to add to the grid for(size_t ui=0;ui propGrouping; p.getGroup(ui,propGrouping); std::string title; p.getGroupTitle(ui,title); //Title must be present, or restorestate doesn't work correctly ASSERT(!title.empty()); //Set the name that is to be displayed for this grouping // of properties g->Append(new wxPropertyCategory(string("") + title,title)); //Set the children of this property for(size_t uj=0;uj choices; unsigned int selected; choiceStringToVector(fp.data,choices,selected); wxPGChoices pgChoices; for(unsigned int ui=0;uiSetAttribute(wxPG_FILE_WILDCARD,fp.dataSecondary); break; } case PROPERTY_TYPE_DIR: { pgp = new wxDirProperty(fp.name,keyStr,fp.data); break; } case PROPERTY_TYPE_TRANSFER_FUNCTION: { pgp = new wxPGTransferFunctionProperty(fp.name,keyStr,fp.data); ((wxPGTransferFunctionProperty*)pgp)->setParent(wxGetTopLevelParent(g)); break; }; default: ASSERT(false); } //Set the tooltip pgp->SetHelpString(fp.helpText); //add the property to the grid g->Append(pgp); if(fp.displayShaded) { wxColour c(240,240,255); pgp->SetBackgroundColour(c); } switch(fp.type) { case PROPERTY_TYPE_BOOL: { //if a bool property, use a checkbox to edit g->SetPropertyEditor(pgp,wxPGEditor_CheckBox); break; } default: ; } } } //Restore the selected property, if possible if(stateString.size()) g->RestoreEditableState(stateString); g->Thaw(); } void updateCameraPropertyGrid(wxPropertyGrid *g, const Camera *c) { ASSERT(c); ASSERT(g); g->Clear(); //Obtain the properties of the currently active camera CameraProperties p; c->getProperties(p); for(auto & prop : p.props) { for(unsigned int uj=0;uj choices; unsigned int selected; choiceStringToVector(camProp.data,choices,selected); wxPGChoices pgChoices; for(unsigned int ui=0;uiAppend(pgp); switch(camProp.type) { case PROPERTY_TYPE_BOOL: { g->SetPropertyEditor(pgp,wxPGEditor_CheckBox); break; } default: ; } } } } std::string getPropValueFromEvent(wxPropertyGridEvent &event) { std::string newValue; std::string eventType; eventType=event.GetValue().GetType(); if(eventType == "wxColour") { wxColour col; col << event.GetValue(); //Convert the colour to a string, so we can // send it to the backend. ColourRGBA rgba(col.Red(),col.Green(),col.Blue()); newValue=rgba.rgbString(); } else if (eventType == "long") { //So wx is a bit confused here // we can either be an integer property, OR // we can be an enum property. //integer property wxLongLong ll; ll=event.GetValue().GetLong(); const wxPGChoices &choices = event.GetProperty()->GetChoices(); if(!choices.IsOk()) { stream_cast(newValue,ll); } else { //So wx makes life hard here. We need to do a dance to get the selection // as a string unsigned int ul; ul=ll.ToLong(); wxArrayString arrStr; arrStr=choices.GetLabels(); newValue=arrStr[ul]; } } else { newValue = event.GetValue().GetString(); } return newValue; } bool wxPGTransferFunctionDialog::DoShowDialog(wxPropertyGrid *pg, wxPGProperty *prop) { string curTfn = prop->GetValue(); //Attempt t parse out a transfer function string std::vector > t; if(fromTransferFunctionString(curTfn,t)) dlg->graphPanel->setTransferFunction(t); if(dlg->ShowModal() == wxID_OK) { //Set the property usign a transfer function string string tFuncStr; tFuncStr=transferFunctionString(dlg->getTransferFunction()); prop->SetValueFromString(tFuncStr); SetValue(tFuncStr); return true; } else { prop->SetValue(curTfn); SetValue(curTfn); } //Failed to update return false; } 3Depict-0.0.22/src/wx/wxcommon.h0000644000175000017500000001377413451522513015734 0ustar pcuserpcuser/* * wxcommon.h - Common wxwidgets header stuff * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef WXCOMMON_H #define WXCOMMON_H #include #include #include #include #include "common/basics.h" #include "backend/tree.hh" //This function is adapted from //http://www.creatis.insa-lyon.fr/software/public/creatools/bbtk/v0_9_2/doc/doxygen/bbtk/bbtkWx_8h-source.html //Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux //Used under CeCILLB licence, limited liability and no warranty by authors. //http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html //This licence is compatible with GPL licence used in 3Depict. inline std::string stlStr(const wxString& s){ std::string s2; if(s.wxString::IsAscii()) { s2=s.wxString::ToAscii(); } else { const wxWX2MBbuf tmp_buf = wxConvCurrent->cWX2MB(s); const char *tmp_str = (const char*) tmp_buf; s2=std::string(tmp_str, strlen(tmp_str)); } return s2; } //-------- //Perform validation of a wx text control, adjusting appearance as needed // can pass an additional constraint function that needs to be satisfied (return true) // in order for validation to succeed template bool validateTextAsStream(wxTextCtrl *t, T &i, bool (*conditionFunc)(const T&)) { bool isOK; std::string s; s= stlStr(t->GetValue()); //string cannot be empty bool condition; condition = s.empty() || stream_cast(i,s); if(condition && conditionFunc) condition&=(*conditionFunc)(i); if(condition) { //OK, so bad things happened. Prevent the user from doing this isOK=false; //if it is bad and non-empty, highlight it as such // if it is empty, then just set it to normal colour if(s.empty()) t->SetBackgroundColour(wxNullColour); else t->SetBackgroundColour(*wxCYAN); } else { t->SetBackgroundColour(wxNullColour); isOK=true; } return isOK; } template bool validateTextAsStream(wxTextCtrl *t, T &i) { bool isOK; std::string s; s= stlStr(t->GetValue()); //string cannot be empty bool condition; condition = s.empty() || stream_cast(i,s); if(condition) { //OK, so bad things happened. Prevent the user from doing this isOK=false; //if it is bad and non-empty, highlight it as such // if it is empty, then just set it to normal colour if(s.empty()) t->SetBackgroundColour(wxNullColour); else t->SetBackgroundColour(*wxCYAN); } else { t->SetBackgroundColour(wxNullColour); isOK=true; } return isOK; } //-------- void wxErrMsg(wxWindow *, const std::string &title, const std::string &mesg); //locate the file we are looking for in OS specific paths. Returns empty string if file cannot be found std::string locateDataFile(const char *name); //Custom event for remote update thread posting extern wxEventType RemoteUpdateAvailEvent; //Custom event for signalling that a refresh is completed extern wxEventType RefreshCompleteEvent; //Return true IFF process ID and process name match running process bool processMatchesName(size_t processID, const std::string &procName); //Copy data into a wx image from an unpadded RGBA block of given width/eight // image sould already have been initialised, with RGBA and size void copyRGBAtoWXImage(unsigned int width, unsigned int height, const unsigned char *rgbaBuf, wxImage &image, const unsigned char *mask); //Combine an overlay using the alpha channel void combineWxImage(wxImage &base, const wxImage &overlay); //!Remote version thread checker, downloads RSS file from remote system and then // parses the file for the latest remote version number class VersionCheckThread : public wxThread { private: bool complete; bool retrieveOK; std::string versionStr; //Window to post event to upon completion wxWindow *targetWindow; wxURL url; public: VersionCheckThread(wxWindow *target); //!Used internally by wxwidgets to launch thread void *Entry(); //Returns true upon completion of thread. bool isComplete() const { return complete; } //Returns true if version string was retrieved successfully bool isRetrieveOK() const { return retrieveOK; } //Return the maximal version string obtained from the remote RSS feed std::string getVerStr() { return versionStr; } }; //Create a temporary filename, optionally providing an extension to use/ // - note that any subdirs will be automatically created if needed. std::string createTmpFilename(const char *dir=NULL,const char *extension=NULL); //Check if file can be written to, whether or not it exists bool canWriteToFile(const char *fName); //!storage node of tree persistence // - tree persistence means the state for // a tree in terms of expanded and not-expanded items class TreePersistNode { public: bool expanded,selected; //Contructor for node persistence TreePersistNode(); TreePersistNode(const wxTreeCtrl *ctrl,wxTreeItemId t); }; //!storage helper class for tree persistence // persistence - expanded and not-expanded items class TreePersist { private: std::map treeState; //Build path mapping for persistance node static void buildPathMapping(wxTreeCtrl *t, std::map &retMap); //Build path mapping for wx tree items static void buildPathMapping(wxTreeCtrl *t, std::map &retMap); public: //TODO: Const correctness void saveTreeExpandState(wxTreeCtrl *treeCtrl); void restoreTreeExpandState(wxTreeCtrl *treeCtrl) const; }; #endif 3Depict-0.0.22/src/wx/wxcomponents.h0000644000175000017500000001175313305612111016614 0ustar pcuserpcuser/* * wxcomponents.h - custom wxwidgets components * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef WXCOMPONENTS_H #define WXCOMPONENTS_H #if defined(_WIN32) || defined(_WIN64) //Required to resolve problem similar to bug 674 in wx, where CreateDialog macro is being defined // elsewhere #include #endif #include #include #include #include #include #include "backend/filtertree.h" //!3D combo grid renderer, from //http://nomadsync.cvs.sourceforge.net/nomadsync/nomadsync/src/EzGrid.cpp?view=markup (GPL) class wxGridCellChoiceRenderer : public wxGridCellStringRenderer { public: wxGridCellChoiceRenderer(wxLayoutAlignment border = wxLAYOUT_NONE) : m_border(border) {} virtual void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col, bool isSelected); virtual wxGridCellRenderer *Clone() const { return new wxGridCellChoiceRenderer; } private: wxLayoutAlignment m_border; }; class wxFastComboEditor : public wxGridCellChoiceEditor { public: wxFastComboEditor(const wxArrayString choices, bool allowOthers = FALSE) : wxGridCellChoiceEditor(choices, allowOthers), m_pointActivate(-1,-1) { SetClientData((void*)&m_pointActivate); } virtual void BeginEdit(int row, int col, wxGrid* grid); protected: wxPoint m_pointActivate; }; //!Update a wxTree control to layout according to the specified filter tree void upWxTreeCtrl(const FilterTree &filterTree, wxTreeCtrl *t, std::map &filterMap,std::vector &persistentFilters, const Filter *visibleFilt); //Subclassed wx tree ctrl to draw text in tree when empty class TextTreeCtrl : public wxTreeCtrl { private: std::vector messageStrs; public: TextTreeCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTR_HAS_BUTTONS, const wxValidator& validator = wxDefaultValidator, const wxString& name="treeCtrl") : wxTreeCtrl(parent,id,pos,size,style,validator,name) {}; virtual void OnTreePaint(wxPaintEvent &evt); void setMessages(const std::vector &msgs) { messageStrs=msgs;} DECLARE_EVENT_TABLE() }; //!Data container for tree object data class wxTreeUint : public wxTreeItemData { public: wxTreeUint(unsigned int v) : value(v) {}; unsigned int value; }; //!Data container for wxWidgets list object data class wxListUint : public wxClientData { public: wxListUint(unsigned int v) { value=v;}; unsigned int value; }; //A wx Grid with copy & paste support class CopyGrid : public wxGrid { public: CopyGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxWANTS_CHARS, const wxString& name = wxPanelNameStr); void currentCell(); void selectData(); //!Copy data to the clipboard void copyData(); //!Prompts user to save data to file, and then saves it. pops up error // dialog box if there is a problem. Data is tab deliminated void saveData(); virtual void OnKey(wxKeyEvent &evt); virtual ~CopyGrid(){}; DECLARE_EVENT_TABLE() }; //Type IDs for TTFFinder::suggestFontName enum { TTFFINDER_FONT_SANS, TTFFINDER_FONT_SERIF, TTFFINDER_FONT_MONO }; //A class to determine ttf file locations, in a best effort fashion class TTFFinder { private: //*n?x (FHS compliant) searching static std::string nxFindFont(const char *fontFile); //MS win. searching static std::string winFindFont(const char *fontFile); //Mac OS X searching static std::string macFindFont(const char *fontFile); public: //Given a ttf file name, search for it in several common paths static std::string findFont(const char *fontFile); //!Given an font type (Sans, serif etc) suggest a font name. //As long as function does not return empty std::string,, then index+1 is a valid //query (which may return empty std::string). Font names returned are a suggestion //only. Pass to findFont to confirm that a font file exists. static std::string suggestFontName(unsigned int fontType, unsigned int index) ; //!Returns a valid file that points to an installed ttf file, or an empty string //NOTE: TTF file is not checked for content validity! static std::string getBestFontFile(unsigned int type); }; #endif 3Depict-0.0.22/src/common/0000755000175000017500000000000013451744166014544 5ustar pcuserpcuser3Depict-0.0.22/src/common/basics.cpp0000644000175000017500000010611213414250067016504 0ustar pcuserpcuser/* * basics.cpp - basic functions header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "common/basics.h" #include "common/constants.h" #include "common/stringFuncs.h" #include "common/translation.h" #ifdef __APPLE__ #include #include #include #include #elif defined __linux__ //Needed for getting ram total usage under Linux #include #endif //Needed for stat call on posix systems #if !defined(__WIN32__) && !defined(__WIN64__) #include #include #endif #include #include using std::string; using std::vector; using std::list; //default font to use. std::string defaultFontFile; static char *oldLocaleStatic; static int localeStaticType; unsigned int getBitNum(unsigned int u) { ASSERT(u); unsigned int j=0; while(!(u &1) ) { u=u>>1; j++; } return j; } std::string boolStrEnc(bool b) { if(b) return "1"; else return "0"; } void pushLocale(const char *newLocale, int type) { ASSERT(!oldLocaleStatic); ASSERT(!localeStaticType); ASSERT(type == LC_NUMERIC || type == LC_MONETARY || type == LC_CTYPE || type == LC_COLLATE || type == LC_ALL || type == LC_TIME || type== LC_MESSAGES); oldLocaleStatic=setlocale(type,NULL); //setlocale reserves the right to trash the returned pointer // on subsequent calls (i.e. use the returned pointer for later) // thus we must duplicate the pointer to own it oldLocaleStatic=strdup(oldLocaleStatic); if(strcmp(oldLocaleStatic,newLocale)) { setlocale(type,newLocale); localeStaticType=type; } else { //record that we did not set this localeStaticType=-1; } } void popLocale() { if(localeStaticType != -1) setlocale(localeStaticType,oldLocaleStatic); localeStaticType=0; free(oldLocaleStatic); oldLocaleStatic=nullptr; } bool dummyCallback(bool) { return true; } void setDefaultFontFile(const std::string &font) { defaultFontFile=font; } std::string getDefaultFontFile() { return defaultFontFile; } //Compute the number of ticks require to achieve the void tickSpacingsFromInterspace(float start, float end, float interSpacing, std::vector &spacings) { ASSERT(interSpacing > sqrtf(std::numeric_limits::epsilon())); unsigned int nTicks; if(end < start) std::swap(end,start); nTicks=(unsigned int)((end-start)/interSpacing); if(!nTicks) { ASSERT(!spacings.size()); return; } spacings.resize(nTicks); for(unsigned int ui=0;ui &spacings) { if(!nTicks) { ASSERT(!spacings.size()); return; } spacings.resize(nTicks+1); float delta; delta= (end-start)/nTicks; for(unsigned int ui=0;ui=2*TIMESTOPS[ui]) { #ifdef DEBUG std::string s=(PLURAL_FUZZY_STRING[ui]); ASSERT(s.size()); #endif return TRANS(PLURAL_FUZZY_STRING[ui]); } //stop descending if ( delta>=TIMESTOPS[ui]) return TRANS(SINGLE_FUZZY_STRING[ui]); } return TRANS("moments ago"); } ColourRGBA::ColourRGBA() = default; ColourRGBA::ColourRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { data[0]=r; data[1]=g; data[2]=b; data[3]=a; } ColourRGBA::ColourRGBA(unsigned char r, unsigned char g, unsigned char b) { data[0]=r; data[1]=g; data[2]=b; } unsigned char ColourRGBA::at(unsigned int idx) const { ASSERT(idx< 4); return data[idx]; } unsigned char ColourRGBA::r() const { return data[0]; } unsigned char ColourRGBA::g() const { return data[1]; } unsigned char ColourRGBA::b() const { return data[2]; } unsigned char ColourRGBA::a() const { return data[3]; } bool ColourRGBA::parse(const std::string &str) { //Input string is in 2 char hex form, 3 or 4 colour, with # leading. RGB order //lowercase string. if(str.size() != 9 && str.size() != 7) return false; if(str[0] != '#') return false; string rS,gS,bS,aS; rS=str.substr(1,2); gS=str.substr(3,2); bS=str.substr(5,2); if(!isxdigit(rS[0]) || !isxdigit(rS[1])) return false; if(!isxdigit(gS[0]) || !isxdigit(gS[1])) return false; if(!isxdigit(bS[0]) || !isxdigit(bS[1])) return false; unsigned char r,g,b,a; hexStrToUChar(str.substr(1,2),r); hexStrToUChar(str.substr(3,2),g); hexStrToUChar(str.substr(5,2),b); //3 colour must have a=255. if(str.size() == 7) a = 255; else { aS=str.substr(7,2); if(!isxdigit(aS[0]) || !isxdigit(aS[1])) return false; hexStrToUChar(str.substr(7,2),a); } data[0]=r; data[1]=g; data[2]=b; data[3]=a; return true; } std::string ColourRGBA::rgbaString() const { std::string s="#", tmp; ucharToHexStr(data[0],tmp); s+=tmp; ucharToHexStr(data[1],tmp); s+=tmp; ucharToHexStr(data[2],tmp); s+=tmp; ucharToHexStr(data[3],tmp); s+=tmp; return s; } std::string ColourRGBA::rgbString() const { string tmp,s; s="#"; ucharToHexStr(data[0],tmp); s+=tmp; ucharToHexStr(data[1],tmp); s+=tmp; ucharToHexStr(data[2],tmp); s+=tmp; return s; } RGBf ColourRGBA::toFloat() const { RGBf ret; ret.red=(float)data[0]/255.0f; ret.green=(float)data[1]/255.0f; ret.blue=(float)data[2]/255.0f; return ret; } ColourRGBAf ColourRGBA::toRGBAf() const { ColourRGBAf tmp; for(unsigned int ui=0;ui<4;ui++) { tmp[ui] = (float)data[ui]/255.0f; } return tmp; } void ColourRGBA::fromRGBf(const RGBf &oth) { data[0]=oth.red*255.0f; data[1]=oth.green*255.0f; data[2]=oth.blue*255.0f; data[3]=255.0f; } bool ColourRGBA::operator==(const ColourRGBA &oth) const { for(unsigned int ui=0;ui<4;ui++) { if(data[ui] != oth.data[ui]) return false; } return true; } bool ColourRGBA::operator==(const ColourRGBAf &oth) const { for(unsigned int ui=0;ui<4;ui++) { if(data[ui] != oth.at(ui)) return false; } return true; } bool ColourRGBA::operator==(const RGBf &oth) const { return (data[0]/255.0f == oth.red && data[1]/255.0f == oth.green && data[2]/255.0f == oth.blue); } bool ColourRGBA::operator!=(const ColourRGBA &oth) const { return !(*this == oth); } bool ColourRGBA::operator!=(const ColourRGBAf &oth) const { return !(*this == oth); } ColourRGBAf::ColourRGBAf() = default; ColourRGBAf::ColourRGBAf(float r, float g, float b, float a) { ASSERT(r >=0 && r <=1.0f); ASSERT(g >=0 && g <=1.0f); ASSERT(b >=0 && b <=1.0f); ASSERT(a >=0 && a <=1.0f); data[0]=r; data[1]=g; data[2]=b; data[3]=a; } ColourRGBAf::ColourRGBAf(float r, float g, float b) { ASSERT(r >=0 && r <=1.0f); ASSERT(g >=0 && g <=1.0f); ASSERT(b >=0 && b <=1.0f); data[0]=r; data[1]=g; data[2]=b; data[3]=1.0f; } float ColourRGBAf::r() const { return data[0]; } float ColourRGBAf::g() const { return data[1]; } float ColourRGBAf::b() const { return data[2]; } float ColourRGBAf::a() const { return data[3]; } void ColourRGBAf::r(float v) { ASSERT(v >=0.0f && v <=1.0f); data[0]=v; } void ColourRGBAf::g(float v) { ASSERT(v >=0.0f && v <=1.0f); data[1]=v; } void ColourRGBAf::b(float v) { ASSERT(v >=0.0f && v <=1.0f); data[2]=v; } void ColourRGBAf::a(float v) { ASSERT(v >=0.0f && v <=1.0f); data[3]=v; } float &ColourRGBAf::operator[](unsigned int idx) { ASSERT(idx < 4); return data[idx]; } float ColourRGBAf::at(unsigned int idx) const { return data[idx]; } ColourRGBAf ColourRGBAf::interpolate(float delta, const ColourRGBAf &other) const { ColourRGBAf result; for(unsigned int ui=0;ui<4;ui++) result[ui] = data[ui] + (other.data[ui] - data[ui])*delta; return result; } void ColourRGBAf::copyToRGBArray(unsigned char *array) const { for(unsigned int ui=0;ui<3;ui++) array[ui] = data[ui]*255; } ColourRGBA ColourRGBAf::toColourRGBA() const { ColourRGBA tmp(data[0]*255.0f,data[1]*255.0f, data[2]*255.0f,data[3]*255.0f); return tmp; } RGBf ColourRGBAf::toRGBf() const { RGBf tmp; tmp.red=data[0]; tmp.green=data[1]; tmp.blue=data[2]; return tmp; } void ColourRGBAf::operator=(const RGBf &oth) { data[0]= oth.red; data[1]= oth.green; data[2]= oth.blue; data[3]= 1.0f; } bool ColourRGBAf::operator==(const ColourRGBA &oth) const { for(unsigned int ui=0;ui<3;ui++) { if(data[ui] != (float)oth.at(ui)/255.0f) return false; } return true; } bool ColourRGBAf::operator==(const ColourRGBAf &oth) const { for(unsigned int ui=0;ui<3;ui++) { if(data[ui] != (float)oth.data[ui]) return false; } return true; } bool ColourRGBAf::operator!=(const ColourRGBAf &oth) const { return !(*this == oth); } void getContrastingColour(float r, float g, float b, float &rCont, float &gCont, float &bCont) { //luma colour space - value is perceived brightness //https://en.wikipedia.org/wiki/HSV_color_space#Lightness float value= sqrt(0.299*r*r + 0.587*g*g + 0.114*b*b); //Clamp to 0-1 value=std::min(value,1.0f); value=std::max(value,0.0f); //Quick and dirty : white if background dark, black if not. if(value < 0.5) rCont=gCont=bCont=1.0f; else rCont=gCont=bCont=0.0f; /* TODO: We can pick a desired hue, and flip the value float hue,sat; float cMax = std::max(r,std::max(g,b)); float cMin = std::min(r,std::min(g,b)); float delta; delta = cMax-cMin; if(delta == 0) hue=0; else if ( cMax == r) { hue = ( mod((g -b)/delta,6.0f)); } else if (cMax == g) { hue = (b-r)/delta + 2; } else if (cMax == b) { hue = (r-g)/delta + 4; } hue*=60; if(value== 1.0f) sat = 0; else sat = delta/value; //OKAY, so we now have an HSV triplet */ } BoundCube::BoundCube(const Point3D &p1, const Point3D &p2) { for(unsigned int ui=0;ui<3;ui++) { valid[ui][0] = valid[ui][1] = true; bounds[ui][0] =std::min(p1[ui],p2[ui]); bounds[ui][1] =std::max(p1[ui],p2[ui]); } } void BoundCube::getBound(Point3D &retBound, unsigned int minMax) const { retBound=Point3D(bounds[0][minMax], bounds[1][minMax], bounds[2][minMax]); } float BoundCube::getBound(unsigned int bound, unsigned int minMax) const { ASSERT(bound <3 && minMax < 2); ASSERT(valid[bound][minMax]==true); return bounds[bound][minMax]; } void BoundCube::setBound(unsigned int bound, unsigned int minMax, float value) { ASSERT(bound <3 && minMax < 2); bounds[bound][minMax]=value; valid[bound][minMax]=true; } void BoundCube::setBounds(const std::vector &points) { setInverseLimits(); for(const auto & point : points) { for(unsigned int uj=0; uj<3; uj++) { if(point.getValue(uj) < bounds[uj][0]) { { bounds[uj][0] = point.getValue(uj); valid[uj][0]=true; } } if(point.getValue(uj) > bounds[uj][1]) { { bounds[uj][1] = point.getValue(uj); valid[uj][1]=true; } } } } #ifdef DEBUG for(const auto & point : points) { ASSERT(containsPt(point)); } #endif } void BoundCube::setBounds(const Point3D &p, float r) { for(unsigned int dim=0;dim<3;dim++) { bounds[dim][0] = p[dim] - r; bounds[dim][1] = p[dim] + r; valid[dim][0]=true; valid[dim][1]=true; } } void BoundCube::getVertices(std::vector &points, bool centre) const { points.resize(8); for(size_t ui=0;ui<8;ui++) points[ui]=getVertex(ui); if(centre) { Point3D centroid=getCentroid(); for(size_t ui=0;ui<8;ui++) points[ui]-=centroid; } } void BoundCube::getPlaneIntersectVertices(const Point3D &planeOrigin, const Point3D &normal, vector &intersectPts) const { //To visualise the connections, draw a cube, then label // each coordinate using a binary table like so: // idx x y z // 0 0 0 0 // 1 1 0 0 // etc .. //Now flatten the cube into a graph like so : // 0_________ 2 // | \4___6/ | ^ y+ -> // | | | | | x- // | 5---7 | // | / \ | // 1---------- 3 //Edges are between (idx - idx + 4) (idx <4) : 4 edges (diag) // and (idx, idx +2) (idx in 0,1,4,5) : 4 edges (across) // and (idx,idx+1) (idx in 0,2,4,6) : 4 edges (vertical) //Adjacency graph for cube edges const unsigned int eStartIdx[12] = { 0,1,2,3, 0,1,4,5, 0,2,4,6 }; const unsigned int eEndIdx[12] = { 4,5,6,7, 2,3,6,7, 1,3,5,7 }; for(unsigned int ui=0;ui<12;ui++) { Point3D eStart,eEnd; eStart = getVertex(eStartIdx[ui]); eEnd = getVertex(eEndIdx[ui]); float denom = (eEnd-eStart).dotProd(normal); //check for intersection. If line vector is perp to // plane normal, either is in plane, or no intersection // for our purpose, do not report intersections that are in-the-plane if(fabs(denom) < sqrtf(std::numeric_limits::epsilon())) continue; float numerator = (planeOrigin - eStart).dotProd(normal); float v; v= numerator/denom; if(v <=1.0f && v>=0.0f) intersectPts.push_back((eEnd-eStart)*v+ eStart); } vector killV; killV.resize(intersectPts.size(),false); //Eliminate duplicates //--- for(unsigned int ui=0;ui 3) { //Find the clockwise angle from the first vector (vertex-midpt) // to all the other vectors Point3D midPt = Point3D::centroid(intersectPts); vector > angles; angles.resize(intersectPts.size()); Point3D v1= intersectPts[0] - midPt; v1.normalise(); angles[0]=std::make_pair(0,0); for(unsigned int ui=0;ui newPts; newPts.resize(intersectPts.size()); for(unsigned int ui=0;ui> 1],bounds[2][(idx&4)>>2]); } void BoundCube::setInverseLimits(bool setValid) { bounds[0][0] = std::numeric_limits::max(); bounds[1][0] = std::numeric_limits::max(); bounds[2][0] = std::numeric_limits::max(); bounds[0][1] = -std::numeric_limits::max(); bounds[1][1] = -std::numeric_limits::max(); bounds[2][1] = -std::numeric_limits::max(); valid[0][0] =setValid; valid[1][0] =setValid; valid[2][0] =setValid; valid[0][1] =setValid; valid[1][1] =setValid; valid[2][1] =setValid; } bool BoundCube::isValid() const { for(unsigned int ui=0;ui<3; ui++) { if(!valid[ui][0] || !valid[ui][1]) return false; } return true; } bool BoundCube::isFlat() const { //Test the limits being inverted or equated for(auto bound : bounds) { if(fabs(bound[0] - bound[1]) < std::numeric_limits::epsilon()) return true; } return false; } bool BoundCube::isNumericallyBig() const { const float TOO_BIG=sqrtf(std::numeric_limits::max()); for(unsigned int ui=0;ui<2; ui++) { for(auto bound : bounds) { if(TOO_BIG < fabs(bound[ui])) return true; } } return false; } void BoundCube::expand(const BoundCube &b) { //Check both lower and upper limit. //Moving to other cubes value as needed if(!b.isValid()) return; for(unsigned int ui=0; ui<3; ui++) { if(b.bounds[ui][0] < bounds[ui][0]) { bounds[ui][0] = b.bounds[ui][0]; valid[ui][0] = true; } if(b.bounds[ui][1] > bounds[ui][1]) { bounds[ui][1] = b.bounds[ui][1]; valid[ui][1] = true; } } } void BoundCube::expand(const Point3D &p) { //If self not valid, ensure that it will be after this run for(unsigned int ui=0; ui<3; ui++) { //Check lower bound is lower to new pt if(bounds[ui][0] > p[ui]) bounds[ui][0] = p[ui]; //Check upper bound is upper to new pt if(bounds[ui][1] < p[ui]) bounds[ui][1] = p[ui]; } } void BoundCube::expand(float f) { //If self not valid, ensure that it will be after this run for(auto & bound : bounds) { //Check lower bound is lower to new pt bound[0]-=f; //Check upper bound is upper to new pt bound[1]+=f; } } void BoundCube::setBounds(const Point3D *p, unsigned int n) { bounds[0][0] = std::numeric_limits::max(); bounds[1][0] = std::numeric_limits::max(); bounds[2][0] = std::numeric_limits::max(); bounds[0][1] = -std::numeric_limits::max(); bounds[1][1] = -std::numeric_limits::max(); bounds[2][1] = -std::numeric_limits::max(); for(unsigned int ui=0;ui p[ui][uj]) { bounds[uj][0] = p[ui][uj]; valid[uj][0] = true; } if(bounds[uj][1] < p[ui][uj]) { bounds[uj][1] = p[ui][uj]; valid[uj][1] = true; } } } } void BoundCube::setBounds( const Point3D &p1, const Point3D &p2) { for(unsigned int ui=0; ui<3; ui++) { bounds[ui][0]=std::min(p1[ui],p2[ui]); bounds[ui][1]=std::max(p1[ui],p2[ui]); valid[ui][0]= true; valid[ui][1]= true; } } void BoundCube::getBounds(Point3D &low, Point3D &high) const { for(unsigned int ui=0; ui<3; ui++) { ASSERT(valid[ui][0] && valid[ui][1]); low.setValue(ui,bounds[ui][0]); high.setValue(ui,bounds[ui][1]); } } float BoundCube::getLargestDim() const { float f; f=getSize(0); f=std::max(getSize(1),f); return std::max(getSize(2),f); } bool BoundCube::containsPt(const Point3D &p) const { for(unsigned int ui=0; ui<3; ui++) { ASSERT(valid[ui][0] && valid[ui][1]); if(p.getValue(ui) < bounds[ui][0] || p.getValue(ui) > bounds[ui][1]) return false; } return true; } bool BoundCube::contains(const BoundCube &b) const { Point3D low,high; b.getBounds(low,high); return containsPt(low) && containsPt(high); } float BoundCube::getSize(unsigned int dim) const { ASSERT(dim < 3); #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[0][1] && valid [0][0]); } #endif return fabs(bounds[dim][1] - bounds[dim][0]); } Point3D BoundCube::getSize() const { #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[0][1] && valid [0][0]); } #endif Point3D p; for(unsigned int ui=0; ui<3; ui++) p[ui] = bounds[ui][1] -bounds[ui][0]; return p; } //checks intersection with sphere [centre,centre+radius) bool BoundCube::intersects(const Point3D &pt, float sqrRad) const { Point3D nearPt; //Find the closest point on the cube to the sphere for(unsigned int ui=0;ui<3;ui++) { if(pt.getValue(ui) <= bounds[ui][0]) { nearPt.setValue(ui,bounds[ui][0]); continue; } if(pt.getValue(ui) >=bounds[ui][1]) { nearPt.setValue(ui,bounds[ui][1]); continue; } nearPt.setValue(ui,pt[ui]); } //now test the distance from nrPt to pt //Note that the touching case is considered to be an intersection return (nearPt.sqrDist(pt) <=sqrRad); } BoundCube BoundCube::makeUnion(const BoundCube &bC) const { BoundCube res; for(unsigned int dim=0;dim<3;dim++) { float a,b; a=bounds[dim][0]; b=bC.bounds[dim][0]; res.setBound(dim,0,std::max(a,b)); a=bounds[dim][1]; b=bC.bounds[dim][1]; res.setBound(dim,1,std::min(a,b)); } return res; } unsigned int BoundCube::segmentTriple(unsigned int dim, float slice) const { ASSERT(dim < 3); //check lower if( slice < bounds[dim][0]) return 0; //check upper if( slice >=bounds[dim][1]) return 2; return 1; } Point3D BoundCube::getCentroid() const { #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[ui][1] && valid [ui][0]); } #endif return Point3D(bounds[0][1] + bounds[0][0], bounds[1][1] + bounds[1][0], bounds[2][1] + bounds[2][0])/2.0f; } float BoundCube::getMaxDistanceToBox(const Point3D &queryPt) const { #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[ui][1] && valid [ui][0]); } #endif float maxDistSqr=0.0f; //Set lower and upper corners on the bounding rectangle Point3D p[2]; p[0] = Point3D(bounds[0][0],bounds[1][0],bounds[2][0]); p[1] = Point3D(bounds[0][1],bounds[1][1],bounds[2][1]); //Count binary-wise selecting upper and lower limits, to enumerate all 8 vertices. for(unsigned int ui=0;ui<9; ui++) { maxDistSqr=std::max(maxDistSqr, queryPt.sqrDist(Point3D(p[ui&1][0],p[(ui&2) >> 1][1],p[(ui&4) >> 2][2]))); } return sqrtf(maxDistSqr); } bool BoundCube::containedInSphere(const Point3D &queryPt,float sqrDist) const { #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[ui][1] && valid [ui][0]); } #endif //Check all vertices for(unsigned int ui=0;ui<8; ui++) { if(queryPt.sqrDist(getVertex(ui)) > sqrDist) return false; } return true; } const BoundCube &BoundCube::operator=(const BoundCube &b) { for(unsigned int ui=0;ui<3; ui++) { for(unsigned int uj=0;uj<2; uj++) { valid[ui][uj] = b.valid[ui][uj]; bounds[ui][uj] = b.bounds[ui][uj]; } } return *this; } std::ostream &operator<<(std::ostream &stream, const BoundCube& b) { stream << "Bounds :Low ("; stream << b.bounds[0][0] << ","; stream << b.bounds[1][0] << ","; stream << b.bounds[2][0] << ") , High ("; stream << b.bounds[0][1] << ","; stream << b.bounds[1][1] << ","; stream << b.bounds[2][1] << ")" << std::endl; stream << "Bounds Valid: Low ("; stream << b.valid[0][0] << ","; stream << b.valid[1][0] << ","; stream << b.valid[2][0] << ") , High ("; stream << b.valid[0][1] << ","; stream << b.valid[1][1] << ","; stream << b.valid[2][1] << ")" << std::endl; return stream; } bool getFilesize(const char *fname, size_t &size) { std::ifstream f(fname,std::ios::binary); if(!f) return false; f.seekg(0,std::ios::end); size = f.tellg(); return true; } void UniqueIDHandler::clear() { idList.clear(); } unsigned int UniqueIDHandler::getPos(unsigned int id) const { for(auto it : idList) { if(id == it.second) return it.first; } ASSERT(false); return 0; } void UniqueIDHandler::killByPos(unsigned int pos) { for(auto it=idList.begin(); it!=idList.end(); ++it) { if(pos == it->first) { idList.erase(it); break; } } //Decrement the items, which were further along, in order to maintain the mapping for(auto & it : idList) { if( it.first > pos) it.first--; } } unsigned int UniqueIDHandler::getId(unsigned int pos) const { for(auto it : idList) { if(pos == it.first) return it.second; } ASSERT(false); return 0; } unsigned int UniqueIDHandler::genId(unsigned int pos) { //Look for each element number as a unique value in turn //This is guaranteed to return by the pigeonhole principle (we are testing //a target set (note <=)). for(unsigned int ui=0;ui<=idList.size(); ui++) { bool idTaken; idTaken=false; for(auto & it : idList) { if(ui == it.second) { idTaken=true; break; } } if(!idTaken) { idList.push_back(std::make_pair(pos,ui)); return ui; } } ASSERT(false); return 0; } void UniqueIDHandler::getIds(std::vector &idVec) const { //most wordy way of saying "spin through list" ever. for(auto it : idList) idVec.push_back(it.second); } #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #include //Windows.h is a nasty name clashing horrible thing. //Put it last to avoid clashing with std:: stuff (eg max & min) #endif // Total ram in MB int getTotalRAM() { #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) int ret; MEMORYSTATUS MemStat; // Zero structure memset(&MemStat, 0, sizeof(MemStat)); // Get RAM snapshot ::GlobalMemoryStatus(&MemStat); ret= MemStat.dwTotalPhys / (1024*1024); return ret; #elif __APPLE__ || __FreeBSD__ int ret; uint64_t mem; size_t len = sizeof(mem); sysctlbyname("hw.physmem", &mem, &len, NULL, 0); ret = (int)(mem/(1024*1024)); return ret; #elif __linux__ struct sysinfo sysInf; sysinfo(&sysInf); return ((size_t)(sysInf.totalram)*(size_t)(sysInf.mem_unit)/(1024*1024)); #else #error Unknown platform, no getTotalRAM function defined. #endif } size_t getAvailRAM() { #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) int ret ; MEMORYSTATUS MemStat; // Zero structure memset(&MemStat, 0, sizeof(MemStat)); // Get RAM snapshot ::GlobalMemoryStatus(&MemStat); ret= MemStat.dwAvailPhys / (1024*1024); return ret; #elif __APPLE__ || __FreeBSD__ int ret ; uint64_t memsize; size_t pagesize; mach_port_t sls_port = mach_host_self(); mach_msg_type_number_t vmCount = HOST_VM_INFO_COUNT; vm_statistics_data_t vm; kern_return_t error; error = host_statistics(sls_port , HOST_VM_INFO , (host_info_t) &vm, &vmCount); pagesize = (unsigned long)sysconf(_SC_PAGESIZE); memsize = (vm.free_count + vm.inactive_count) * pagesize;//(vm.wire_count + vm.active_count + vm.inactive_count + vm.free_count + vm.zero_fill_count ) * pagesize; ret = (size_t)(memsize/(1024*1024)); return ret; #elif __linux__ struct sysinfo sysInf; sysinfo(&sysInf); return ((size_t)(sysInf.freeram + sysInf.bufferram)*(size_t)(sysInf.mem_unit)/(1024*1024)); #else #error Unknown platform, no getAvailRAM function defined. #endif } bool strhas(const char *cpTest, const char *cpPossible) { while(*cpTest) { const char *search; search=cpPossible; while(*search) { if(*search == *cpTest) return true; search++; } cpTest++; } return false; } //A routine for loading numeric data from a text file unsigned int loadTextData(const char *cpFilename, vector > &dataVec,vector &headerVec, const char *delim) { const unsigned int BUFFER_SIZE=4096; char inBuffer[BUFFER_SIZE]; unsigned int num_fields=0; #if !defined(WIN32) && !defined(WIN64) if(isNotDirectory(cpFilename) == false) return ERR_FILE_OPEN; #endif dataVec.clear(); //Open a file in text mode std::ifstream CFile(cpFilename); if(!CFile) return ERR_FILE_OPEN; //Drop the headers, if any string str; vector strVec; bool atHeader=true; vector prevStrs; while(CFile.good() && !CFile.eof() && atHeader) { //Grab a line from the file if(!CFile.getline(inBuffer,BUFFER_SIZE)) break; if(!CFile.good()) return ERR_FILE_FORMAT; prevStrs=strVec; //Split the strings around the deliminator c splitStrsRef(inBuffer,delim,strVec); stripZeroEntries(strVec); //Skip blank lines or lines that are only spaces if(strVec.empty()) continue; num_fields = strVec.size(); dataVec.resize(num_fields); //Check to see if we are in the header if(atHeader) { //If we have the right number of fields //we might be not in the header anymore if(num_fields >= 1 && strVec[0].size()) { float f; //Assume we are not reading the header atHeader=false; vector values; //Confirm by checking all values for(unsigned int ui=0; ui> f; if(ss.fail()) return ERR_FILE_FORMAT; dataVec[ui].push_back(f); } //========= } //Grab a line from the file if(!CFile.getline(inBuffer,BUFFER_SIZE)) break; } return 0; } unsigned int loadTextStringData(const char *cpFilename, vector > &dataVec,const char *delim) { const unsigned int BUFFER_SIZE=4096; #if !defined(WIN32) && !defined(WIN64) if(isNotDirectory(cpFilename) == false) return ERR_FILE_OPEN; #endif //Open a file in text mode std::ifstream CFile(cpFilename); if(!CFile) return ERR_FILE_OPEN; dataVec.clear(); auto inBuffer= new char[BUFFER_SIZE]; //Grab a line from the file CFile.getline(inBuffer,BUFFER_SIZE); while(!CFile.eof()) { vector strVec; strVec.clear(); //Split the strings around the tab char splitStrsRef(inBuffer,delim,strVec); stripZeroEntries(strVec); //Check the number of fields //========= if(strVec.size()) dataVec.push_back(strVec); //========= //Grab a line from the file CFile.getline(inBuffer,BUFFER_SIZE); if(!CFile.good() && !CFile.eof()) { delete[] inBuffer; return ERR_FILE_FORMAT; } } delete[] inBuffer; return 0; } #if !defined(__WIN32__) && !defined(__WIN64) bool isNotDirectory(const char *filename) { struct stat statbuf; if(stat(filename,&statbuf) == -1) return false; return (statbuf.st_mode !=S_IFDIR); } bool rmFile(const std::string &filename) { return remove(filename.c_str()) == 0; } #elif defined(__WIN32) || defined(__WIN64) bool rmFile(const std::string &filename) { return DeleteFile((const wchar_t*)filename.c_str()) == 0; } #endif #ifdef DEBUG bool isValidXML(const char *filename) { //Debug check to ensure we have written a valid xml file std::string command; unsigned int result; //Windows doesn't really have a /dev/null device, rather it has a reserved file name "NUL" or "nul" //http://technet.microsoft.com/en-gb/library/cc961816.aspx #if defined(WIN32) || defined(WIN64) command = std::string("xmllint --version > NUL 2> NUL"); #else command = std::string("xmllint --version >/dev/null 2>/dev/null"); #endif result=system(command.c_str()); if(!result) { //Windows' shell handles escapes differently, workaround #if defined(WIN32) || defined(WIN64) command = std::string("xmllint --noout \"") + filename + string("\""); #else command = std::string("xmllint --noout \'") + filename + string("\'"); #endif result=system(command.c_str()); return result ==0; } #if !(defined(WIN32) || defined(WIN64)) //Debug check ineffective - don't bother warning under windows, as the binary // is unlikely to be present. WARN(!result,"xmllint not installed in system PATH, cannot perform debug check") #endif return true; } bool BoundCube::test() { //Try to obtain the plane intersections BoundCube b(Point3D(0,0,0),Point3D(1,1,1)); vector pts; b.getPlaneIntersectVertices( Point3D(0.5,0.5,0.5),Point3D(0,0,1),pts); TEST(pts.size() == 4,"plane intersect test"); for(auto & pt : pts) { TEST(EQ_TOL(pt[2],0.5),"intersect test"); } pts.clear(); b.getPlaneIntersectVertices( Point3D(0.5,0.5,0.5),Point3D(1,1,0),pts); TEST(pts.size() == 4,"plane intersect test"); for(auto & pt : pts) { TEST( (EQ_TOL(pt[2],0) || EQ_TOL(pt[2],1)) ,"intersect test"); } pts.clear(); b.getPlaneIntersectVertices( Point3D(0.95,0.95,0.95),Point3D(1,1,1),pts); TEST(pts.size() == 3,"plane intersect test"); return true; } bool runBasicsTests() { if(!BoundCube::test()) return false; return true; } #endif 3Depict-0.0.22/src/common/pngread.c0000644000175000017500000002151113414250067016317 0ustar pcuserpcuser/* * Copyright (C) 2002 Thomas Schumm * Modifications 2012 D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef __cplusplus extern "C" { #endif #include "pngread.h" #include int check_if_png(const char *file_name, FILE **fp, unsigned int bytes_to_check) { char buf[bytes_to_check]; /* Open the prospective PNG file. */ if ((*fp = fopen(file_name, "rb")) == NULL) return 0; /* Read in some of the signature bytes */ if (fread(buf, 1, bytes_to_check, *fp) != bytes_to_check) { fclose(*fp); return 0; } /* Compare the first PNG_BYTES_TO_CHECK bytes of the signature. Return nonzero (true) if they match */ return(!png_sig_cmp((png_byte*)buf, (png_size_t)0, bytes_to_check)); } /* Read a PNG file. Returns 0 on success. Must destroy output with * free_pngrowpointers */ int read_png(FILE *fp, unsigned int sig_read, png_bytep **row_pointers, png_uint_32 *width, png_uint_32 *height) /* file is already open */ { png_structp png_ptr; png_infop info_ptr; /* png_uint_32 width, height; */ int bit_depth, color_type, interlace_type; /* Create and initialize the png_struct with the desired error handler * functions. If you want to use the default stderr and longjump method, * you can supply NULL for the last three parameters. We also supply the * the compiler header file version, so that we know if the application * was compiled with a compatible version of the library. REQUIRED */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png_ptr == NULL) { fclose(fp); return (-1); } /* Allocate/initialize the memory for image information. REQUIRED. */ info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { fclose(fp); png_destroy_read_struct(&png_ptr, NULL, NULL); return (-1); } /* Set error handling if you are using the setjmp/longjmp method (this is * the normal method of doing things with libpng). REQUIRED unless you * set up your own error handlers in the png_create_read_struct() earlier. */ if (setjmp(png_jmpbuf(png_ptr))) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(fp); /* If we get here, we had a problem reading the file */ return (-1); } /* One of the following I/O initialization methods is REQUIRED */ /* Set up the input control if you are using standard C streams */ png_init_io(png_ptr, fp); /* If we have already read some of the signature */ png_set_sig_bytes(png_ptr, sig_read); /* OK, you're doing it the hard way, with the lower-level functions */ /* The call to png_read_info() gives us all of the information from the * PNG file before the first IDAT (image data chunk). REQUIRED */ png_read_info(png_ptr, info_ptr); /* png_get_IHDR pulls useful data out of info_ptr. */ png_get_IHDR(png_ptr, info_ptr, width, height, &bit_depth, &color_type, &interlace_type, NULL, NULL); /* Set up the data transformations you want. Note that these are all * optional. Only call them if you want/need them. Many of the * transformations only work on specific types of images, and many * are mutually exclusive. */ /* tell libpng to strip 16 bit/color files down to 8 bits/color */ if (bit_depth == 16) png_set_strip_16(png_ptr); /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single * byte into separate bytes (useful for paletted and grayscale images). */ if (bit_depth < 8) png_set_packing(png_ptr); /* Expand paletted colors into true RGB triplets */ if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); /* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) { //From libpng-manual.txt: // // The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. // ... // The png_set_gray_1_2_4_to_8() function is deprecated. // .. // If you need to support versions prior to libpng-1.5.4 test the version number // as illustrated below using "PNG_LIBPNG_VER >= 10504" #if PNG_LIBPNG_VER >= 10209 png_set_expand_gray_1_2_4_to_8(png_ptr); #else png_set_gray_1_2_4_to_8(png_ptr); #endif } /* Expand paletted or RGB images with transparency to full alpha for RGBA */ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); /* Expand grayscale images to RGB */ if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); /* Strip alpha bytes from the input data without combining with the * background (not recommended). png_set_strip_alpha(png_ptr); */ /* Set the background color to draw transparent and alpha images over. * It is possible to set the red, green, and blue components directly * for paletted images instead of supplying a palette index. Note that * even if the PNG file supplies a background, you are not required to * use it - you should use the (solid) application background if it has one. */ /* png_color_16 my_background; */ /*, *image_background; */ /* use black for now */ /* my_background.red = my_background.green = my_background.blue = 0; */ /* if (png_get_bKGD(png_ptr, info_ptr, &image_background)) png_set_background(png_ptr, image_background, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); else */ /* use black by default */ /* png_set_background(png_ptr, &my_background, */ /* PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); */ /* Some suggestions as to how to get a screen gamma value */ /* Note that screen gamma is the display_exponent, which includes * the CRT_exponent and any correction for viewing conditions */ /* this should be user configurable somehow... */ double screen_gamma = 2.2; /* A good guess for a PC monitors in a dimly lit room */ /* screen_gamma = 1.7; or 1.0; */ /* A good guess for Mac systems */ /* Tell libpng to handle the gamma conversion for you. The final call * is a good guess for PC generated images, but it should be configurable * by the user at run time by the user. It is strongly suggested that * your application support gamma correction. * 0.45455 is a "guess" for images with no particular gamma */ int intent; if (png_get_sRGB(png_ptr, info_ptr, &intent)) png_set_gamma(png_ptr, screen_gamma, 0.45455); else { double image_gamma; if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) png_set_gamma(png_ptr, screen_gamma, image_gamma); else png_set_gamma(png_ptr, screen_gamma, 0.45455); } png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); /* Optional call to gamma correct and add the background to the palette * and update info structure. REQUIRED if you are expecting libpng to * update the palette for you (ie you selected such a transform above). */ png_read_update_info(png_ptr, info_ptr); /* Allocate the memory to hold the image using the fields of info_ptr. */ /* The easiest way to read the image: */ if (!(*row_pointers = (png_byte**)malloc(*height * sizeof(png_bytep)))) { fclose(fp); return (-1); } unsigned int row; for (row = 0; row < *height; row++) { (*row_pointers)[row] = (png_byte*)malloc(png_get_rowbytes(png_ptr,info_ptr)); } /* Read the entire image in one go */ png_read_image(png_ptr, *row_pointers); /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ png_read_end(png_ptr, info_ptr); /* At this point you have read the entire image */ /* clean up after the read, and free any memory allocated - REQUIRED */ png_destroy_read_struct(&png_ptr, &info_ptr, NULL); /* close the file */ fclose(fp); /* that's it */ return (0); } void free_pngrowpointers(png_bytep *row_pointers, png_uint_32 height) { unsigned int row; for (row = 0; row < height; row++) free(row_pointers[row]); //FIXME : Should this be png_free ?? free(row_pointers); } #ifdef __cplusplus }; #endif 3Depict-0.0.22/src/common/assertion.cpp0000644000175000017500000000343613305612110017242 0ustar pcuserpcuser/* * common/assertion.h - Program assertion header * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "assertion.h" #include #ifdef DEBUG void userAskAssert(const char * const filename, const unsigned int lineNumber) { static bool skipAll=false; std::cerr << "ASSERTION ERROR!" << std::endl; std::cerr << "Filename: " << filename << std::endl; std::cerr << "Line number: " << lineNumber << std::endl; if(skipAll) { std::cerr << "\tContinuing, as previously requested" << std::endl; return; } std::cerr << "Do you wish to continue? - (y)es/(n)o/(a)lways -"; char y = '_'; while (y != 'n' && y != 'y' && y!= 'a') std::cin >> y; if (y == 'n') exit(1); if(y == 'a') skipAll=true; } //DEBUG NaN and INF #ifdef __linux__ #ifdef DEBUG #include void trapfpe (bool doTrap) { if(doTrap) { feenableexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW); } else { fedisableexcept((FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW)); } } bool getTrapfpe() { return fegetexcept() & (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW); } #endif #else void trapfpe(bool doTrap) { } bool getTrapfpe() { return false; } #endif #endif 3Depict-0.0.22/src/common/endianTest.h0000644000175000017500000000422013305612110016766 0ustar pcuserpcuser/* * endianttest.h - Platform endian testing * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _ENDIAN_TEST_H_ #define _ENDIAN_TEST_H_ #if defined (_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #define __LITTLE_ENDIAN__ #else #ifdef __linux__ #include #endif #endif #include #ifdef __BYTE_ORDER //if both are not defined it is TRUE! // on F28 ppc64, is defined as __ORDER_BIG_ENDIAN #if (__BYTE_ORDER == __BIG_ENDIAN) || (__BYTE_ORDER == __ORDER_BIG_ENDIAN) #ifndef __BIG_ENDIAN__ #define __BIG_ENDIAN__ #endif #elif __BYTE_ORDER == __LITTLE_ENDIAN #ifndef __LITTLE_ENDIAN__ #define __LITTLE_ENDIAN__ #endif #elif __BYTE_ORDER == __PDP_ENDIAN #ifndef __ARM_ENDIAN__ #define __ARM_ENDIAN__ #endif #else #error "Endian determination failed" #endif #endif const int ENDIAN_TEST=1; //Run-time detection inline int is_bigendian() { return (*(char*)&ENDIAN_TEST) == 0 ;} inline int is_littleendian() { return (*(char*)&ENDIAN_TEST) == 1 ;} //this may fail on some compilers?? inline void floatSwapBytes(float *inFloat) { //Use a union to avoid strict-aliasing error union FloatSwapUnion{ float f; char c[4]; } ; FloatSwapUnion fa,fb; fa.f = *inFloat; fb.c[0] = fa.c[3]; fb.c[1] = fa.c[2]; fb.c[2] = fa.c[1]; fb.c[3] = fa.c[0]; *inFloat=fb.f; } inline void uint16_tSwapBytes(uint16_t *inShort) { //Use a union to avoid strict-aliasing error union Uint16SwapUnion{ uint16_t s; char c[2]; } ; Uint16SwapUnion sa,sb; sa.s = *inShort; sb.c[0] = sa.c[1]; sb.c[1] = sa.c[0]; *inShort=sb.s; } #endif 3Depict-0.0.22/src/common/mathfuncs.cpp0000644000175000017500000007067213414250067017243 0ustar pcuserpcuser/* * mathfuncs.cpp - Miscellaneous mathematical functions implementation. * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "../config.h" #include "common/basics.h" #include "common/stringFuncs.h" #include #include using std::string; using std::vector; const int MBIG = std::numeric_limits::max(); void Point3D::copyValueArr(float *valArr) const { ASSERT(valArr); //compiler should unroll this automatically for(unsigned int ui=0; ui<3; ui++) { *(valArr+ui) = *(value+ui); } } float Point3D::operator[](unsigned int ui) const { ASSERT(ui < 3); return value[ui]; } float &Point3D::operator[](unsigned int ui) { ASSERT(ui < 3); return value[ui]; } bool Point3D::operator==(const Point3D &pt) const { return (value[0] == pt.value[0] && value[1] == pt.value[1] && value[2] == pt.value[2]); } const Point3D &Point3D::operator=(const Point3D &pt) { value [0] = pt.value[0]; value [1] = pt.value[1]; value [2] = pt.value[2]; return *this; } const Point3D &Point3D::operator+=(const Point3D &pt) { for(unsigned int ui=0;ui<3; ui++) value[ui]+= pt.value[ui]; return *this; } const Point3D &Point3D::operator-=(const Point3D &pt) { for(unsigned int ui=0;ui<3; ui++) value[ui]-= pt.value[ui]; return *this; } const Point3D Point3D::operator+(const Point3D &pt) const { Point3D ptTmp; for(unsigned int ui=0;ui<3; ui++) ptTmp.value[ui] = value[ui] + pt.value[ui]; return ptTmp; } const Point3D Point3D::operator+(float f) const { Point3D pTmp; for(unsigned int ui=0;ui<3; ui++) pTmp.value[ui] = value[ui] + f; return pTmp; } const Point3D Point3D::operator-(const Point3D &pt) const { Point3D ptTmp; for(unsigned int ui=0;ui<3; ui++) ptTmp.value[ui] = value[ui] - pt.value[ui]; return ptTmp; } const Point3D Point3D::operator-() const { Point3D ptTmp; for(unsigned int ui=0;ui<3; ui++) ptTmp.value[ui] = -value[ui]; return ptTmp; } const Point3D &Point3D::operator*=(const float scale) { value[0] = value[0]*scale; value[1] = value[1]*scale; value[2] = value[2]*scale; return *this; } const Point3D Point3D::operator*(float scale) const { Point3D tmpPt; tmpPt.value[0] = value[0]*scale; tmpPt.value[1] = value[1]*scale; tmpPt.value[2] = value[2]*scale; return tmpPt; } const Point3D Point3D::operator*(const Point3D &pt) const { Point3D tmpPt; tmpPt.value[0] = value[0]*pt[0]; tmpPt.value[1] = value[1]*pt[1]; tmpPt.value[2] = value[2]*pt[2]; return tmpPt; } const Point3D Point3D::operator/(float scale) const { Point3D tmpPt; scale = 1.0f/scale; tmpPt.value[0] = value[0]*scale; tmpPt.value[1] = value[1]*scale; tmpPt.value[2] = value[2]*scale; return tmpPt; } const Point3D Point3D::operator/(const Point3D &pt) const { Point3D tmpPt; for(unsigned int ui=0;ui<3;ui++) tmpPt.value[ui] = value[ui]/pt[ui]; return tmpPt; } float Point3D::sqrDist(const Point3D &pt) const { return (pt.value[0]-value[0])*(pt.value[0]-value[0])+ (pt.value[1]-value[1])*(pt.value[1]-value[1])+ (pt.value[2]-value[2])*(pt.value[2]-value[2]); } float Point3D::dotProd(const Point3D &pt) const { //Return the inner product return value[0]*pt.value[0] + value[1]*pt.value[1] + value[2]*pt.value[2]; } Point3D Point3D::crossProd(const Point3D &pt) const { Point3D cross; cross.value[0] = (pt.value[2]*value[1] - pt.value[1]*value[2]); cross.value[1] = -(value[0]*pt.value[2] - pt.value[0]*value[2]); cross.value[2] = (value[0]*pt.value[1] - value[1]*pt.value[0]); return cross; } bool Point3D::insideBox(const Point3D &farPoint) const { return (value[0] < farPoint.value[0] && value[0] >=0) && (value[1] < farPoint.value[1] && value[1] >=0) && (value[2] < farPoint.value[2] && value[2] >=0); } bool Point3D::insideBox(const Point3D &lowPt,const Point3D &highPt) const { return (value[0] < highPt.value[0] && value[0] >=lowPt.value[0]) && (value[1] < highPt.value[1] && value[1] >=lowPt.value[1]) && (value[2] < highPt.value[2] && value[2] >=lowPt.value[2]); } //This is different to +=, because it generates no return value void Point3D::add(const Point3D &obj) { value[0] = obj.value[0] + value[0]; value[1] = obj.value[1] + value[1]; value[2] = obj.value[2] + value[2]; } void Point3D::extend(float distance) { ASSERT(sqrMag() > 0.0f); Point3D p; p=*this; p.normalise(); *this+=p*distance; } float Point3D::sqrMag() const { return value[0]*value[0] + value[1]*value[1] + value[2]*value[2]; } float Point3D::mag() const { return sqrtf(sqrMag()); } Point3D Point3D::normalise() { float mag = sqrtf(sqrMag()); value[0]/=mag; value[1]/=mag; value[2]/=mag; return *this; } void Point3D::negate() { value[0] = -value[0]; value[1] = -value[1]; value[2] = -value[2]; } float Point3D::angle(const Point3D &pt) const { #ifndef EQ_TOL #define EQ_TOL(f,g) (fabs( (f) - (g)) < sqrtf(std::numeric_limits::epsilon())) #endif //Check for near degenerate case. Acos does not appreciate small arguments in the dot product. if( EQ_TOL(pt.value[0] , value[0]) && EQ_TOL(pt.value[1] , value[1]) && EQ_TOL(pt.value[2] , value[2]) ) return 0; double param = dotProd(pt)/sqrtf(sqrMag()*pt.sqrMag()); //trap the domain - on some systems, there are tolerance problems here if(param > 1.0f || param < -1.0f) return M_PI; else return acos(param); } void Point3D::sphericalAngles(float &theta, float &phi) const { float sqrVal=sqrMag(); theta=acos(value[2]/sqrtf(sqrVal)); //phi phi=atan2(value[1],value[0]); #ifdef DEBUG static bool amRecursing; if(amRecursing) return; amRecursing=true; //Check that the definition of the spherical coordinates matches Point3D retreived(sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta)); float tmpTheta,tmpPhi; retreived.sphericalAngles(tmpTheta,tmpPhi); ASSERT(EQ_TOL(tmpTheta,theta)); ASSERT(EQ_TOL(tmpPhi,phi)); retreived*=sqrtf(sqrVal); for(unsigned int ui=0;ui<3;ui++) { ASSERT(EQ_TOL(retreived[ui] ,value[ui])); } amRecursing=false; #endif } void Point3D::setISOSpherical(float theta, float phi, float r) { value[0] = r*sin(theta)*cos(phi); value[1] = r*sin(theta)*sin(phi); value[2] = r*cos(theta); } bool Point3D::orthogonalise(const Point3D &pt) { Point3D crossp; crossp=this->crossProd(pt); //They are co-linear, or near-enough to be not resolvable. if(crossp.sqrMag() < sqrtf(std::numeric_limits::epsilon())) return false; crossp.normalise(); crossp=crossp.crossProd(pt); *this=crossp.normalise()*sqrtf(this->sqrMag()); return true; } Point3D Point3D::centroid(const Point3D *p, unsigned int n) { ASSERT(p); Point3D centroid(0,0,0); /* This code should work, but is not profiled. No caller uses this code at time of writing. #ifdef _OPENMP //Parallel version //-- vector centroids(omp_get_max_threads(),Point3D(0,0,0)); #pragma omp parallel for for(size_t ui=0;ui &p) { Point3D centroid(0,0,0); for(unsigned int ui=0;ui'); //Two strings must be in sync std::string allowableStartChars, allowableEndChars; allowableStartChars="([{<'"; allowableEndChars=")]}>'"; //Find the start/end chars size_t startPos,endPos; startPos=allowableStartChars.find(tmpStr[0]); endPos=allowableEndChars.find(tmpStr[tmpStr.size()-1]); //Strip the start/end chars if(startPos !=std::string::npos && endPos != std::string::npos) tmpStr=tmpStr.substr(1,tmpStr.size()-1); else if (startPos !=endPos) return false; //we had one start bracket, but not the other... //First try splitting with non-whitespace separators, // there should be exactly 3 components vector components; const char *NONWHITE_SEPARATOR=",;|_"; splitStrsRef(tmpStr.c_str(),NONWHITE_SEPARATOR, components); if(components.size()!=3) return false; components.clear(); //Now try splitting with whitespace components, dropping empty // strings. As we have already checked the non-whitespace components // additional components must be whitespace only, which is fine. const char *ALLOWABLE_SEPARATORS=",; \t|_"; splitStrsRef(tmpStr.c_str(),ALLOWABLE_SEPARATORS, components); for(auto & component : components) component=stripWhite(component); //Drop the blank bits from the field vector::iterator rmIt; rmIt=std::remove(components.begin(),components.end(),string("")); components.erase(rmIt,components.end()); if(components.size()!=3) return false; float p[3]; for(size_t ui=0;ui<3;ui++) { if(stream_cast(p[ui],components[ui])) return false; } if(!polarNotation) setValueArr(p); else { //r,theta,phi, as users should input // //Convert from degrees to radiians p[1]*=M_PI/180; p[2]*=M_PI/180; //set spherical co-ordinates setISOSpherical(p[1],p[2],p[0]); } return true; } void Point3D::switchEndian() { floatSwapBytes(&value[0]); floatSwapBytes(&value[1]); floatSwapBytes(&value[2]); } std::ostream& operator<<(std::ostream &stream, const Point3D &pt) { stream << "(" << pt.value[0] << "," << pt.value[1] << "," << pt.value[2] << ")"; return stream; } void Point3D::transform3x3(const float *matrix) { for(unsigned int ui=0;ui<3;ui++) { value[ui] = value[ui]*matrix[ui*3] + value[ui]*matrix[ui*3+1] + value[ui]*matrix[ui*3+2]; } } RandNumGen::RandNumGen() { //Initialisation is NOT performed here, because we need a random seed //to generate our sequence.... //we don't initially have Gaussian //value to spare haveGaussian=false; } void RandNumGen::initialise(int seed) { long mj,mk; //initialise ma[55] with seed mj=labs((MBIG-labs(seed))); mj%=MBIG; ma[55]=mj; mk=1; //Initialise the rest of the table for(unsigned int i=1; i<55; i++) { int ii; ii=(21*i)%55; ma[ii]=mk; mk=mj-mk; if(mk<0) mk+=MBIG; mj=ma[ii]; } //"warm up" the rng for(unsigned int j=1;j<=4;j++) { for(unsigned int i=1;i<=55;i++) { ma[i] -=ma[1+ (i+30)%55]; if(ma[i] < 0) ma[i]+=MBIG; } } //the constant 31 is special inext=0; inextp=31; } float RandNumGen::genUniformDev() { long mj; if(++inext==56) inext=1; if(++inextp == 56) inextp=1; mj=ma[inext]-ma[inextp]; if(mj<0) mj+=MBIG; ma[inext]=mj; return mj*(1.0/MBIG); } int RandNumGen::genInt() { long mj; if(++inext==56) inext=1; if(++inextp == 56) inextp=1; mj=ma[inext]-ma[inextp]; if(mj<0) mj+=MBIG; ma[inext]=mj; return mj; } //This is known as the Box-Muller transform //You can change it from being a uniform variance //by simply multiplying by the std deviation of your choice //this will cause the random number returned to be stretched //in the x axis from unit variance to your number float RandNumGen::genGaussDev() { float v1,v2,rsq,fac; //This algorithm generates //two Gaussian numbers from two Uniform Devs, //however we only want one. So to speed things up //remember the second and spit it out as required if(haveGaussian) { haveGaussian=false; return gaussSpare; } do { //grab two uniform Devs and //move them into (-1,+1) domain v1=2.0f*genUniformDev()-1.0f; v2=2.0f*genUniformDev()-1.0f; rsq=v1*v1+v2*v2; //reject them if they don't lie in unit circle //or if rsq is at the origin of the unit circle //(as eqn below is undefined at origin) }while(rsq>=1.0f || rsq==0.0f); fac=sqrtf(-2.0f*log(rsq)/rsq); gaussSpare=v1*fac; haveGaussian=true; return v2*fac; } int RandNumGen::initTimer() { timeval tp; gettimeofday(&tp,NULL); initialise(tp.tv_sec+ tp.tv_usec); return tp.tv_sec + tp.tv_usec; } //quaternion multiplication, assuming q2 has no "a" component void quat_mult_no_second_a(Quaternion *result, const Quaternion *q1, const Quaternion *q2) { result->a = (-q1->b*q2->b-q1->c*q2->c -q1->d*q2->d); result->b = (q1->a*q2->b +q1->c*q2->d -q1->d*q2->c); result->c = (q1->a*q2->c -q1->b*q2->d +q1->d*q2->b); result->d = (q1->a*q2->d +q1->b*q2->c -q1->c*q2->b ); } //this is a little optimisation that doesn't calculate the "a" component for //the returned quaternion, and implicitly performs conjugation. //Note that the result is specific to quaternion rotation void quat_pointmult(Point3f *result, const Quaternion *q1, const Quaternion *q2) { result->fx = (-q1->a*q2->b +q1->b*q2->a -q1->c*q2->d +q1->d*q2->c); result->fy = (-q1->a*q2->c +q1->b*q2->d +q1->c*q2->a -q1->d*q2->b); result->fz = (-q1->a*q2->d -q1->b*q2->c +q1->c*q2->b +q1->d*q2->a); } //Inefficient Point3D version void quat_rot(Point3D &p, const Point3D &r, float angle) { Point3f pP,rR; pP.fx =p[0]; pP.fy =p[1]; pP.fz =p[2]; rR.fx =r[0]; rR.fy =r[1]; rR.fz =r[2]; quat_rot(&pP,&rR,angle); p[0] = pP.fx; p[1] =pP.fy; p[2] = pP.fz; } //Uses quaternion mathematics to perform a rotation around your favourite axis //IMPORTANT: Rotvec must be normalised before passing to this function //failure to do so will have weird results. //For better performance on multiple rotations, use other function //Note result is stored in returned point void quat_rot(Point3f *point, const Point3f *rotVec, float angle) { ASSERT(rotVec->fx*rotVec->fx + rotVec->fy*rotVec->fy + rotVec->fz*rotVec->fz - 1.0f < 5.0f*sqrtf(std::numeric_limits::epsilon())); double sinCoeff; Quaternion rotQuat; Quaternion pointQuat; Quaternion temp; //remember this value so we don't recompute it #ifdef _GNU_SOURCE double cosCoeff; //GNU provides sincos which is about twice the speed of sin/cos separately sincos(angle*0.5f,&sinCoeff,&cosCoeff); rotQuat.a=cosCoeff; #else angle*=0.5f; sinCoeff=sin(angle); rotQuat.a = cos(angle); #endif rotQuat.b=sinCoeff*rotVec->fx; rotQuat.c=sinCoeff*rotVec->fy; rotQuat.d=sinCoeff*rotVec->fz; // pointQuat.a =0.0f; This is implied in the pointQuat multiplication function pointQuat.b = point->fx; pointQuat.c = point->fy; pointQuat.d = point->fz; //perform rotation quat_mult_no_second_a(&temp,&rotQuat,&pointQuat); quat_pointmult(point, &temp,&rotQuat); } //TODO: Make as efficient as possible void quat_rot_array(Point3D *pointArr, unsigned int n, const Point3f *rotVec, float angle) { Point3f *fArr; fArr = new Point3f[n]; for(size_t ui=0;uifx*rotVec->fx + rotVec->fy*rotVec->fy + rotVec->fz*rotVec->fz - 1.0f < 5.0f*sqrtf(std::numeric_limits::epsilon())); double sinCoeff; //remember this value so we don't recompute it #ifdef _GNU_SOURCE double cosCoeff; //GNU provides sincos which is about twice the speed of sin/cos separately sincos(angle*0.5f,&sinCoeff,&cosCoeff); rotQuat.a=cosCoeff; #else angle*=0.5f; sinCoeff=sin(angle); rotQuat.a = cos(angle); #endif rotQuat.b=sinCoeff*rotVec->fx; rotQuat.c=sinCoeff*rotVec->fy; rotQuat.d=sinCoeff*rotVec->fz; for(unsigned int ui=0;uifx*rotVec->fx + rotVec->fy*rotVec->fy + rotVec->fz*rotVec->fz - 1.0f < 5.0f*sqrtf(std::numeric_limits::epsilon())); double sinCoeff; #ifdef _GNU_SOURCE double cosCoeff; //GNU provides sincos which is about twice the speed of sin/cos separately sincos(angle*0.5f,&sinCoeff,&cosCoeff); rotQuat->a=cosCoeff; #else angle*=0.5f; sinCoeff=sin(angle); rotQuat->a = cos(angle); #endif rotQuat->b=sinCoeff*rotVec->fx; rotQuat->c=sinCoeff*rotVec->fy; rotQuat->d=sinCoeff*rotVec->fz; } //Use previously generated quats from quat_get_rot_quats to rotate a point void quat_rot_apply_quat(Point3f *point, const Quaternion *rotQuat) { Quaternion pointQuat,temp; // pointQuat.a =0.0f; No need to set this, as we do not use it in the multiplication function pointQuat.b = point->fx; pointQuat.c = point->fy; pointQuat.d = point->fz; //perform rotation quat_mult_no_second_a(&temp,rotQuat,&pointQuat); quat_pointmult(point, &temp,rotQuat); } //Invert the given quaternion (this for example, can generate the inverse rotation) void quat_invert(Quaternion *quat) { quat->b=-quat->b; quat->c=-quat->c; quat->d=-quat->d; } //For the table to work, we need the sizeof(size_T) at preprocess time #ifndef SIZEOF_SIZE_T #error sizeof(size_t) macro is undefined... At time of writing, this is usually 4 (32 bit) or 8. You can work it out from a simple C++ program which prints out sizeof(size_t). This cant be done automatically due to preprocessor behaviour. #endif //Maximum period linear shift register values (computed by //other program for Galois polynomial) //Unless otherwise noted, all these entries have been verified using the //verifyTable routine. // //If you don't trust me, (who doesn't trust some random person on the internet?) //you can re-run the verification routine. // //Note that verification time *doubles* with every entry, so full 64-bit verification //is computationally intensive. I achieved 40 bits in half a day. 48 bits took over a week. size_t maximumLinearTable[] = { 0x03, 0x06, 0x0C, 0x14, 0x30, 0x60, 0xb8, 0x0110, 0x0240, 0x0500, 0x0e08, 0x1c80, 0x3802, 0x6000, 0xb400, 0x12000, 0x20400, 0x72000, 0x90000, 0x140000, 0x300000, 0x420000, 0xD80000, 0x1200000, 0x3880000, 0x7200000, 0x9000000, 0x14000000, 0x32800000, 0x48000000, #if (SIZEOF_SIZE_T > 4) 0xA3000000, 0x100080000, 0x262000000, 0x500000000, 0x801000000, 0x1940000000, 0x3180000000, 0x4400000000, 0x9C00000000, 0x12000000000, 0x29400000000, 0x63000000000, 0xA6000000000, 0x1B0000000000, 0x20E000000000, 0x420000000000, 0x894000000000, //Maximal linear table entries below line are unverified //Verifying the full table might take a few months of computing time //But who needs to count beyond 2^49-1 (~10^14) anyway?? 0x1008000000000, //Really, there are more entries beyond this, but I consider it pretty much not worth the effort. #endif }; void LinearFeedbackShiftReg::setMaskPeriod(unsigned int newMask) { //Don't fall off the table ASSERT((newMask-3) < sizeof(maximumLinearTable)/sizeof(size_t)); maskVal=maximumLinearTable[newMask-3]; //Set the mask to be all ones totalMask=0; for(size_t ui=0;ui> 1) ^ ( (-(lfsr & (ull)(1u))) & maskVal ); lfsr&=totalMask; if( lfsr == 0u) lfsr=1u; return lfsr; } double det3by3(const double *ptArray) { return (ptArray[0]*(ptArray[4]*ptArray[8] - ptArray[7]*ptArray[5]) - ptArray[1]*(ptArray[3]*ptArray[8] - ptArray[6]*ptArray[5]) + ptArray[2]*(ptArray[3]*ptArray[7] - ptArray[4]*ptArray[6])); } //Determines the volume of a quadrilateral pyramid //input points "planarpts" must be adjacent (connected) by //0 <-> 1 <-> 2 <-> 0, all points connected to apex double pyramidVol(const Point3D *planarPts, const Point3D &apex) { //Array for 3D simplex volumed determination // | (a_x - b_x) (b_x - c_x) (c_x - d_x) | //v_simplex =1/6| (a_y - b_y) (b_y - c_y) (c_y - d_y) | // | (a_z - b_z) (b_z - c_z) (c_z - d_z) | double simplexA[9]; //simplex A (a,b,c,apex) is as follows //a=planarPts[0] b=planarPts[1] c=planarPts[2] simplexA[0] = (double)( (planarPts[0])[0] - (planarPts[1])[0] ); simplexA[1] = (double)( (planarPts[1])[0] - (planarPts[2])[0] ); simplexA[2] = (double)( (planarPts[2])[0] - (apex)[0] ); simplexA[3] = (double)( (planarPts[0])[1] - (planarPts[1])[1] ); simplexA[4] = (double)( (planarPts[1])[1] - (planarPts[2])[1] ); simplexA[5] = (double)( (planarPts[2])[1] - (apex)[1] ); simplexA[6] = (double)( (planarPts[0])[2] - (planarPts[1])[2] ); simplexA[7] = (double)( (planarPts[1])[2] - (planarPts[2])[2] ); simplexA[8] = (double)( (planarPts[2])[2] - (apex)[2] ); return 1.0/6.0 * (fabs(det3by3(simplexA))); } void computeRotationMatrix(const Point3D &ur1, const Point3D &ur2, const Point3D &r1, const Point3D &r2, gsl_matrix *m) { //TRIAD algorithm, for determining rotation matrix from two // linearly independant vector pairs. // This is a specific case of "Wahba's Problem", where no noise is present //unrotated and rotated vectors should be linearly independant ASSERT(ur1.crossProd(ur2).sqrMag() < 0.001); ASSERT(r1.crossProd(r2).sqrMag() < 0.001); //vectors should be pre-normalised // ASSERT(TOL_EQ(ur1.sqrMag(),1) && TOL_EQ(ur2.sqrMag(),1)); // ASSERT(TOL_EQ(r1.sqrMag(),1) && TOL_EQ(r2.sqrMag(),1)); // ASSERT(gsl_matrix_num_rows(m) == 3); // ASSERT(gsl_matrix_num_cols(m) == 3); Point3D rCross,urCross; rCross = r1.crossProd(r2); urCross = ur1.crossProd(r2); gsl_matrix *a,*b; a = gsl_matrix_alloc(3,3); b = gsl_matrix_alloc(3,3); for(unsigned int ui=0;ui<3;ui++) { //build A matrix, row by row gsl_matrix_set(a,ui,0,ur1[ui]); gsl_matrix_set(a,ui,1,ur2[ui]); gsl_matrix_set(a,ui,2,urCross[ui]); //build B^T matrix, row by row gsl_matrix_set(b,0,ui,r1[ui]); gsl_matrix_set(b,1,ui,r2[ui]); gsl_matrix_set(b,2,ui,rCross[ui]); } //Compute m = a*b; gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, a, b, 0.0, m); gsl_matrix_free(a); gsl_matrix_free(b); } void rotateByMatrix(const vector &vpts, const gsl_matrix *m, vector &r) { r.resize(vpts.size()); gsl_vector *v = gsl_vector_alloc(3); gsl_vector *rv = gsl_vector_alloc(3); for(unsigned int ui=0;ui=1) { //Remap to be inside triangle, as the // vector sum lies in a parallelogram, but // not in the triangle r = 1-r; s= 1-s; } return origin + sideV1*r + sideV2*s; } void scatterPointsInPolygon(const vector &polygon, const Point3D &normal, float scatterDensity, RandNumGen &rng, vector &result) { ASSERT(polygon.size() > 2); //Find the area of the polygon Point3D centroid; centroid = Point3D::centroid(polygon); //Keep track of the relative area of each triangle, // and its vectors vector weights; vector > triVecs; weights.resize(polygon.size()); triVecs.resize(polygon.size()); float area=0; for(unsigned int ui=0;ui::epsilon())) return; //normalise the weight to total area, // and accumulate float cumSum=0.0f;; for(float & weight : weights) { weight/=area; cumSum+=weight; weight=cumSum; } unsigned int nScatter = ceil(scatterDensity*area); result.resize(nScatter); for(unsigned int ui=0;ui &pts, const Point3D &normal, const Point3D &origin, Quaternion &q) { //Move all points to origin; for(size_t ui=0;ui::epsilon())) return; //Compute rotation axis Point3D rotateAxis = normal.crossProd(Point3D(0,0,1)); rotateAxis.normalise(); Point3f ra; ra.fx=rotateAxis[0]; ra.fy=rotateAxis[1]; ra.fz=rotateAxis[2]; quat_get_rot_quat(&ra,rotateAngle,&q); //perform in-place rotation for(unsigned int ui=0;ui &pts,Quaternion &q) { //perform in-place rotation for(unsigned int ui=0;ui 0.0f) || (dot1 > 0.0f && dot2 < 0.0f) ) return POINTDIR_IN_COMMON; if( dot1 < 0.0f && dot2 <0.0f ) return POINTDIR_APART; ASSERT(dot1 > 0.0f && dot2 > 0.0f ); return POINTDIR_TOGETHER; } #ifdef DEBUG bool testMathfuncs() { Point3D p1,p2,n; p1=Point3D(1,0,0); p2=Point3D(0,1,0); n=Point3D(0,0,1); TEST( EQ_TOL(clockwiseAngle(p1,p2,n), M_PI/2.0f),"clockwise angle test"); p2=Point3D(1,1,0); TEST( EQ_TOL(clockwiseAngle(p1,p2,n), M_PI/4.0f),"clockwise angle test"); p2=Point3D(-1,1,0); TEST( EQ_TOL(clockwiseAngle(p1,p2,n), M_PI/2.0f + M_PI/4.0f),"clockwise angle test"); p2=Point3D(-1,-1,0); TEST( EQ_TOL(clockwiseAngle(p1,p2,n), M_PI + M_PI/4.0f),"clockwise angle test"); return true; } #endif 3Depict-0.0.22/src/common/stringFuncs.cpp0000644000175000017500000003430613414250067017552 0ustar pcuserpcuser/* * stringFuncs.cpp - string manipulation routines * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "common/stringFuncs.h" #include "common/basics.h" #include #include #include using std::string; using std::vector; using std::pair; std::string getMaxVerStr(const std::vector &verStrings) { vector verNumList; //break string up into numeric components for(const auto & verString : verStrings) { unsigned int verNumber; if(!parseVersion(verString,verNumber)) continue; verNumList.push_back(verNumber); } unsigned int maxV=0; unsigned int maxP=(unsigned int)-1; for(unsigned int ui=0;ui maxV) { maxP=ui; maxV=verNumList[ui]; } } if(maxP == (unsigned int)-1) return std::string(""); return verStrings[maxP]; } unsigned int getVersionNumber(unsigned int major, unsigned int minor, unsigned int revision) { ASSERT(minor < 100 && revision < 100); return major*100*100 + minor*100 + revision; } bool isVersionNumberString(const std::string &s) { for(unsigned int ui=0;ui strVerNum; // period or hyphen are valid version number separators splitStrsRef(s.c_str(),".-",strVerNum); //reverse, so we are parsing from the right-most version number std::reverse(strVerNum.begin(),strVerNum.end()); unsigned int number=0; //Check to see if we can interpret the values unsigned int factor=1; for(unsigned int uj=0;uj=100) return false; number +=(i*factor); } version=number; return true; } bool boolStrDec(const std::string &s, bool &b) { std::string tmp; tmp=stripWhite(s); if(tmp == "0") b=false; else if(tmp == "1") b=true; else return false; // Failed to decode return true; } void splitFileData(const std::string &fileWithPath, std::string &path, std::string &basename, std::string &extension) { path.clear(); basename.clear(); extension.clear(); if(fileWithPath.empty()) return; basename= onlyFilename(fileWithPath); path = onlyDir(fileWithPath); unsigned int extPosition=(unsigned int)-1; for(unsigned int ui=basename.size();ui--;) { if(basename[ui] =='.') { extPosition=ui; break; } } if(extPosition != (unsigned int)-1) { extension = basename.substr(extPosition+1,basename.size()-(extPosition+1)); basename = basename.substr(0,extPosition); } } std::string onlyFilename( const std::string& path) { #if defined(_WIN32) || defined(_WIN64) //windows uses "\" as path sep, just to be different return path.substr( path.find_last_of( '\\' ) +1 ); #else //The entire world, including the interwebs, uses "/" as the path sep. return path.substr( path.find_last_of( '/' ) +1 ); #endif } std::string onlyDir( const std::string& path) { #if defined(_WIN32) || defined(_WIN64) //windows uses "\" as path sep, just to be different return path.substr(0, path.find_last_of( '\\' ) +1 ); #else //The entire world, including the interwebs, uses "/" as the path sep. return path.substr(0, path.find_last_of( '/' ) +1 ); #endif } std::string convertFileStringToCanonical(const std::string &s) { //We call unix the "canonical" format. //otherwise we substitute "\"s for "/"s #if (__WIN32) || (__WIN64) string r; for(unsigned int ui=0;ui= '0' && s[0] <= '9') || (s[0] >= 'a' && s[0] <= 'f')); ASSERT((s[1] >= '0' && s[1] <= '9') || (s[1] >= 'a' && s[1] <= 'f')); int high,low; if(s[0] <= '9' && s[0] >='0') high = s[0]-(int)'0'; else high = s[0] -(int)'a' + 10; if(s[1] <= '9' && s[1] >='0') low = s[1]-(int)'0'; else low = s[1] -(int)'a' + 10; c = 16*high + low; } std::string digitString(unsigned int thisDigit, unsigned int maxDigit) { std::string s,thisStr; stream_cast(thisStr,thisDigit); stream_cast(s,maxDigit); for(unsigned int ui=0;ui > comboString, unsigned int curChoice) { ASSERT(curChoice < comboString.size()) string s,sTmp; stream_cast(sTmp,curChoice); s=sTmp + string(":"); for(unsigned int ui=0;ui > &colWithOffset) { vector > tmp; tmp=colWithOffset; //Ensure the transfer function x-value is monotonically increasing ComparePairFirst cmpF; std::sort(tmp.begin(),tmp.end(),cmpF); std::string res,tmpS; for(unsigned int ui=0; ui > &colWithOffset) { vector components; splitStrsRef(s.c_str(),'|',components); if(!components.size()) return false; colWithOffset.clear(); for(unsigned int ui=0;ui colPair; vector thisCompStrVec; splitStrsRef(components[ui].c_str(),',',thisCompStrVec); //Should be 5 vector if(thisCompStrVec.size() %5) return false; for(unsigned int uj=0;uj &sVec) { //Create a truncated vector and reserve mem. std::vector tVec; tVec.reserve(sVec.size()); std::string s; for(unsigned int ui=0;ui &v ) { const char *thisMark, *lastMark; string str; v.clear(); //check for null string if(!*cpStr) return; thisMark=cpStr; lastMark=cpStr; while(*thisMark) { if(*thisMark==delim) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); thisMark++; lastMark=thisMark; } else thisMark++; } if(thisMark!=lastMark) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); } } //Split strings around any of a string of delimiters void splitStrsRef(const char *cpStr, const char *delim,std::vector &v ) { const char *thisMark, *lastMark; string str; v.clear(); //check for null string if(!(*cpStr)) return; thisMark=cpStr; lastMark=cpStr; while(*thisMark) { //Loop over possible delimiters to determine if this char is a delimiter bool isDelim; const char *tmp; tmp=delim; isDelim=false; while(*tmp) { if(*thisMark==*tmp) { isDelim=true; break; } tmp++; } if(isDelim) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); thisMark++; lastMark=thisMark; } else thisMark++; } if(thisMark!=lastMark) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); } } //!Returns Choice ID from string (see choiceString(...) for string format) //FIXME: Does not work if the choicestring starts from a number other than zero... std::string getActiveChoice(const std::string &choiceString) { size_t colonPos; colonPos = choiceString.find(":"); ASSERT(colonPos!=string::npos); //Extract active selection string tmpStr; tmpStr=choiceString.substr(0,colonPos); unsigned int activeChoice; stream_cast(activeChoice,tmpStr); //Convert ID1|string 1, .... IDN|string n to vectors std::string s; s=choiceString.substr(colonPos,choiceString.size()-colonPos); vector choices; splitStrsRef(s.c_str(),',',choices); ASSERT(activeChoice < choices.size()); tmpStr = choices[activeChoice]; return tmpStr.substr(tmpStr.find("|")+1,tmpStr.size()-1); } void choiceStringToVector(const std::string &choiceString, std::vector &choices, unsigned int &selected) { ASSERT(isMaybeChoiceString(choiceString)); //Convert ID1|string 1, .... IDN|string n to vectors, // stripping off the ID value size_t colonPos; colonPos = choiceString.find(":"); std::string s; s=choiceString.substr(colonPos,choiceString.size()-colonPos); splitStrsRef(s.c_str(),',',choices); for(auto & choice : choices) { choice=choice.substr( choice.find("|")+1,choice.size()-1); } string tmpStr; tmpStr=choiceString.substr(0,colonPos); stream_cast(selected,tmpStr); ASSERT(selected < choices.size()); } #ifdef DEBUG //Returns false if string fails heuristic test for being a choice string // failure indicates definitely not a choice string, success guarantees nothing bool isMaybeChoiceString(const std::string &s) { if(s.size() < 3) return false; if(!isdigit(s[0])) return false; if(s[1] == '|') return false; size_t colonPos; colonPos = s.find(":"); if(colonPos == std::string::npos || colonPos == s.size() || colonPos < 1) return false; return true; } bool testStringFuncs() { TEST(isMaybeChoiceString("1:0|Box only,1|Tick,2|Dimension"),"choice string"); //Test getMaxVerStr { vector verStrs; verStrs.emplace_back("0.0.9"); verStrs.emplace_back("0.0.10"); TEST(getMaxVerStr(verStrs) == "0.0.10","version string maximum testing"); verStrs.clear(); verStrs.emplace_back("0.0.9"); verStrs.emplace_back("0.0.9"); TEST(getMaxVerStr(verStrs) == "0.0.9","version string maximum testing"); verStrs.emplace_back("0.0.9"); verStrs.emplace_back("0.0.blah"); TEST(getMaxVerStr(verStrs) == "0.0.9","version string maximum testing"); } #if !(defined(__WIN32) || defined(__WIN64)) { string filename; filename="/path/blah.dir/basefile.test.ext"; string a,b,c; splitFileData(filename, a,b,c); TEST(a == "/path/blah.dir/","path split"); TEST(b == "basefile.test","basename split"); TEST(c == "ext","extension split"); } #endif //Test hex conversion string s=intToHex(1); ASSERT(s.size() ==8); ASSERT(s.find_first_not_of("ABCDEF0123456789") == std::string::npos); return true; } #endif 3Depict-0.0.22/src/common/basics.h0000644000175000017500000005266013414425501016156 0ustar pcuserpcuser/* * common/basics.h - Basic functionality header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef BASICS_H #define BASICS_H //!Basic objects header file #include #include #if (_MSC_VER >= 1600) || (__cplusplus > 199711L) #define HAVE_CPP_1X #endif //C-style Array size macro #ifdef HAVE_CPP_1X template constexpr unsigned int THREEDEP_ARRAYSIZE(T (&)[s]) { return s; } #else #define THREEDEP_ARRAYSIZE(f) (sizeof (f) / sizeof(*f)) #endif //macro to switch between normal bool and atomic, as available. // do *NOT* declare const ATOMIC_BOOLs. This has wierd CPU caching // assumptions, which cause the type to not work properly if not using // true atomics #ifndef ATOMIC_BOOL #ifdef HAVE_CPP_1X // Killed? By an ATOMIC bool? No sir, I guess I don't take // much solace that the implosion trigger // functioned perfectly. //This bool is reliable for attempting to perform inter-thread flagging. #include #define ATOMIC_BOOL std::atomic #else //C++ <1X does not provide a truly safe bool type. Most implementations it seems to work though (provided you don't use const). #define ATOMIC_BOOL bool #endif #endif #include "mathfuncs.h" #include "common/assertion.h" #include #include #include #include #include class K3DTree; //Set new locale code. Must be followed by a popLocale call before completion // Only one locale type can be pushed at a time this way void pushLocale(const char *newLocale, int type); //Restore old locale code void popLocale(); //C file peek function inline int fpeek(FILE *stream) { int c; c = fgetc(stream); ungetc(c, stream); return c; } inline bool XOR(bool a, bool b) { return a == !b; } template bool rangesOverlap( const T &minA, const T &maxA, const T &minB, const T &maxB) { ASSERT(minA <= maxA); ASSERT(minB<=maxB); // A- B- A+ // A- B+ A+ if( (minA <= minB && maxA >=minB ) || (minA<=maxB && maxA >=maxB) ) return true; // B- A- B+ // B- A+ B+ if(( minB <= minA && maxB >=minA ) || (minB<=maxA && maxB >=maxA) ) return true; return false; } //!Text file loader errors enum { ERR_FILE_OPEN=1, ERR_FILE_FORMAT, ERR_FILE_NUM_FIELDS, ERR_FILE_ENUM_END // not an error, just end of enum }; //Exclusive or operator template bool xorFunc(const T a, const T b) { return (a || b) && !(a && b); } //Perform a a<-b<-c<-a rotation of data template void rotate3(T &a, T &b, T &c) { T tmp; tmp=a; a=b; b=c; c=tmp; } //Find the min/max value within an array //array must be nonzero sized template T maxValue(const T *t, size_t n) { ASSERT(n); T maxV=t[0]; for(size_t ui=1;ui T minValue(const T *t, size_t n) { ASSERT(n); T minV=t[0]; for(size_t ui=1;ui bool hasFirstInPairVec(const std::vector > &v, const std::pair &r) { for(size_t ui=0;ui &spacings); void tickSpacingsFromFixedNum(float start, float end, unsigned int nTicks, std::vector &spacings); //!Get a "human-like" version of the time elapsed between new and original time period std::string veryFuzzyTimeSince( time_t origTime, time_t newTime); //!A routine for loading numeric data from a text file. Returns 0 on success unsigned int loadTextData(const char *cpFilename, std::vector > &dataVec, std::vector &header,const char *delim); //!Load non-numeric data from a text file into ragged array, using specified delimiters unsigned int loadTextStringData(const char *cpFilename, std::vector > &dataVec, const char *delim); template bool writeTextFile(const char *cpFilename, const std::vector > &dataVec, const char delim='\t') { std::ofstream f(cpFilename); if(!f) return false; for(unsigned int ui=0;ui bool stream_cast(T1 &result, const T2 &obj) { std::stringstream ss; ss << obj; ss >> result; return ss.fail(); } //!Replace first instance of marker with null terminator void nullifyMarker(char *buffer, char marker); //retrieve the active bit in a power of two sequence unsigned int getBitNum(unsigned int u); //!A class to manage "tear-off" ID values, to allow for indexing without knowing position. //You simply ask for a new unique ID. and it maintains the position->ID mapping // as position could change if an element was removed, but ID cannot //TODO: Extend to any unique type, rather than just int (think iterators..., pointers) class UniqueIDHandler { private: //!position-ID pairings std::list > idList; public: //!Generate a unique ID value, storing the position ID pair unsigned int genId(unsigned int position); //!Remove a uniqueID using its position void killByPos(unsigned int position); //!Get the position from its unique ID unsigned int getPos(unsigned int id) const; //!Get the uniqueID from the position unsigned int getId(unsigned int pos) const; //!Get all unique IDs void getIds(std::vector &idvec) const; //!Clear the mapping void clear(); //!Get the number of elements stored unsigned int size() const {return idList.size();}; }; //!Get total filesize in bytes bool getFilesize(const char *fname, size_t &size); //!get total ram in MB int getTotalRAM(); //!Get available ram in MB size_t getAvailRAM(); //!Determine if a given path is a not a directory, bool isNotDirectory(const char *filename); bool rmFile(const std::string & filename); #ifdef DEBUG bool isValidXML(const char *filename); #endif class ComparePairFirst { public: template bool operator()(const std::pair< T1, T2 > &p1, const std::pair &p2) const { return p1.first< p2.first; } }; class ComparePairSecond { public: template bool operator()(const std::pair< T1, T2 > &p1, const std::pair &p2) const { return p1.second< p2.second; } }; class ComparePairFirstReverse { public: template bool operator()(const std::pair< T1, T2 > &p1, const std::pair &p2) const { return p1.first> p2.first; } }; //! A helper class to define a bounding cube class BoundCube { //!bounding values (x,y,z) (lower,upper) float bounds[3][2]; //!Is the cube set? bool valid[3][2]; public: BoundCube() { setInvalid(); } //Declare copy constructor BoundCube(const BoundCube &) = default; //Declare move constructor BoundCube(BoundCube &&) = default; BoundCube(const Point3D &p1, const Point3D &p2); BoundCube(const std::vector &pts) { setBounds(pts); } void setBounds(float xMin,float yMin,float zMin, float xMax,float yMax,float zMax) { bounds[0][0]=xMin; bounds[1][0]=yMin; bounds[2][0]=zMin; bounds[0][1]=xMax; bounds[1][1]=yMax; bounds[2][1]=zMax; valid[0][0]=true; valid[1][0]=true; valid[2][0]=true; valid[0][1]=true; valid[1][1]=true; valid[2][1]=true; } void setBounds(const BoundCube &b) { for(unsigned int ui=0;ui<3;ui++) { bounds[ui][0] = b.bounds[ui][0]; valid[ui][0] = b.valid[ui][0]; bounds[ui][1] = b.bounds[ui][1]; valid[ui][1] = b.valid[ui][1]; } } void setInvalid() { valid[0][0]=false; valid[1][0]=false; valid[2][0]=false; valid[0][1]=false; valid[1][1]=false; valid[2][1]=false; } //Set the cube to be "inside out" at the limits of numeric results; void setInverseLimits(bool setAsValid=false); void setBound(unsigned int bound, unsigned int minMax, float value) ; //Retrieve a specified bound, minMax=0 for min, =1 for max float getBound(unsigned int bound, unsigned int minMax) const ; void getBound(Point3D &bound, unsigned int minMax) const ; //!Return the centroid Point3D getCentroid() const; //!Get the bounds void getBounds(Point3D &low, Point3D &high) const ; //!Return the side length of the cube along the specified dimension float getSize(unsigned int dim) const; //!Return sizes of bounds for each dimension (max-min) Point3D getSize() const; //! Returns true if all bounds are valid bool isValid() const; //! Returns true if any bound is of null thickness bool isFlat() const; //!Returns true if any bound of datacube is considered to be "large" in magnitude compared to // floating pt data type. bool isNumericallyBig() const; //!Obtain bounds from an array of Point3Ds void setBounds( const Point3D *ptArray, unsigned int nPoints); //!Use two points to set bounds -- does not need to be high,low. this is worked out/ void setBounds( const Point3D &p, const Point3D &q); //!Obtain bounds from an array of Point3Ds void setBounds(const std::vector &ptArray); //!Set bounds via cube that contains given sphere void setBounds(const Point3D &p, float radius); //Set & set-like operations //!Checks if a point intersects a sphere of centre Pt, radius^2 sqrRad bool intersects(const Point3D &pt, float sqrRad) const; //Create a union of two bounding cubes, which is itself a cube BoundCube makeUnion(const BoundCube &b) const; //Check to see if the point is contained in, or part of the walls //of the cube bool containsPt(const Point3D &pt) const; bool contains(const BoundCube &b) const; //!Is this bounding cube completely contained within a sphere centred on pt of sqr size sqrRad? bool containedInSphere(const Point3D &pt, float sqrRad) const; unsigned int segmentTriple(unsigned int dim, float slice) const; //!Returns maximum distnace to box corners (which is an upper bound on max box distance). //Bounding box must be valid. float getMaxDistanceToBox(const Point3D &pt) const; //Get the largest dimension of the bound cube float getLargestDim() const; //Return the rectilinear volume represented by this prism. float volume() const { return (bounds[0][1] - bounds[0][0])* (bounds[1][1] - bounds[1][0])*(bounds[2][1] - bounds[2][0]);} void limits(); const BoundCube &operator=(const BoundCube &); //!Expand (as needed) volume such that the argument bounding cube is enclosed by this one void expand(const BoundCube &b); //!Expand such that point is contained in this volume. Existing volume must be valid void expand(const Point3D &p); //!Expand by a specified thickness void expand(float v); //!Obtain a corner point of the cube Point3D getVertex(unsigned int idx) const; //!Obtain the corner points of the cube void getVertices(std::vector &p,bool centre=false) const; //!Obtain the vertices that arise from the intersection of a plane with the cube void getPlaneIntersectVertices(const Point3D &planeOrigin, const Point3D &normal, std::vector &intersectPts) const; friend std::ostream &operator<<(std::ostream &stream, const BoundCube& b); #ifdef DEBUG static bool test(); #endif //FIXME: Hack! friend class K3DTree; friend class K3DTreeMk2; }; //!Data holder for colour as float typedef struct RGBf { float red; float green; float blue; } RGBf; void getContrastingColour(float r, float g, float b, float &rCont, float &gCont, float &bCont); class ColourRGBAf; //Colour storage class. Uses uchar internally class ColourRGBA { public: unsigned char data[4]; public: ColourRGBA(); ColourRGBA(unsigned char , unsigned char, unsigned char); ColourRGBA(unsigned char , unsigned char, unsigned char, unsigned char); unsigned char r() const; unsigned char g() const; unsigned char b() const; unsigned char a() const; //Parse a colour string, such as #aabbccdd into its RGBA 8-bit components. alpha value (last) can be omitted. Will assume 255. bool parse(const std::string &); //Convert an RGB its // hexadecimal colour string // format is "#rrggbb" such as "#11ee00" std::string rgbString() const; //Convert RGB to hex colour string, with alpha channel std::string rgbaString() const; //convert data from RGB/[0->255] integers to [0->1] float. // alpha channel is not used RGBf toFloat() const; void fromRGBAf(const ColourRGBAf &); ColourRGBAf toRGBAf() const; void fromRGBf(const RGBf &); bool operator==(const ColourRGBA &oth) const; bool operator==(const ColourRGBAf &oth) const; bool operator==(const RGBf &oth) const; bool operator!=(const ColourRGBA &oth) const; bool operator!=(const ColourRGBAf &oth) const; unsigned char at(unsigned int idx) const; unsigned char &operator[](unsigned int idx) { ASSERT(idx <4); return data[idx];} }; //Colour storage class. Uses float internally class ColourRGBAf { private: //colour intensity data in RGBA format. // scaled to [0,1] float data[4]; public: ColourRGBAf(); ColourRGBAf(float, float, float); ColourRGBAf(float, float, float,float); //Return colours float r() const; float g() const; float b() const; float a() const; //Assign colours void r(float); void g(float); void b(float); void a(float); //Interpolate between two RGBAfs to yield an RGBAf ColourRGBAf interpolate(float delta, const ColourRGBAf &other) const; //convert to a ColourRGBA (uchar representation) //TODO : Rename me! ColourRGBA toColourRGBA() const; RGBf toRGBf() const; //!Copy the data to an unsigned char array. void copyToRGBArray(unsigned char *a) const; bool operator==(const ColourRGBA &oth) const; bool operator!=(const ColourRGBA &oth) const; bool operator==(const ColourRGBAf &oth) const; bool operator!=(const ColourRGBAf &oth) const; //TODO: Deprecate me! bool operator==(const RGBf &oth) const; void operator=(const RGBf &oth); float &operator[](unsigned int idx) ; float at(unsigned int idx) const; }; //Randomly select subset. Subset will be (somewhat) sorted on output. // Returns -1 on abort, otherwise returns number of randomly selected items template size_t randomSelect(std::vector &result, const std::vector &source, RandNumGen &rng, size_t num,unsigned int &progress, ATOMIC_BOOL &wantAbort, bool strongRandom=false) { progress=0; //If there are not enough points, just copy it across in whole if(source.size() <= num) { num=source.size(); result.resize(source.size()); for(size_t ui=0; ui(result.data()); void *s = const_cast(source.data()); gsl_ran_choose(r,d,num,s,source.size(),sizeof(T)); gsl_rng_free(r); } else { //Use a weak randomisation LinearFeedbackShiftReg l; //work out the mask level we need to use size_t i=1; unsigned int j=0; while(i < (source.size()<<1)) { i=i<<1; j++; } //linear shift table starts at 3. if(j<3) { j=3; i = 1 << j; } size_t start; //start at a random position in the linear state start =(size_t)(rng.genUniformDev()*i); l.setMaskPeriod(j); l.setState(start); size_t ui=0; //generate unique weak random numbers. while(ui size_t randomDigitSelection(std::vector &result, const size_t max, RandNumGen &rng, size_t num,unsigned int &progress, bool strongRandom=false) { //If there are not enough points, just copy it across in whole if(max <=num) { num=max; result.resize(max); for(size_t ui=0; ui implementation //--------- std::vector ticks; ticks.resize(numTicksNeeded); //Create an array of numbers and fill for(size_t ui=0; ui::iterator itLast; itLast=std::unique(ticks.begin(),ticks.end()); ticks.erase(itLast,ticks.end()); //Top up with unique entries while(ticks.size() < numTicksNeeded) { size_t moreTicks=numTicksNeeded-ticks.size(); for(size_t uk=0;uk::iterator it=ticks.begin();it!=ticks.end();++it) { result[pos]=*it; pos++; progress= (unsigned int)((float)(curProg)/((float)num)*100.0f); } } else { //Sort the ticks properly (mostly sorted anyway..) std::sort(ticks.begin(),ticks.end()); unsigned int curTick=0; for(size_t ui=0;ui void vectorMultiErase(std::vector &vec, const std::vector &wantKill) { ASSERT(vec.size() == wantKill.size()); if(!vec.size()) return; size_t shift=0; for(size_t ui=0;ui void vectorTranspose(const std::vector > &v, std::vector > &vOut) { //Handle empty case vOut.clear(); if(!v.size()) return; vOut.resize(v[0].size()); for(auto i=0;i * Modifications 2013 D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef __cplusplus extern "C" { #endif #ifndef PNGREAD_H #define PNGREAD_H #include #ifndef PNG_LIBPNG_VER #error Requires libpng! #endif #if PNG_LIBPNG_VER < 10200 #error Requires libpng version 1.2.0 or greater! #endif int check_if_png(const char*, FILE**, unsigned int); int read_png(FILE*, unsigned int, png_bytep**, png_uint_32*, png_uint_32*); void free_pngrowpointers(png_bytep *row_pointers, png_uint_32 height); #ifdef __cplusplus } #endif #endif 3Depict-0.0.22/src/common/voxels.cpp0000644000175000017500000001030213414250067016553 0ustar pcuserpcuser/* * voxels.cpp - Voxelised data manipulation class * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "voxels.h" #include #include #include #include using std::vector; using std::pair; using std::numeric_limits; #ifdef DEBUG #include const float FLOAT_SMALL= sqrt(numeric_limits::epsilon()); bool simpleMath() { Voxels a,b,c; a.resize(3,3,3); a.fill(2.0f); float f; f=a.getSum(); TEST(fabs(f-3.0*3.0*3.0*2.0 )< FLOAT_SMALL,"getsum test"); TEST(fabs(a.count(1.0f)- 3.0*3.0*3.0) < FLOAT_SMALL,"Count test"); return true; } bool basicTests() { Voxels f; f.resize(3,3,3); size_t xs,ys,zs; f.getSize(xs,ys,zs); TEST(xs == ys && ys == zs && zs == 3,"resize tests"); f.fill(0); f.setData(1,1,1,1.0f); TEST(fabs(f.max() - 1.0f) < FLOAT_SMALL,"Fill and data set"); f.resizeKeepData(2,2,2); f.getSize(xs,ys,zs); TEST(xs == ys && ys == zs && zs == 2, "resizeKeepData"); TEST(f.max() == 1.0f,"resize keep data"); //Test slice functions //-- Voxels v; v.resize(2,2,2); for(size_t ui=0;ui<8;ui++) v.setData(ui&1, (ui & 2) >> 1, (ui &4)>>2, ui); auto slice = new float[4]; //Test Z slice v.getSlice(2,0,slice); for(size_t ui=0;ui<4;ui++) { ASSERT(slice[ui] == ui); } //Expected results float expResults[4]; //Test X slice expResults[0]=0; expResults[1]=2;expResults[2]=4; expResults[3]=6; v.getSlice(0,0,slice); for(size_t ui=0;ui<4;ui++) { ASSERT(slice[ui] == expResults[ui]); } //Test Y slice v.getSlice(1,1,slice); expResults[0]=2; expResults[1]=3;expResults[2]=6; expResults[3]=7; for(size_t ui=0;ui<4;ui++) { ASSERT(slice[ui] == expResults[ui]); } delete[] slice; //-- try again with nonuniform voxels v.resize(4,3,2); for(size_t ui=0;ui<24;ui++) v.setData(ui, ui); slice = new float[12]; //Test Z slice v.getSlice(2,1,slice); for(size_t ui=0;ui<12;ui++) { ASSERT( slice[ui] >=12); } delete[] slice; //-- return true; } bool interpTests() { Voxels v; v.resize(3,3,4); v.setBounds(Point3D(0,0,0),Point3D(3,3,4)); for(unsigned int ui=0;ui<3;ui++) { for(unsigned int uj=0;uj<3;uj++) { v.setData(ui,uj,0,1); v.setData(ui,uj,1,0); v.setData(ui,uj,2,-2); v.setData(ui,uj,3,-1); } } Point3D p(1.5,1.5,0); const unsigned int NSTEP=30; for(unsigned int ui=0;ui= -2, "interp test"); } return true; } /* bool edgeCountTests() { Voxels v; v.resize(4,4,4); TEST(v.getEdgeUniqueIndex(0,0,0,3) == v.getEdgeUniqueIndex(0,1,1,0),"Edge coincidence"); TEST(v.getEdgeUniqueIndex(0,0,0,6) == v.getEdgeUniqueIndex(1,0,0,4),"Edge coincidence"); TEST(v.getEdgeUniqueIndex(0,0,0,2) == v.getEdgeUniqueIndex(0,0,1,0),"Edge coincidence"); //Check for edge -> index -> edge round tripping //for single cell size_t x,y,z; x=1; y=2; z=3; for(size_t ui=0;ui<12;ui++) { size_t idx; idx= v.getCellUniqueEdgeIndex(x,y,z,ui); size_t axis; size_t xN,yN,zN; v.getEdgeCell(idx,xN,yN,zN,axis); //if we ask for the cell, we should also //get the index ASSERT(x == xN && y==yN && z==zN); //TODO: Check that the axis of the edge was preserved (not the edge itself) ASSERT( axis == ui/4); } return true; } */ bool runVoxelTests() { bool wantAbort=false; voxelsWantAbort = &wantAbort; TEST(basicTests(),"basic voxel tests"); TEST(simpleMath(), "voxel simple maths"); TEST(interpTests(), "voxel simple maths"); return true; } #endif 3Depict-0.0.22/src/common/mathfuncs.h0000644000175000017500000003137213414250067016702 0ustar pcuserpcuser/* * mathfuncs.h - General mathematic functions header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MATHFUNCS_H #define MATHFUNCS_H #include #include #include #include #include #include #include "endianTest.h" //!A 3D point data class storage /*! A 3D point data class * contains operator overloads and some basic * mathematical functions */ class Point3D { private: //!Value data float value[3]; public: //!Constructor inline Point3D() {}; //!Constructor with initialising values inline Point3D(float x,float y,float z) { value[0] = x, value[1] = y, value[2] = z;} inline Point3D(float *v) { value[0] = v[0], value[1] = v[1], value[2] = v[2];} inline Point3D(double *v) { value[0] = v[0], value[1] = v[1], value[2] = v[2];} //Copy constructor Point3D(const Point3D &p) =default; //Move constructor Point3D(Point3D &&p) =default; //!Set by value (ith dim 0, 1 2) inline void setValue(unsigned int ui, float val){value[ui]=val;}; //!Set all values inline void setValue(float fX,float fY, float fZ) {value[0]=fX; value[1]=fY; value[2]=fZ;} //!Set by pointer inline void setValueArr(const float *val) { value[0]=*val; value[1]=*(val+1); value[2]=*(val+2); }; //FIXME: This should be r,theta,phi... //Assign the vector using spherical coordinates. // theta - inclination. phi - azimuth, r - radius void setISOSpherical(float theta, float phi, float r); //!Get value of ith dim (0, 1, 2) inline float getValue(unsigned int ui) const {return value[ui];}; //Retrieve the internal pointer. Only use if you know why. inline const float *getValueArr() const { return value;}; //!get into an array (note array must hold sizeof(float)*3 bytes of valid mem void copyValueArr(float *value) const; //!Add a point to this, without generating a return value void add(const Point3D &obj); //Convert a point string from its "C" language representation to a point value // - two types of notation are allowed, cartesian (a,b,c) (with or without brackets // and polar ISO Spherical, angle brackets only bool parse(const std::string &str); //!Equality operator bool operator==(const Point3D &pt) const; //!assignment operator const Point3D &operator=(const Point3D &pt); //!+= operator const Point3D &operator+=(const Point3D &pt); //!+= operator const Point3D &operator-=(const Point3D &pt); const Point3D operator+(float f) const; //!multiplication operator const Point3D &operator*=(const float scale); //!Addition operator const Point3D operator+(const Point3D &pt) const; //!elemental multiplication const Point3D operator*(float scale) const; //!multiplication const Point3D operator*(const Point3D &pt) const; //!Division. const Point3D operator/(float scale) const; const Point3D operator/(const Point3D &p) const; //!Subtraction const Point3D operator-(const Point3D &pt) const; //!returns a negative of the existing value const Point3D operator-() const; //!Output streaming operator. Users (x,y,z) as format for output friend std::ostream &operator<<(std::ostream &stream, const Point3D &); //!make point unit magnitude, maintaining direction Point3D normalise(); //!returns the square of distance another pt float sqrDist(const Point3D &pt) const; //!overload for array indexing returns |pt|^2 float sqrMag() const; float mag() const; //!Apply float->float transformation void sqrt() { for(unsigned int ui=0;ui<3;ui++) value[ui]=sqrtf(value[ui]); } //ISO31-11 spherical co-ordinates. theta is clockwise rotation around z- axis. // phi is elevation from x-y plane void sphericalAngles(float &theta, float &phi) const; //!Calculate the dot product of this and another pint float dotProd(const Point3D &pt) const; //!Calculate the cross product of this and another point Point3D crossProd(const Point3D &pt) const; //!Calculate the angle between two position vectors in radiians float angle(const Point3D &pt) const; //Extend the current vector by the specified distance void extend(float distance); //!Retrieve by value float operator[](unsigned int ui) const; //!Retrieve element by referene float &operator[](unsigned int ui) ; //!Is a given point stored inside a box bounded by orign and this pt? /*!returns true if this point is located inside (0,0,0) -> Farpoint * assuming box shape (non zero edges return false) * farPoint must be positive in all dim */ bool insideBox(const Point3D &farPoint) const; //!Tests if this point lies inside the rectangular prism /*!Returns true if this point lies inside the box bounded * by lowPoint and highPoint */ bool insideBox(const Point3D &lowPoint, const Point3D &highPoint) const; //!Makes each value negative of old value void negate(); //Perform a 3x3 matrix transformation. void transform3x3(const float *matrix); //Perform a cross-product based orthogonalisation //with the specified vector bool orthogonalise(const Point3D &p); static Point3D centroid(const Point3D *p, unsigned int n); static Point3D centroid(const std::vector &p); //!Flip the endian state for data stored in this point void switchEndian(); }; //IMPORTANT!!! //=============== //Do NOT use multiple instances of this in your code //with the same initialisation technique (e.g. initialising from system clock) //this would be BAD, correlations might well be introduced into your results //that are simply a result of using correlated random sequences!!! (think about it) //use ONE random number generator in the project, initialise it and then "register" //it with any objects that need a random generator. //============== class RandNumGen { private: int ma[56]; int inext,inextp; float gaussSpare; bool haveGaussian; public: RandNumGen(); void initialise(int seedVal); int initTimer(); int genInt(); float genUniformDev(); //This generates a number chosen from //a gaussian distribution range is (-inf, inf) float genGaussDev(); }; //needed for sincos #ifdef __LINUX__ #ifdef __GNUC__ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #endif #endif typedef struct { float a; //Real component float b; float c; float d; } Quaternion; typedef struct { float fx; float fy; float fz; } Point3f; //Uses quaternion mathematics to perform a rotation around your favourite axis //IMPORTANT: rotVec must be normalised before passing to this function //failure to do so will have weird results //Note result is stored in point passed as argument //angle is in radians. //Inefficient Point3D version void quat_rot(Point3D &p, const Point3D &r, float angle); void quat_rot(Point3f *point, const Point3f *rotVec, float angle); void quat_rot_array(Point3f *point, unsigned int n, const Point3f *rotVec, float angle); void quat_rot_array(Point3D *point, unsigned int n, const Point3f *rotVec, float angle); //Retrieve the quaternion for repeated rotations. Pass to the quat_rot_apply_quats. //angle is in radians void quat_get_rot_quat(const Point3f *rotVec, float angle, Quaternion *rotQuat); //Use previously generated quats from quat_get_rot_quats to rotate a point void quat_rot_apply_quat(Point3f *point, const Quaternion *rotQuat); //Apply the given quaternion rotation to the input points void applyQuaternionRotation(std::vector &pts,const Quaternion &q); //This class implements a Linear Feedback Shift Register (in software) //This is a mathematical construct based upon polynomials over closed natural numbers (N mod p). //This will generate a weakly random digit string, but with guaranteed no duplicates, using O(1) //memory and O(n) calls. The no duplicate guarantee is weak-ish, with no repetition in the //shift register for 2^n-1 iterations. n can be set by setMaskPeriod. class LinearFeedbackShiftReg { size_t lfsr; size_t maskVal; size_t totalMask; public: //Get a value from the shift register, and advance size_t clock(); //Set the internal lfsr state. Note 0 is the lock-up state. void setState(size_t newState) { lfsr=newState;}; //set the mask to use such that the period is 2^n-1. 3 is minimum 60 is maximum void setMaskPeriod(unsigned int newMask); //!Check the validity of the table bool verifyTable(size_t maxLen=0); }; //Determines the volume of a quadrilateral pyramid //input points "planarpts" must be adjacent (connected) by //0 <-> 1 <-> 2 <-> 0, all points connected to apex double pyramidVol(const Point3D *planarPts, const Point3D &apex); //!Inline func for calculating a(dot)b inline float dotProduct(float a1, float a2, float a3, float b1, float b2, float b3) { return a1*b1 + a2*b2 + a3* b3; } inline unsigned int ilog2(unsigned int value) { unsigned int l = 0; while( (value >> l) > 1 ) ++l; return l; } //!Use the TRIAD algorithm to compute the matrix that transforms orthogonal unit vectors // ur1,ur2 to rotated orthogonal unit vectors r1,r2. MUST be orthogonal and unit. // matrix m must be pre-allocated 3x3 matrix void computeRotationMatrix(const Point3D &ur1, const Point3D &ur2, const Point3D &r1, const Point3D &r2, gsl_matrix *m); //Rotate a set of points by the given 3x3 matrix void rotateByMatrix(const std::vector &vpts, const gsl_matrix *m, std::vector &r); //Compute the angle between v1 and v2, clockwise, as looking down normal float clockwiseAngle(const Point3D &v1, const Point3D &v2,const Point3D &normal); //Generate a set of points in a 3D polygon void scatterPointsInPolygon(const std::vector &polygon, const Point3D &normal, float scatterDensity, RandNumGen &rng, std::vector &result); //rotate (and translate) a set of points around a given origin, in-place. Return the // quaternion that generated the forwards rotational transformation. //You can invert it with quat_invert void rotatePointsToXYPlane(std::vector &pts, const Point3D &normal, const Point3D &origin, Quaternion &q); enum PointDir{ POINTDIR_TOGETHER =0, POINTDIR_IN_COMMON, POINTDIR_APART }; //!Check which way vectors attached to two 3D points "point", /*! Two vectors may point "together", /__\ "apart" \__/ or * "In common" /__/ or \__\ */ unsigned int vectorPointDir(const Point3D &pA, const Point3D &pB, const Point3D &vC, const Point3D &vD); //Unstable vector mean (does not sort prior to computing mean. Error propagation uncontrolled) //Vector must be nonzero sized template T vectorMean(const std::vector &v) { T value=0; for(unsigned int ui=0;ui T vectorMeanStable(const std::vector &v) { std::vector sortV; sortV=v; std::sort(sortV.begin(),sortV.end()); T value=0; T prefactor = 1.0/(T)v.size(); for(unsigned int ui=0;ui T vectorWeightedMean(const std::vector &v, const std::vector &weight) { T value=0; T weightSum=0; for(unsigned int ui=0;ui. */ #ifndef TRANSLATION_H #define TRANSLATION_H #include #if defined(__APPLE__) || defined(__WIN32__) || defined(__WIN64__) #include #endif //!Gettext translation macro #define TRANS(x) (gettext(x)) //!Gettext null-translation macro (mark for translation, but do nothing) #define NTRANS(x) (x) #endif 3Depict-0.0.22/src/common/mesh.h0000644000175000017500000002434713414250067015652 0ustar pcuserpcuser/* * Copyright (C) 2018 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MESH_H #define MESH_H #include "common/basics.h" #include "common/mathfuncs.h" #include #include #include #include #include //GMSH load constants //----------- //Constants are defined in the GMSH documentation //under section MSH-ASCII-file-format //http://geuz.org/gmsh/doc/texinfo/gmsh.html#MSH-ASCII-file-format const unsigned int ELEM_SINGLE_NODE_POINT=15; const unsigned int ELEM_TWO_NODE_LINE=1; const unsigned int ELEM_THREE_NODE_TRIANGLE=2; const unsigned int ELEM_FOUR_NODE_TETRAHEDRON=4; //----------- extern const char *MESH_LOAD_ERRS[]; enum { ELEMENT_TRIANGLE=1, ELEMENT_TETRAHEDRON=2, ELEMENT_LINE=4, }; class TETRAHEDRON{ public: unsigned int p[4]; unsigned int physGroup; }; class TRIANGLE{ public: unsigned int p[3]; unsigned int physGroup; bool isSane(size_t pLimit=(size_t)-1) const; bool edgesMismatch(const TRIANGLE &tOther) const; }; class LINE{ public: unsigned int p[2]; unsigned int physGroup; }; class Mesh { private: //!Returns true if triangles ui and uj are the same bool sameTriangle(unsigned int ui, unsigned int uj) const; static bool sameTriangle(const TRIANGLE &t1, const TRIANGLE &t2); //!Returns true if the group of triangles are coincident to the nominated triangle bool trianglesCoincident(unsigned int ui, const std::vector &v) const; //!Return true if the specified tet is degenerate (coplanar) bool tetrahedronDegenerate(unsigned int tet) const; //!Return true if a specified point is in the tet. bool pointInTetrahedron(unsigned int tet, const Point3D &p) const; //!Get a list of all disconnected tetrahedra void getDisconnectedTets(std::vector &tetIdx) const; //!Return the normal angle (in rad) between two triangles float normalAngle(size_t triOne,size_t triTwo,bool flip=false ) const; //!Reverse triangle vertex (triTwo) to reverse shared edge to invert implicit normal void flipTriNormalCoherently(size_t triOne, size_t triTwo); //!Kill specified orphan nodes within this dataset void killOrphanNodes(const std::vector &orphans) ; //!Obtain the angle that is formed by the given vertex (in mesh node number) float triVertexAngle(unsigned int tri, unsigned int vertex) const; //!Find the nearest triangle to a given point, and whether it is closest by // edge, vertex or face public: //!Point storage for 3D Data (nodes/coords/vertices..) std::vector nodes; //!Physical group storage std::vector physGroupNames; //==== Element Storage ==== //!Storage for node connectivity in tet. form std::vector tetrahedra; //!Storage for node connectivity in triangle form (take in groups of 3) //triangles.size() %3 should always == 0. std::vector triangles; //!Storage for line segments. .size()%2 should always==0 std::vector lines; //! std::vector points; //Returns 0 on OK, nonzero on error. unsigned int loadGmshMesh(const char *meshfile, unsigned int &curLine, bool allowBadMeshes=true); unsigned int saveGmshMesh(const char *meshfile) const; //Return sum of all element sizes (total lines, points, triangles, tets, etc) size_t elementCount() const; //Set the triangle mesh from the following pt triplet, each vector being the same size. // Function will clear any existing data void setTriangleMesh(const std::vector &ptsA, const std::vector &ptsB, const std::vector &ptsC); //!reassign the physical groups to a single number void reassignGroups(unsigned int i); //!Remove exact duplicate triangles void removeDuplicateTris(); //Remove triangles that are not fully connected to mesh (ie have all edges shared) void removeStrayTris(); //Merge vertices that lie within tolerance distance of one another into a single vertex. // note that this can produced degenerate objects in the mesh, if tolerance is large comapred to the smallest element in the mesh void mergeDuplicateVertices(float tolerance); //!Perform various sanity tests on mesh. Should return true if your mesh is sane. //Returning true is not a guarantee of anything however. bool isSane(bool output=false,std::ostream &outStream=std::cerr) const; //!Get the Axis aligned bounding box for this mesh void getBounds(BoundCube &b) const; //!Count the number of unique nodes shared by triangles unsigned int countTriNodes() const; //!Translate mesh around node centroid void translate(); //!Translate mesh to specified position void translate(const Point3f &origin); void translate(const Point3D &origin); //!Scale the mesh around a specified origin void scale(const Point3f &origin, float scalefactor); //!Scale the mesh around a specified origin void scale(const Point3D &origin,float scaleFactor); //!Scale the mesh around origin void scale(float scaleFactor); //!Rotate mesh void rotate(const Point3f &axis, const Point3f &origin, float angle); //!Obtain the volume of the triangulated space // triangles must be correctly oriented, and closed float getVolume() const; //!place triangles over exposed tetrahedral faces void resurface(unsigned int newPhys); //!Clear the mesh void clear(); //!Check to see if the mesh is a single unit of tetrahedra bool isTetFullyConnected(unsigned int &badTet) const; //!Refine the selected tetrahedra using a midpoint division method void refineTetrahedra(std::vector &refineTets); //!Get the line and triangle segments that are connected to a particular tetrahedron void getAttachedComponents(size_t tet, std::vector &tris, std::vector &l) const; //!Return all the nodes that are contained within specified bounding box void getContainedNodes(const BoundCube &b, std::vector &nodes) const; //!Return all primitives that are WHOLLY contained withing bounding box void getIntersectingPrimitives( std::vector &searchNodes, std::vector &lines, std::vector &triangles, std::vector &tetrahedra ) const; unsigned int divideMeshSurface(float divisionAngle, unsigned int newPhysGroupStart, const std::vector &physGroupsToSplit) ; void getCurPhysGroups(std::vector > &curPhys) const; void erasePhysGroup(unsigned int group, unsigned int typeMask); //obtain the number of duplicate vertices in the mesh unsigned int numDupVertices(float tolerance) const; //Obtain the number of duplicate triangles in the mesh unsigned int numDupTris() const; //Print some statistics about the mesh data void print(std::ostream &o) const; //Flip normals in the mesh in order to have coherently oriented normals for all contiguous objects. //No guarantee is given as to which surface will be inside and which will be outside. //FIXME: BROKEN void orientTriEdgesCoherently() ; //Returns true if the mesh is coherently oriented //FIXME: BROKEN bool isOrientedCoherently() const; //!Kill specified orphan nodes within this dataset void killOrphanNodes(); //!Perform vertex weighted relaxation void relax(size_t iterations, float relaxFactor); //Find the points that lie inside a this mesh void pointsInside(const std::vector &p, std::vector &meshResults, std::ostream &msgs, bool wantProg) const ; //Find the nearest triangle to a particular point // this retuns the square-distance, as well as the // type and ID of the closest sub-elements of the triangle (ie face/edge/vertex) size_t getNearestTri(const std::vector &faceNorm, const Point3D &p,float &sqrDistance, unsigned int &closestType, unsigned int &closestId) const; //Obtain the normal of the given triangle void getTriNormal(size_t tri, Point3D &normal) const; void calculateAngleWeightedPsNormal(std::vector &faceNorm, std::vector &edgeNorm, std::vector &vertexNorm) const; //Find all the normals to the triangle faces of the mesh void calculateFaceNormals(std::vector &faceNorm) const; //Find all the normals to the triangle edges of the mesh, using an existing adjacency map void calculateEdgeNormals(const std::map,std::vector > &adjacencyMap, const std::vector &faceNorm, std::vector &edgeNorm) const; //!Build an adjacency listing for the triangles in the mesh to their edges //i.e. this will retrieve all vector of all triangles who share edge incidence // for a specified vertex, eg: <|> vertex only //incident triangles eg : |>*<| , will be excluded. //The returned map can be used to perform triangle -> surrounding triangle lookups for shared edge // incidence void getTriEdgeAdjacencyMap(std::vector > &eMap) const; //!Build edge adjacency map, map any node pair in the network to the incident triangle // Edges are not in triangle orientation order, they are in (smallest,largest) pairing void getTriEdgeAdjacencyMapMk2(std::map ,std::vector > &eMap) const; //!Build an adjacency listing for the triangles in the mesh to their vertices // output map will have size equal to number of triangles, with list entries as vertex indices void getTriVertexAdjacencyMap(std::vector > &vMap) const; //!Obtain the per-vertex angle weighted pseudonormal void getVertexAngleWeightedNormal(const std::vector > &vAdjMap, const std::vector &triNorm,std::vector &norm) const; }; #ifdef DEBUG //Run unit tests for mesh bool meshTests(); #endif #endif 3Depict-0.0.22/src/common/stringFuncs.h0000644000175000017500000001426513414250067017221 0ustar pcuserpcuser/* * common/stringFuncs.h - String manipulation header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef STRINGFUNCS_H #define STRINGFUNCS_H #include #include #include #include "common/basics.h" //generate a semi-random string (not strong random), returns true // if a file that could be opened was found // this is useful for creating temp files bool genRandomFilename(std::string &s,bool timerInitRand=true); //Convert a boolean to "1" or "0" std::string boolStrEnc(bool b); //Convert an input string "0" or "1" into its boolean value. // Whitespace is stripped from either end. If string cannot be understood, returns false bool boolStrDec(const std::string &s,bool &result); void ucharToHexStr(unsigned char c, std::string &s); //Convert an integer to its full hex representation (no leading # though) std::string intToHex(unsigned int v); void hexStrToUChar(const std::string &s, unsigned char &c); //TODO : Eliminate this function. //!Generate string that can be parsed by wxPropertyGrid for combo control //String format is CHOICEID:id1|string 1,id2|string 2,id3|string 3,.....,idN|string_N // where id1->idN are integers std::string choiceString(std::vector > comboString, unsigned int curChoice); //Convert a choice string, such as generated by "choiceString", into a vector of strings void choiceStringToVector(const std::string &str, std::vector &choices, unsigned int &selected); //Parse a transfer function string into a vector of value,colour pairings, returning true if // parse is sucessful, otherwise false ///!Create a 1D array of colours, which describe a piecewise lookup funciton //Output format is value,r,g,b,a| ... , there is no trailing | character // value is a float formatted string, and r,g,b,a are integers 0-255 std::string transferFunctionString(const std::vector > &colWithOffset); //!Decode a transfer function string. Returns false if fails bool fromTransferFunctionString(const std::string &s , std::vector > &colWithOffset); #ifdef DEBUG //!Obtain whether or not the string is a choice string bool isMaybeChoiceString(const std::string &s); #endif //!Generate a string with leading digits up to maxDigit (eg, if maxDigit is 424, and thisDigit is 1 //leading digit will generate the string 001 std::string digitString(unsigned int thisDigit, unsigned int maxDigit); //!Returns Choice from string (see choiceString(...) for string format) std::string getActiveChoice(const std::string &choiceString); //Strip given whitespace (\f,\n,\r,\t,\ )from a string std::string stripWhite(const std::string &str); //Strip specified chars from a string std::string stripChars(const std::string &Str, const char *chars); //!Return a lowercase version for a given string std::string lowercase(std::string s); //!Return a uppercase version for a given string std::string uppercase(std::string s); //Drop empty entries from a string of vector void stripZeroEntries(std::vector &s); //Check to see if a given string is a valid version number string, // consisting of decmials and ints (eg 0.1.2.3.4) bool isVersionNumberString(const std::string &s); //!Retrieve the maximum version string from a list of version strings // version strings are digit and decimal point (.) only std::string getMaxVerStr(const std::vector &verStrings); //obtain the version number code from major/minor/revision data unsigned int getVersionNumber(unsigned int major, unsigned int minor, unsigned int revision); //parse a version string bool parseVersion(const std::string &s, unsigned int &version); //!Strip whitespace, (eg tab,space) from either side of a string std::string stripWhite(const std::string &str); //!Split string references using a single delimiter. void splitStrsRef(const char *cpStr, const char delim,std::vector &v ); //!Split string references using any of a given string of delimiters void splitStrsRef(const char *cpStr, const char *delim,std::vector &v ); //!Split the file into three parts, base path, base name and file extension // this splits using "/" and "." under unix, and "\" and "." under windows. // the "." between the basename and the extension is omitted. Trailing slashes in pathname are kept void splitFileData(const std::string &filenameWithPath , std::string &path, std::string &basename, std::string &extension); //!Return only the filename component std::string onlyFilename( const std::string& path ); //!Return only the directory name component of the full path // - do not use with UNC windows paths std::string onlyDir( const std::string& path ); //!Convert a path format into a native path from unix format // - do not use with UNC windows paths std::string convertFileStringToNative(const std::string &s); //!Convert a path format into a unix path from native format std::string convertFileStringToCanonical(const std::string &s); //Print N tabs to a string inline std::string tabs(unsigned int nTabs) { std::string s; s.resize(nTabs); std::fill(s.begin(),s.end(),'\t'); return s; } //Brute force convert a wide STL str to a normal stl str inline std::string stlWStrToStlStr(const std::wstring& s) { std::string temp(s.length(),' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } //Brute force convert an stlStr to an stl wide str inline std::wstring stlStrToStlWStr(const std::string& s) { std::wstring temp(s.length(),L' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } #ifdef DEBUG //Run unit tests for string funcs bool testStringFuncs(); #endif #endif 3Depict-0.0.22/src/common/colourmap.h0000644000175000017500000000374313305612110016702 0ustar pcuserpcuser/* * colourmap.h - Colour continumms definitions * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _COLORMAP_H_ #define _COLORMAP_H_ #include #include #include "common/basics.h" //List of the available colourmaps enum { COLOURMAP_JET, COLOURMAP_HOT, COLOURMAP_COLD, COLOURMAP_GRAY, COLOURMAP_CYCLIC, COLOURMAP_GENERAL, COLOURMAP_BLUE, COLOURMAP_RAND, COLOURMAP_INFERNO, COLOURMAP_VIRIDIS, COLOURMAP_ENUM_END }; //FIXME: Better location for this enum enum { COLOURMAP_MODE_NONE, COLOURMAP_MODE_BUILTIN, COLOURMAP_MODE_CUSTOM, COLOURMAP_MODE_ENUM_END }; //!get colour for specific map //returns char in 0->255 range void colourMapWrap(unsigned int mapID,unsigned char *rgb, float value, float min,float max,bool reverse); std::string getColourMapName(unsigned int mapID); //!Generate the colour used in a custom colour map (linear interpolated). Input array must be 3 bytes long // colour map must have nonzero number of entries. Input vector must be sorted by first element of pair. // input pair should be from 0->1 inidicating the position of the gradient in minV/maxV scaling. void applyCustomColourMap(const std::vector > &cMap, unsigned char *rgbfThis, unsigned char &alphaThis, float value, float minV, float maxV); #ifdef DEBUG //Run the colour map tests bool testColourMap(); #endif #endif 3Depict-0.0.22/src/common/gsl_helper.cpp0000644000175000017500000000206313305612110017352 0ustar pcuserpcuser/* * gsl_helper.cpp - gsl assistance routines * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "gsl_helper.h" #include using std::cerr; using std::endl; void gslPrint(const gsl_matrix *m) { for(unsigned int ui=0;uisize1; ui++) { cerr << "|"; for(unsigned int uj=0; ujsize2; uj++) { cerr << gsl_matrix_get(m,ui,uj); if (uj +1 < m->size2) cerr << ",\t" ; } cerr << "\t|" << endl; } } 3Depict-0.0.22/src/common/array2D.h0000644000175000017500000000472413305612110016205 0ustar pcuserpcuser /* * array2D-mk2.h- Redo of the array 2D code * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ARRAY2D_H_ #define ARRAY2D_H_ template class Array2D { private: unsigned int nWidth,nHeight; T * data; //Square memory block public: Array2D(){ data=0;}; Array2D(unsigned int w, unsigned int h) { data=0; resize(w,h);} ~Array2D() { if(data) delete[] data; } Array2D &operator=( const Array2D &rhs) { if (this == &rhs) return *this; //reallocate resize(rhs.nWidth,rhs.nHeight); //copy memcpy(data,rhs.data,nWidth*nHeight*sizeof(T)); return *this; } void resize(unsigned int w, unsigned int h) { nWidth=w; nHeight=h; if(data) delete[] data; data = new T[nWidth*nHeight]; }; void set(unsigned int x, unsigned int y, const T &v) { ASSERT(data); ASSERT(x < nWidth && y < nHeight); data[nWidth*y+x] = v; }; T get(unsigned int x, unsigned int y) const { ASSERT(data); ASSERT(x < nWidth && y < nHeight); return data[nWidth*y + x]; }; T &getRef(unsigned int x, unsigned int y) { ASSERT(data); ASSERT(x < nWidth && y < nHeight); return data[nWidth*y + x]; }; const T &getCRef(unsigned int x, unsigned int y) const { ASSERT(x < nWidth && y < nHeight); return data[nWidth*y + x]; }; void unpack(std::vector > &unpackData) const { unpackData.resize(nHeight); #pragma omp parallel for for(unsigned int ui=0;ui. */ #ifndef ASSERTION_H #define ASSERTION_H #ifdef DEBUG #include #include #include //Do we want to trap floating point exceptions void trapfpe (bool doTrap=true); //Do we want to trap floating point exceptions bool getTrapfpe (); //Ask the user about continuing (or not) in the case of an assertion void userAskAssert(const char * const filename, const unsigned int lineNumber); //Warn the programmer about an error detected by a check void warnProgrammer(const char * const filename, const unsigned int lineNumber, const char *message); //Assertion macro. Used to trigger fatal errors in program (debug mode) #ifndef ASSERT #define ASSERT(f) {if(!(f)) { userAskAssert(__FILE__,__LINE__);}} #endif //warn programmer about unusual situation occurrence #ifndef WARN #define WARN(f,g) { if(!(f)) { warnProgrammer(__FILE__,__LINE__,g);}} #endif #ifndef MESSAGE #define MESSAGE(f) { std::cerr << __FILE__ << ":" << __LINE__ << f << std::endl;} #endif inline void warnProgrammer(const char * const filename, const unsigned int lineNumber,const char *message) { std::cerr << "Warning to programmer." << std::endl; std::cerr << "Filename: " << filename << std::endl; std::cerr << "Line number: " << lineNumber << std::endl; std::cerr << message << std::endl; } //Debug timing routines #define DEBUG_TIME_START() timeval TIME_DEBUG_t; gettimeofday(&TIME_DEBUG_t,NULL); #define DEBUG_TIME_END() { timeval TIME_DEBUG_tend; gettimeofday(&TIME_DEBUG_tend,NULL); \ std::cerr << (TIME_DEBUG_tend.tv_sec - TIME_DEBUG_t.tv_sec) + ((float)TIME_DEBUG_tend.tv_usec-(float)TIME_DEBUG_t.tv_usec)/1.0e6 << std::endl; } #ifndef TEST #define EQ_TOL(f,g) (fabs( (f) - (g)) < 0.001) #define EQ_TOLV(f,g,h) (fabs( (f) - (g)) < (h)) #define TEST(f,g) if(!(f)) { std::cerr << "Test fail :" << __FILE__ << ":" << __LINE__ << "\t"<< (g) << std::endl;return false;} #endif #define TRACE(f) { timespec timeval; clock_gettime(CLOCK_MONOTONIC, &timeval); std::cerr << "<" << f <<">" __FILE__ << ":" << __LINE__ << " t: " << timeval.tv_sec << "." << timeval.tv_nsec/1000 << endl;} //A hack to generate compile time asserts (thanks Internet). //This causes gcc to give "duplicate case value", if the predicate is false #ifndef HAVE_CPP_1X #define COMPILE_ASSERT(pred) \ { switch(0){case 0:case pred:;}} #else #define COMPILE_ASSERT(pred) {static_assert( pred , "Static assertion failed" );} #endif #else #define ASSERT(f) #define COMPILE_ASSERT(f) #define WARN(f,g) #define TEST(f,g) #define TRACE(f) #define MESSAGE(f) //Do we want to trap floating point exceptions void trapfpe (bool doTrap=true); #endif #endif 3Depict-0.0.22/src/common/colourmap.cpp0000644000175000017500000002341613305612110017234 0ustar pcuserpcuser/* * colourmap.cpp - contiuum colourmap header * Copyright (C) 2010, ViewerGTKQt project * Modifed by D Haley 2013 * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "colourmap.h" #include #include "common/translation.h" #include "common/assertion.h" //4th-order polynomial fitted colour map. Coeffs are in decreasing power (p^n... p^0), and per channel // so you need [5 + 5 + 5] sized array (R + G + B) void fittedColorMap(unsigned char *rgb, float value, float min, float max, const float *coeffs); void jetColorMap(unsigned char *rgb,float value,float min,float max) { float max4=(max-min)/4; value-=min; if (value==HUGE_VAL) { rgb[0]=rgb[1]=rgb[2]=255; } else if (value<0) { rgb[0]=rgb[1]=rgb[2]=0; } else if (value1){ rgb[0]=rgb[1]=rgb[2]=255; return; } rgb[0]=192;rgb[1]=0;rgb[2]=0; rgb[0]+=(unsigned char)(63*value); rgb[1]+=(unsigned char)(255*value); if(value>0.5) rgb[2]+=(unsigned char)(255*2*(value-0.5)); } void negativeColorMap(unsigned char *rgb,float value,float min,float max) { value-=min; max-=min; rgb[0]=0;rgb[1]=0;rgb[2]=0; if(max>std::numeric_limits::epsilon()) value/=max; if(value<0) return; if(value>1){ rgb[1]=rgb[2]=255; return; } rgb[1]+=(unsigned char)(255*value); if(value>0.5) rgb[2]+=(unsigned char)(255*2*(value-0.5)); } void colorMap(unsigned char *rgb,float value,float min,float max) { if(value>0) positiveColorMap(rgb,value,0,max); else negativeColorMap(rgb,value,min,0); } void cyclicColorMap(unsigned char *rgb,float value,float min,float max) { float max3=(max-min)/3; value-=(max-min)*(float)floor((value-min)/(max-min)); if(value > &cMap, unsigned char *rgb, unsigned char &alphaThis, float value, float minV, float maxV) { if(!cMap.size()) { WARN(false,"No colour map data specified, but map requested") //Return grey if no map for(unsigned int ui=0; ui<3;ui++) rgb[ui]=128; alphaThis=255; return; } //Clamp lower value to first colour if(value <= minV) { cMap[0].second.copyToRGBArray(rgb); alphaThis = cMap[0].second.a()*255; return; } //Clamp upper value to last colour if(value >=maxV) { cMap[cMap.size()-1].second.copyToRGBArray(rgb); alphaThis = cMap[cMap.size()-1].second.a()*255; return; } //Find the interval in which the value is contained, and then interpolate for(unsigned int ui=0;ui=av && value < bv) // Check if contained on inverval { //Linearly interpolate float delta; delta = (value-av)/(bv-av); ColourRGBAf c; c = cMap[ui].second.interpolate(delta,cMap[ui+1].second); c.copyToRGBArray(rgb); alphaThis = c.a()*255; return; } } //Failed. Return last colour cMap[cMap.size()-1].second.copyToRGBArray(rgb); alphaThis = cMap[cMap.size()-1].second.a()*255; } #ifdef DEBUG bool testColourMap() { //FIXME: More tests float v,minV,maxV; v = 50; minV=0; maxV=100; unsigned char rgb[3]; infernoColorMap(rgb,v,minV,maxV); TEST(EQ_TOLV( (float) rgb[0],0.7364*255.0f,2.0),"inferno Red") ; TEST(EQ_TOLV((float)rgb[1],0.2118*255.0f,2.0f),"inferno Green") ; TEST(EQ_TOLV((float)rgb[2],0.33004*255.0f,2.0f),"inferno Blue") ; return true; } #endif 3Depict-0.0.22/src/common/xmlHelper.h0000644000175000017500000001077713414250067016660 0ustar pcuserpcuser/* * XMLHelper.h - libXML2 wrapper functions * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef XMLHELPER_H #define XMLHELPER_H //Undefs are because wxwidgets and libxml both define this #ifdef ATTRIBUTE_PRINTF #pragma push_macro("ATTRIBUTE_PRINTF") #include #pragma pop_macro(" ATTRIBUTE_PRINTF") #else #include #undef ATTRIBUTE_PRINTF #endif #include #include "common/basics.h" enum { PROP_PARSE_ERR = 1, PROP_BAD_ATT }; //These functions return nonzero on failure, //zero on success //be warned that the node WILL be modified. //Jump to next element that is of a given type (eg text, node, comment etc) //see EOF for more details. Returns nonzero on error unsigned int XMLHelpNextType(xmlNodePtr &node,int); //Scroll forwards until we reach an element of a given node. return nonzero on error unsigned int XMLHelpFwdToElem(xmlNodePtr &node, const char *nodeName); //Convert a normal string sequence into an XML escaped sequence std::string escapeXML(const std::string &s); //Convert an xml escaped sequence into a normal string sequence std::string unescapeXML(const std::string &s); //!Jump to the next element of the given name and retrieve the value for the specified attrip //returns false on failure //NOTE: Do not use if your value may validly contain whitespace. stream_cast skips these cases. There is a specialisation for std::string, which preserves whitespace template bool XMLGetNextElemAttrib(xmlNodePtr &nodePtr, T &v, const char *nodeName, const char *attrib) { std::string tmpStr; xmlChar *xmlString; //==== if(XMLHelpFwdToElem(nodePtr,nodeName)) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)attrib); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(v,tmpStr)) { xmlFree(xmlString); return false; } xmlFree(xmlString); return true; } //template specialisation, which does not strip whitespace from the attribute template<> bool XMLGetNextElemAttrib(xmlNodePtr &nodePtr, std::string &v, const char *nodeName, const char *attrib); //Returns 0 if successful, non zero if there is a property failure, or if the property is empty template unsigned int XMLHelpGetProp(T &prop,xmlNodePtr node, std::string propName) { xmlChar *xmlString; //grab the xml property xmlString = xmlGetProp(node,(const xmlChar *)propName.c_str()); //Check string contents if(!xmlString) return PROP_PARSE_ERR; if(stream_cast(prop,xmlString)) { xmlFree(xmlString); return PROP_BAD_ATT; } xmlFree(xmlString); return 0; } //Specialisation for std::string, // By default, whitespace is dropped by << operator. Use assignment instead template<> unsigned int XMLHelpGetProp(std::string &prop,xmlNodePtr node, std::string propName); //Returns false on failure //Do not use on validly whitespace containing XML template bool XMLGetAttrib(xmlNodePtr &nodePtr, T&v, const char *attrib) { std::string tmpStr; xmlChar *xmlString; //==== xmlString=xmlGetProp(nodePtr,(const xmlChar *)attrib); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(v,tmpStr)) { xmlFree(xmlString); return false; } xmlFree(xmlString); return true; } template<> bool XMLGetAttrib(xmlNodePtr &nodePtr, std::string &v, const char *attrib); /* Defined in the bowels of the xmlLib2 library * Enum xmlElementType { * XML_ELEMENT_NODE = 1 * XML_ATTRIBUTE_NODE = 2 * XML_TEXT_NODE = 3 * XML_CDATA_SECTION_NODE = 4 * XML_ENTITY_REF_NODE = 5 * XML_ENTITY_NODE = 6 * XML_PI_NODE = 7 * XML_COMMENT_NODE = 8 * XML_DOCUMENT_NODE = 9 * XML_DOCUMENT_TYPE_NODE = 10 * XML_DOCUMENT_FRAG_NODE = 11 * XML_NOTATION_NODE = 12 * XML_HTML_DOCUMENT_NODE = 13 * XML_DTD_NODE = 14 * XML_ELEMENT_DECL = 15 * XML_ATTRIBUTE_DECL = 16 * XML_ENTITY_DECL = 17 * XML_NAMESPACE_DECL = 18 * XML_XINCLUDE_START = 19 * XML_XINCLUDE_END = 20 * XML_DOCB_DOCUMENT_NODE = 21 * } */ #endif 3Depict-0.0.22/src/common/constants.cpp0000644000175000017500000000246713414250067017264 0ustar pcuserpcuser/* * common/constants.cpp - Common constants used across program * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "constants.h" //pattern to use when looking for rangefiles const char *RANGEFILE_WX_CONSTANT= NTRANS("Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*.rrng)|*.rrng;*.RRNG|All Files (*)|*"); //Name of the DTD file for state loading const char *DTD_NAME="threeDepict-state.dtd"; //Program name const char *PROGRAM_NAME = "3Depict"; //Program version const char *PROGRAM_VERSION = "0.0.22"; //Path to font for Default FTGL font const char *FONT_FILE= "FreeSans.ttf"; 3Depict-0.0.22/src/common/constants.h0000644000175000017500000000425513414364436016734 0ustar pcuserpcuser/* * common/constants.h - Common constants used across program * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef COMMONCONSTANTS_H #define COMMONCONSTANTS_H #include "translation.h" //Hack-ish variable for minimal size of data to execute // openMP conditionals as parallel regions. This is highly empirical! const unsigned int OPENMP_MIN_DATASIZE=1000; //Plot error types enum { PLOT_ERROR_NONE, PLOT_ERROR_MOVING_AVERAGE, PLOT_ERROR_ENDOFENUM }; //!State file output formats enum { STATE_FORMAT_XML=1 }; //!Property types for wxPropertyGrid enum { PROPERTY_TYPE_BOOL=1, PROPERTY_TYPE_INTEGER, PROPERTY_TYPE_REAL, PROPERTY_TYPE_COLOUR, PROPERTY_TYPE_STRING, PROPERTY_TYPE_POINT3D, PROPERTY_TYPE_CHOICE, PROPERTY_TYPE_FILE, PROPERTY_TYPE_DIR, PROPERTY_TYPE_TRANSFER_FUNCTION, PROPERTY_TYPE_ENUM_END //Not a prop, just end of enum }; //!Movement types for plot enum { REGION_MOVE_EXTEND_XMINUS, //Moving (extend/shrink) lower bound of region REGION_MOVE_TRANSLATE_X, // Moving regoin REGION_MOVE_EXTEND_XPLUS, // Moving (extend/shrink) upper bound }; //FIXME: Is ther ewomewhere else to put this? //!Structure to handle error bar drawing in plot class PLOT_ERROR { public: PLOT_ERROR() { mode=PLOT_ERROR_NONE; movingAverageNum=1;}; //!Plot data estimator mode unsigned int mode; //!Number of data points for moving average unsigned int movingAverageNum; }; extern const char *RANGEFILE_WX_CONSTANT; extern const char *DTD_NAME; extern const char *PROGRAM_NAME; extern const char *PROGRAM_VERSION; extern const char *FONT_FILE; #endif 3Depict-0.0.22/src/common/voxels.h0000644000175000017500000012534513414250067016236 0ustar pcuserpcuser /* * common/voxels.h - Voxelised data manipulation class * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VOXELS_H #define VOXELS_H const unsigned int MAX_CALLBACK=500; #include "common/basics.h" #include #include // Not sure who is defining this, but it is causing problems - mathgl? #undef I #undef Complex #include #if defined(WIN32) || defined(WIN64) #include #endif #include #include #include //Bug in accumulator.hxx. Needs typeinfo #include using namespace std; #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifdef _OPENMP #include #endif //!Boundary clipping mode /*! These constants defines the behaviour of the routines when presented with a * boundary value problem, such as in convolution. */ enum{ BOUND_CLIP=1, BOUND_HOLD, BOUND_DERIV_HOLD, BOUND_MIRROR, BOUND_ZERO, BOUND_ENUM_END }; //Interpolation mode for slice enum { VOX_INTERP_NONE, VOX_INTERP_LINEAR, VOX_INTERP_ENUM_END }; enum{ ADJ_ALL, ADJ_PLUS }; //Error codes enum{ VOXELS_BAD_FILE_READ=1, VOXELS_BAD_FILE_OPEN, VOXELS_BAD_FILE_SIZE, VOXELS_OUT_OF_MEMORY }; //Must be power of two (buffer size when loading files, in sizeof(T)s) const unsigned int ITEM_BUFFER_SIZE=65536; //!Clipping direction constants /*! Controls the clipping direction when performing clipping operations */ enum { CLIP_NONE=0, CLIP_LOWER_SOUTH_WEST, CLIP_UPPER_NORTH_EAST }; enum { VOXEL_ABORT_ERR, VOXEL_MEMORY_ERR, VOXEL_BOUNDS_INVALID_ERR }; #ifdef DEBUG bool runVoxelTests(); #endif static const bool *voxelsWantAbort; //!Template class that stores 3D voxel data /*! To instantiate this class, objects must have * basic mathematical operators, such as * + - and = */ //FIXME: Cross check all algorithsm agree that the centre of the voxel is // where the data value is located template class Voxels { private: //!Number of bins in data set (X,Y,Z) size_t binCount[3]; //!Voxel array vigra::MultiArray<3,T> voxels; //!Scaling value for furthest bound of the dataset. //Dataset is assumed to sit in a rectilinear volume from minBound //to maxBound Point3D minBound, maxBound; public: //!Constructor. Voxels(); //!Destructor ~Voxels(); //!Swap object contents with other voxel object void swap(Voxels &v); //!Clone this into another object FIXME: rename to copy void clone(Voxels &newClone) const; //!Set the value of a point in the dataset void setPoint(const Point3D &pt, const T &val); //!Reverse the data such that vData[ui,uj,uk] == vData[size-ui,uj,uk] (if axis is 0); void reverseAxis(unsigned int axis); //!Retrieve the value of a datapoint, this is rounded to the nearest voxel T getPointData(const Point3D &pt) const; //!Retrieve the XYZ voxel location associated with a given position void getIndex(size_t &x, size_t &y, size_t &z, const Point3D &p) const; //!Retrieve the XYZ voxel location associated with a given position, // including upper borders void getIndexWithUpper(size_t &x, size_t &y, size_t &z, const Point3D &p) const; //!Get the position associated with an XYZ voxel Point3D getPoint(size_t x, size_t y, size_t z) const; //!Retrieve the value of a specific voxel inline T getData(size_t x, size_t y, size_t z) const; //!Retrieve value of the nth voxel inline T getData(size_t i) const { return voxels[i];} void setEntry(size_t n, const T &val) { voxels[n] = val;}; //!Retrieve a reference to the data ata given position //const T &getDataRef(size_t x, size_t y, size_t z) const; //!Set the value of a point in the dataset void setData(size_t x, size_t y, size_t z, const T &val); //!Set the value of nth point in the dataset void setData(size_t n, const T &val); //Obtain an interpolated entry. The interpolated values are obtained by padding void getInterpolatedData(const Point3D &pt, T &v) const; //Perform in-place gaussian smoothing void isotropicGaussianSmooth(float stdev,float windowRatio); //Perform in-place laplacian smoothing void laplaceOfGaussian(float stdev, float windowRatio); //get an interpolated slice from a section of the data void getInterpSlice(size_t normal, float offset, T *p, size_t interpMode=VOX_INTERP_NONE) const; //Get a specific slice, from an integral offset in the data, no interp void getSlice(size_t normal, size_t offset, T *p) const; //!Get the size of the data field void getSize(size_t &x, size_t &y, size_t &z) const; //!Resize the data field /*! This will destroy any data that was already in place * If the data needs to be preserved use "resizeKeepData" * Data will *not* be initialised */ size_t resize(size_t newX, size_t newY, size_t newZ, const Point3D &newMinBound=Point3D(0.0f,0.0f,0.0f), const Point3D &newMaxBound=Point3D(1.0f,1.0f,1.0f)); size_t resize(const Voxels &v); //!Resize the data field, maintaining data as best as possible /*! This will preserve data by resizing as much as possible * about the origin. If the bounds are extended, the "fill" value is used * by default iff doFill is set to true. */ size_t resizeKeepData(size_t newX, size_t newY, size_t newZ, unsigned int direction=CLIP_LOWER_SOUTH_WEST, const Point3D &newMinBound=Point3D(0.0f,0.0f,0.0f), const Point3D &newMaxBound=Point3D(1.0f,1.0f,1.0f), const T &fill=T(0),bool doFill=false); //!DEPRECATED FUNCTION : Get a unique integer that corresponds to the edge index for the voxel; where edges are shared between voxels /*! Each voxel has 12 edges. These are shared (except * voxels that on zero or positive boundary). Return a * unique index that corresponds to a specified edge (0->11). * Index *CANNOT* be inverted to yield cell */ size_t deprecatedGetEdgeUniqueIndex(size_t x, size_t y, size_t z, unsigned int edge) const; //!Get a unique integer that corresponds to an edge index for the voxel; where edges are shared between voxels /*! Each voxel has 12 edges. These are shared (except * voxels that on zero or positive boundary). Return a * NON-unique index that corresponds to a specified edge (0->11) * Index can be inverted to yield cell */ size_t getCellUniqueEdgeIndex(size_t x, size_t y, size_t z, unsigned int edge) const; //!Convert the edge index (as generated by getEdgeUniqueIndex) into a cenre position // returns the axis value so you know edge vector too. // NOte that the value to pass as the edge index is (getEdgeIndex>>2)<<2 to // make the ownership of the voxel correct void getEdgeEnds(size_t edgeIndex,Point3D &a, Point3D &b) const; //!Convert edge index (only as generted by getCellUniqueEdgeIndex) into a cell & axis value void getEdgeCell(size_t edgeUniqId, size_t &x,size_t &y, size_t &z, size_t &axis ) const; //TODO: there is duplicate code between this and getEdgeEnds. Refactor. //!Return the values that are associated with the edge ends, as returned by getEdgeEnds void getEdgeEndApproxVals(size_t edgeUniqId, T &a, T &b ) const; //!Rebin the data by a given rate /*! This will perform a quick and dirty rebin operation, where groups of datablocks * are binned into a single cell. Number of blocks binned is rate^3. Field must be larger than rate * in all directions. Currently only CLIP_NONE is supported. */ void rebin(Voxels &dest, size_t rate, size_t clipMode=CLIP_NONE) const; //!Get the total value of the data field. /*! An "initial value" is provided to provide the definition of a zero value */ T getSum(const T &initialVal=T(0.0)) const; //!count the number of cells with at least this intensity size_t count(const T &minIntensity) const; //!Fill all voxels with a given value void fill(const T &val); //!Get the bounding box vertex (min/max) Point3D getMinBounds() const; Point3D getMaxBounds() const; //Obtain the bounds for a specified axis void getAxisBounds(size_t axis, float &minV, float &maxV) const; ///! Get the spacing for a unit cell Point3D getPitch() const; //!Set the bounding size void setBounds(const Point3D &pMin, const Point3D &pMax); //!Get the bounding size void getBounds(Point3D &pMin, Point3D &pMax) const { pMin=minBound;pMax=maxBound;} void getBounds(BoundCube &bc) const { bc.setBounds(minBound,maxBound);} //!Initialise the voxel storage size_t init(size_t nX,size_t nY,size_t nZ, const BoundCube &bound); //!Initialise the voxel storage size_t init(size_t nX,size_t nY, size_t nZ); //!Load the voxels from file /*! Format is flat size_ts in column major * return codes: * 1: File open error * 2: Data size error */ size_t loadFile(const char *cpFilename, size_t nX, size_t nY, size_t nZ, bool silent=false); //!Write the voxel objects in column major written out to file /*! Format is flat objects ("T"s) in column major format. * Returns nonzero on failure */ size_t writeFile(const char *cpFilename) const; //!Run convolution over this data, placing the correlation data into "result" /*! * Datasets MUST have the same pitch (spacing) for the result to be defined * template type must have a T(0.0) constructor that intialises it to some "zero" */ size_t convolve(const Voxels &templateVec, Voxels &result, size_t boundMode=BOUND_CLIP) const; //!Similar to convolve, but faster -- only works with separable kernels. //Destroys original data in process. /*! * Datasets MUST have the same pitch (spacing) for the result to be defined * template type must have a T(0.0) constructor that intialises it to some "zero" */ size_t separableConvolve(const Voxels &templateVec, Voxels &result, size_t boundMode=BOUND_CLIP); //!Threshold the voxels, keeping either the lower or upper values above this threshold /* Data outside (either above if keepUpper is true, or below threshold if keepUpper is false) * will be set to the new value */ void threshold(const T &thresh, bool keepUpper,const T & newVal); //!Generate a boolean voxel field stating whether the data is above or below the threshold specified /* Data below the threshold will be true if keepUpper is false, and vice-versa */ void thresholdToBoolMask(const T &thresh, bool keepUpper,Voxels &result) const; //!Apply a mask to this dataset, where the mask is true (if not inverting), replace with specified val (newVal) void applyMask(const Voxels &mask, const T &newVal, bool invert=false); //!Find the positions of the voxels that are above or below a given value /*! Returns the positions of the voxels' centroids for voxels that have, by default, * a value greater than that of thresh. This behaviour can by reversed to "lesser than" * by setting lowerEq to false */ void thresholdForPosition(std::vector &p, const T &thresh, bool lowerEq=false) const; //!Return the sizeof value for the T type /*! Maybe there is a better way to do this, I don't know */ static size_t sizeofType() { return sizeof(T);}; //!Binarise the data into a result vector /* On thresholding (val > thresh), set the value to "onThresh". * Otherwise set to "offthresh" */ void binarise(Voxels &result,const T &thresh, const T &onThresh, const T &offThresh) const; //!Empty the data /*Remove the data from the voxel set */ void clear() { voxels.reshape(vigra::Shape3(0,0,0));}; //!Find minimum in dataset T min() const; //!Find maximum in dataset T max() const; //!Find both min and max in dataset in the same loop void minMax(T &min, T &max) const; //!Generate a dataset that consists of the counts of points in a given voxel /*! Ensure that the voxel scaling factors * are set by calling ::setBounds() with the * appropriate parameters for your data. * Disabling nowrap allows you to "saturate" your * data field in the case of dense regions, rather * than let wrap-around errors occur */ int countPoints( const std::vector &points, bool noWrap=true, bool doErase=false); //!Integrate the datataset via the trapezoidal method T trapezIntegral() const; //! Convert voxel intensity into voxel density // this is done by dividing each voxel by its volume void calculateDensity(); float getBinVolume() const; //!Element wise division void operator/=(const Voxels &v); void operator/=(const T &v); bool operator==(const Voxels &v) const; size_t size() const { return voxels.size();} }; //!Convert one type of voxel into another by assignment operator template void castVoxels(const Voxels &src, Voxels &dest) { //TODO: Remove me! src=dest; } //!Use one counting type to sum counts in a voxel of given type template void sumVoxels(const Voxels &src, U &counter) { size_t nx,ny,nz; counter=0; src.getSize(nx,ny,nz); size_t nMax=src.size(); for(size_t ui=0; ui Voxels::Voxels() : voxels(), minBound(Point3D(0,0,0)), maxBound(Point3D(1,1,1)) { } template Voxels::~Voxels() { } template void Voxels::clone(Voxels &newVox) const { newVox.binCount[0]=binCount[0]; newVox.binCount[1]=binCount[1]; newVox.binCount[2]=binCount[2]; newVox.voxels=voxels; newVox.minBound=minBound; newVox.maxBound=maxBound; } template void Voxels::setPoint(const Point3D &point,const T &val) { ASSERT(voxels.size()); size_t pos[3]; for(size_t ui=0;ui<3;ui++) pos[ui] = (size_t)round(point[ui]*(float)binCount[ui]); #ifdef DEBUG vigra::Shape3 s= voxels.shape(); ASSERT(pos[0]<=s[0] && pos[1] <= s[1] && pos[2] < s[2]); #endif voxels[vigra::Shape3(pos[0],pos[1],pos[2])] = val; } template void Voxels::reverseAxis(unsigned int axis) { //FIXME: less lazy implementation, with less counter jumping switch(axis) { case 0: { for(auto ui=0;ui void Voxels::setData(size_t x, size_t y, size_t z, const T &val) { ASSERT(voxels.size()); ASSERT( x < binCount[0] && y < binCount[1] && z < binCount[2]); voxels[vigra::Shape3(x,y,z)]=val; } template inline void Voxels::setData(size_t n, const T &val) { ASSERT(voxels.size()); ASSERT(n T Voxels::getPointData(const Point3D &point) const { ASSERT(voxels.size()); size_t pos[3]; Point3D offsetFrac; offsetFrac=point-minBound; for(size_t ui=0;ui<3;ui++) { offsetFrac[ui]/=(maxBound[ui]-minBound[ui]); pos[ui] = (size_t)round(offsetFrac[ui]*(float)binCount[ui]); } return voxels[vigra::Shape3(pos[0],pos[1],pos[2])]; } template Point3D Voxels::getPoint(size_t x, size_t y, size_t z) const { //ASSERT(x < binCount[0] && y Point3D Voxels::getPitch() const { return Point3D((float)1.0/(float)binCount[0]*(maxBound[0]-minBound[0]), (float)1.0/(float)binCount[1]*(maxBound[1]-minBound[1]), (float)1.0/(float)binCount[2]*(maxBound[2]-minBound[2])); } template void Voxels::getSize(size_t &x, size_t &y, size_t &z) const { ASSERT(voxels.size()); x=binCount[0]; y=binCount[1]; z=binCount[2]; } template size_t Voxels::deprecatedGetEdgeUniqueIndex(size_t x,size_t y, size_t z, unsigned int index) const { //This provides a reversible mapping of x,y,z //X aligned edges are first //Y second //Z third //Consider each parallel set of edges (eg all the X aligned edges) //to be the dual grid of the actual grid. From this you can visualise the //cell centres moving -1/2 -/12 units in the direction normal to the edge direction //to produce the centres of the edge. An additional vertex needs to be created at //the end of each dimension not equal to the alignement dim. // ->ASCII ART TIME<- // In each individual cube, the offsets look like this: // ------------7----------- // \ |\ . // |\ | \ . // | 10 | 11 // | \ | \ . // | \ | \ . // | \ --------6-------------| // | | | | // 2 | 3 | | // | | | | // | | | | // | | | | // | 0 | 1 // \-----|----5----------- | // \ | \ | // 8 | 9 | // \ | \ | // \ |---------4------------ // // ^x // z|\ | // \ | // \-->y // switch(index) { //X axis aligned //-- case 0: break; case 1: y++; // one across in Y break; case 2: z++;//One across in Z break; case 3: y++; z++; break; //-- //Y Axis aligned //-- case 4: break; case 5: z++; break; case 6: x++; break; case 7: z++; x++; break; //-- //Z Axis aligned //-- case 8: break; case 9: y++; break; case 10: x++; break; case 11: x++; y++; break; //-- } size_t result = 12*(z + y*(binCount[2]+1) + x*(binCount[2]+1)*(binCount[1]+1)) + index; return result; } /* template size_t Voxels::getEdgeUniqueIndex(size_t x,size_t y, size_t z, unsigned int index) const { //This provides a reversible mapping of x,y,z //X aligned edges are first //Y second //Z third //Consider each parallel set of edges (eg all the X aligned edges) //to be the dual grid of the actual grid. From this you can visualise the //cell centres moving -1/2 -/12 units in the direction normal to the edge direction //to produce the centres of the edge. An additional vertex needs to be created at //the end of each dimension not equal to the alignement dim. // ->ASCII ART TIME<- // In each individual cube, the offsets look like this: // ------------7----------- // \ |\ . // |\ | \ . // | 10 | 11 // | \ | \ . // | \ | \ . // | \ --------6-------------| // | | | | // 2 | 3 | | // | | | | // | | | | // | | | | // | 0 | 1 // \-----|----5----------- | // \ | \ | // 8 | 9 | // \ | \ | // \ |---------4------------ // // ^x // z|\ | // \ | // \-->y // switch(index) { //X axis aligned //-- case 0: break; case 1: y++; // one across in Y break; case 2: z++;//One across in Z break; case 3: y++; z++; break; //-- //Y Axis aligned //-- case 4: break; case 5: z++; break; case 6: x++; break; case 7: z++; x++; break; //-- //Z Axis aligned //-- case 8: break; case 9: y++; break; case 10: x++; break; case 11: x++; y++; break; //-- } unsigned int axis = index/4; size_t result = 3*(z + y*(binCount[2]+1) + x*(binCount[2]+1)*(binCount[1]+1)) + axis; return result; } */ template size_t Voxels::getCellUniqueEdgeIndex(size_t x,size_t y, size_t z, unsigned int index) const { //This provides a reversible mapping of x,y,z //X aligned edges are first //Y second //Z third //Consider each parallel set of edges (eg all the X aligned edges) //to be the dual grid of the actual grid. From this you can visualise the //cell centres moving -1/2 -/12 units in the direction normal to the edge direction //to produce the centres of the edge. An additional vertex needs to be created at //the end of each dimension not equal to the alignement dim. // ->ASCII ART TIME<- // In each individual cube, the offsets look like this: // ------------7----------- // \ |\ . // |\ | \ . // | 10 | 11 // | \ | \ . // | \ | \ . // | \ --------6-------------| // | | | | // 2 | 3 | | // | | | | // | | | | // | | | | // | 0 | 1 // \-----|----5----------- | // \ | \ | // 8 | 9 | // \ | \ | // \ |---------4------------ // // ^x // z|\ | // \ | // \-->y // size_t cellIdx = 12*(z + y*(binCount[2]+1) + x*(binCount[2]+1)*(binCount[1]+1)) ; cellIdx+=index; return cellIdx; } template void Voxels::getEdgeCell(size_t edgeUniqId, size_t &x,size_t &y, size_t &z, size_t &axis ) const { //Invert the mapping generated by the edgeUniqId function //to retrieve the XYZ and axis values //-- axis=(edgeUniqId%12)/4; size_t tmp = edgeUniqId/12; x = tmp/((binCount[2]+1)*(binCount[1]+1)); tmp-=x*((binCount[2]+1)*(binCount[1]+1)); y=tmp/(binCount[2]+1); tmp-=y*(binCount[2]+1); z=tmp; //-- ASSERT(x< binCount[0]+1 && y void Voxels::getEdgeEnds(size_t edgeUniqId, Point3D &a, Point3D &b ) const { size_t x,y,z; size_t axis; getEdgeCell(edgeUniqId,x,y,z,axis); Point3D delta=getPitch(); Point3D cellCentre=getPoint(x,y,z); //Generate ends of edge, as seen in ascii diagram in uniqueID switch(axis) { case 0: //|| x a=cellCentre; b=cellCentre + Point3D(delta[0],0,0); break; case 1: //|| y a=cellCentre; b=cellCentre + Point3D(0,delta[1],0); break; case 2: //|| z a=cellCentre; b=cellCentre + Point3D(0,0,delta[2]); break; default: ASSERT(false); } #ifdef DEBUG BoundCube bc; bc.setBounds(getMinBounds(), getMaxBounds()); bc.expand(sqrtf(std::numeric_limits::epsilon())); ASSERT(bc.containsPt(a) && bc.containsPt(b)); #endif } template void Voxels::getEdgeEndApproxVals(size_t edgeUniqId, T &a, T &b ) const { //TODO: Speed me up? Could not use // other routines to do this access. // I think some redundant calculations are done Point3D ptA,ptB; getEdgeEnds(edgeUniqId,ptA,ptB); size_t x,y,z; getIndex(x,y,z,ptA); a = getPointData(ptA); b=getPointData(ptB); } template void Voxels::getAxisBounds(size_t axis, float &minV, float &maxV ) const { maxV=maxBound[axis]; minV=minBound[axis]; } template size_t Voxels::resize(size_t x, size_t y, size_t z, const Point3D &newMinBound, const Point3D &newMaxBound) { binCount[0] = x; binCount[1] = y; binCount[2] = z; minBound=newMinBound; maxBound=newMaxBound; try { voxels.reshape(vigra::Shape3(x,y,z)); } catch(...) { return 1; } return 0; } template size_t Voxels::resize(const Voxels &oth) { return resize(oth.binCount[0],oth.binCount[1],oth.binCount[2],oth.minBound,oth.maxBound); } template size_t Voxels::resizeKeepData(size_t newX, size_t newY, size_t newZ, unsigned int direction, const Point3D &newMinBound, const Point3D &newMaxBound, const T &fill,bool doFill) { ASSERT(direction==CLIP_LOWER_SOUTH_WEST); Voxels v; if(v.resize(newX,newY,newZ)) return 1; switch(direction) { case CLIP_LOWER_SOUTH_WEST: { minBound=newMinBound; maxBound=newMaxBound; if(doFill) { size_t itStop[3]; itStop[0]=std::min(newX,binCount[0]); itStop[1]=std::min(newY,binCount[1]); itStop[2]=std::min(newZ,binCount[2]); size_t itMax[3]; itMax[0]=std::max(newX,binCount[0]); itMax[1]=std::max(newY,binCount[1]); itMax[2]=std::max(newZ,binCount[2]); //Duplicate into new value, if currently inside bounding box //This logic will be a bit slow, owing to repeated "if"ing, but //it is easy to understand. Other logics would have many more //corner cases bool spin=false; #pragma omp parallel for for(size_t ui=0;ui Point3D Voxels::getMinBounds() const { ASSERT(voxels.size()); return minBound; } template Point3D Voxels::getMaxBounds() const { ASSERT(voxels.size()); return maxBound; } template void Voxels::setBounds(const Point3D &pMin, const Point3D &pMax) { ASSERT(voxels.size()); #ifdef DEBUG for(auto ui=0;ui<3;ui++) { ASSERT(pMin[ui] <=pMax[ui]); } #endif minBound=pMin; maxBound=pMax; } template size_t Voxels::init(size_t nX, size_t nY, size_t nZ, const BoundCube &bound) { binCount[0]=nX; binCount[1]=nY; binCount[2]=nZ; bound.getBounds(minBound, maxBound); voxels.reshape(vigra::Shape3(nX,nY,nZ)); voxels=0; return 0; } template size_t Voxels::init(size_t nX, size_t nY, size_t nZ) { Point3D pMin(0,0,0), pMax(nX,nY,nZ); return init(nX,nY,nZ,pMin,pMax); } template size_t Voxels::loadFile(const char *cpFilename, size_t nX, size_t nY, size_t nZ , bool silent) { std::ifstream CFile(cpFilename,std::ios::binary); if(!CFile) return VOXELS_BAD_FILE_OPEN; CFile.seekg(0,std::ios::end); size_t fileSize = CFile.tellg(); if(fileSize !=nX*nY*nZ*sizeof(T)) return VOXELS_BAD_FILE_SIZE; resize(nX,nY,nZ,Point3D(nX,nY,nZ)); CFile.seekg(0,std::ios::beg); unsigned int curBufferSize=ITEM_BUFFER_SIZE*sizeof(T); unsigned char *buffer = new unsigned char[curBufferSize]; //Shrink the buffer size by factors of 2 //in the case of small datasets while(fileSize < curBufferSize) curBufferSize = curBufferSize >> 1; //Draw a progress bar if(!silent) { cerr << std::endl << "|"; for(unsigned int ui=0; ui<100; ui++) cerr << "."; cerr << "| 100%" << std::endl << "|"; } unsigned int lastFrac=0; unsigned int ui=0; unsigned int pts=0; do { //Still have data? Keep going while((size_t)CFile.tellg() <= fileSize-curBufferSize) { //Update progress bar if(!silent && ((unsigned int)(((float)CFile.tellg()*100.0f)/(float)fileSize) > lastFrac)) { cerr << "."; pts++; lastFrac=(unsigned int)(((float)CFile.tellg()*100.0f)/(float)fileSize) ; } //Read a chunk from the file CFile.read((char *)buffer,curBufferSize); if(!CFile.good()) return VOXELS_BAD_FILE_READ; //Place the chunk contents into ram for(size_t position=0; position> 1 ; }while(curBufferSize> sizeof(T)); //This does a few extra loops. Not many delete[] buffer; //Fill out the progress bar if(!silent) { while(pts++ <100) cerr << "."; cerr << "| done" << std::endl; } return 0; } template size_t Voxels::writeFile(const char *filename) const { ASSERT(voxels.size()) std::ofstream file(filename, std::ios::binary); if(!file) return 1; for(size_t ui=0; ui T Voxels::getSum(const T &initialValue) const { ASSERT(voxels.size()); T tmp(initialValue); size_t n=voxels.size(); #pragma omp parallel for reduction(+:tmp) for(size_t ui=0;ui T Voxels::trapezIntegral() const { //Compute volume prefactor - volume of cube of each voxel //-- float prefactor=1.0; for(size_t ui=0;ui<3;ui++) { prefactor*=(maxBound[ui]- minBound[ui])/ (float)binCount[ui]; } //-- double accumulation(0.0); //Loop across dataset integrating along z direction #pragma omp parallel for reduction(+:accumulation) for(size_t ui=0;ui size_t Voxels::count(const T &minIntensity) const { size_t bins; bins=binCount[0]*binCount[1]*binCount[2]; size_t sum=0; #pragma omp parallel for reduction(+:sum) for(size_t ui=0;ui=minIntensity) sum++; } return sum; } template void Voxels::swap(Voxels &other) { std::swap(binCount[0],other.binCount[0]); std::swap(binCount[1],other.binCount[1]); std::swap(binCount[2],other.binCount[2]); voxels.swap(other.voxels); std::swap(maxBound,other.maxBound); std::swap(minBound,other.minBound); } template T Voxels::getData(size_t x, size_t y, size_t z) const { ASSERT(x < binCount[0] && y < binCount[1] && z < binCount[2]); return voxels[vigra::Shape3(x,y,z)]; } template void Voxels::thresholdForPosition(std::vector &p, const T &thresh, bool lowerEq) const { p.clear(); if(lowerEq) { #pragma omp parallel for for(size_t ui=0;ui thresh) { #pragma omp critical p.push_back(getPoint(ui,uj,uk)); } } } } } } template void Voxels::threshold(const T &thresh, bool keepUpper, const T &newVal) { if(keepUpper) { #pragma omp parallel for for(size_t ui=0;ui<(size_t)binCount[0]; ui++) { for(size_t uj=0;uj thresh) setData(ui,uj,uk,newVal); } } } } } template void Voxels::thresholdToBoolMask(const T &thresh, bool keepUpper, Voxels &result) const { result.resize(binCount[0],binCount[1],binCount[2], minBound,maxBound); #pragma omp parallel for for(size_t ui=0;ui<(size_t)binCount[0]; ui++) { for(size_t uj=0;uj thresh); result.setData(ui,uj,uk,XOR(keepUpper,res)); } } } } template void Voxels::applyMask(const Voxels &mask, const T&newVal,bool invert) { ASSERT(mask.size() == size()); ASSERT(mask.getMinBounds()== minBound); ASSERT(mask.getMaxBounds() == maxBound); #ifdef DEBUG size_t v[3]; mask.getSize(v[0],v[1],v[2]); for(auto i=0;i<3;i++) { ASSERT(v[i] == binCount[i]); } #endif if(invert) { for(auto i=0; i void Voxels::binarise(Voxels &result, const T &thresh, const T &onThresh, const T &offThresh) const { result.resize(binCount[0],binCount[1], binCount[2],minBound,maxBound); #pragma omp parallel for for(size_t ui=0;ui<(size_t)binCount[0]; ui++) { for(size_t uj=0;uj T Voxels::min() const { ASSERT(voxels.size()); using namespace vigra::acc; AccumulatorChain > s; extractFeatures(voxels.begin(),voxels.end(),s); return get(s); } template T Voxels::max() const { ASSERT(voxels.size()); using namespace vigra::acc; AccumulatorChain > s; extractFeatures(voxels.begin(),voxels.end(),s); return get(s); } template void Voxels::minMax(T &min, T&max) const { ASSERT(voxels.size()); using namespace vigra::acc; AccumulatorChain > s; extractFeatures(voxels.begin(),voxels.end(),s); min=get(s); max=get(s); } template int Voxels::countPoints( const std::vector &points, bool noWrap, bool doErase) { if(doErase) { fill(0); } size_t x,y,z; for(size_t ui=0; ui getData(x,y,z)) setData(x,y,z,value); } else { setData(x,y,z,value); } } } } return 0; } template void Voxels::calculateDensity() { Point3D size = maxBound - minBound; // calculate the volume of a voxel double volume = 1.0; for (int i = 0; i < 3; i++) volume *= size[i] / binCount[i]; // normalise the voxel value based on volume #pragma omp parallel for for(size_t ui=0; ui float Voxels::getBinVolume() const { Point3D size = maxBound - minBound; double volume = 1.0; for (int i = 0; i < 3; i++) volume *= size[i] / binCount[i]; return volume; } template void Voxels::getIndex(size_t &x, size_t &y, size_t &z, const Point3D &p) const { ASSERT(p[0] >=minBound[0] && p[1] >=minBound[1] && p[2] >=minBound[2] && p[0] <=maxBound[0] && p[1] <=maxBound[1] && p[2] <=maxBound[2]); x=(size_t)((p[0]-minBound[0])/(maxBound[0]-minBound[0])*(float)binCount[0]); y=(size_t)((p[1]-minBound[1])/(maxBound[1]-minBound[1])*(float)binCount[1]); z=(size_t)((p[2]-minBound[2])/(maxBound[2]-minBound[2])*(float)binCount[2]); if(x == binCount[0]) x--; if(y == binCount[1]) y--; if(z == binCount[2]) z--; } template void Voxels::getIndexWithUpper(size_t &x, size_t &y, size_t &z, const Point3D &p) const { //Get the data index as per normal getIndex(x,y,z,p); //but, as a special case, if the index is the same as our bincount, check //to see if it is positioned on an edge if(x==binCount[0] && fabs(p[0] -maxBound[0]) < sqrtf(std::numeric_limits::epsilon())) x--; if(y==binCount[1] && fabs(p[1] -maxBound[1]) < sqrtf(std::numeric_limits::epsilon())) y--; if(z==binCount[2] && fabs(p[2] -maxBound[2]) < sqrtf(std::numeric_limits::epsilon())) z--; } template void Voxels::fill(const T &v) { voxels=v; } //Obtain a slice of the voxel data. Data output will be in column order // p[posB*nA + posA]. Input slice must be sufficiently sized and allocated // to hold the output data template void Voxels::getSlice(size_t normalAxis, size_t offset, T *p) const { ASSERT(normalAxis < 3); size_t dimA,dimB,nA; switch(normalAxis) { case 0: { dimA=1; dimB=2; nA=binCount[dimA]; break; } case 1: { dimA=0; dimB=2; nA=binCount[dimA]; break; } case 2: { dimA=0; dimB=1; nA=binCount[dimA]; break; } default: ASSERT(false); //WTF - how did you get here?? } //We are within bounds, use normal access functions switch(normalAxis) { case 0: { for(size_t ui=0;ui void Voxels::getInterpSlice(size_t normal, float offset, T *p, size_t interpMode) const { ASSERT(offset <=1.0f && offset >=0.0f); //Obtain the appropriately interpolated slice switch(interpMode) { case VOX_INTERP_NONE: { size_t slicePos; slicePos=roundf(offset*binCount[normal]); slicePos=std::min(slicePos,binCount[normal]-1); getSlice(normal,slicePos,p); break; } case VOX_INTERP_LINEAR: { //Find the upper and lower bounds, then // limit them so we don't fall off the end of the dataset size_t sliceUpper,sliceLower; if(binCount[0] == 1) sliceUpper=sliceLower=0; else { sliceUpper=ceilf(offset*binCount[normal]); if(sliceUpper >=binCount[normal]) sliceUpper=binCount[normal]-1; else if(sliceUpper==0) sliceUpper=1; sliceLower=sliceUpper-1; } { T *pLower; size_t numEntries=binCount[(normal+1)%3]*binCount[(normal+2)%3]; pLower = new T[numEntries]; getSlice(normal,sliceLower,pLower); getSlice(normal,sliceUpper,p); //Get the decimal part of the float float integ; float delta=modff(offset*binCount[normal],&integ); for(size_t ui=0;ui void Voxels::getInterpolatedData(const Point3D &p, T &v) const { #ifdef DEBUG BoundCube bc(minBound,maxBound); ASSERT(bc.containsPt(p)); #endif size_t index[3]; getIndex(index[0],index[1],index[2],p); Point3D pitch =getPitch(); //Find the offset to the voxel that we are in. //fraction should be in range [0,1) Point3D fraction = p - (minBound + Point3D(index[0],index[1],index[2])*pitch); fraction =fraction/pitch; size_t iPlus[3]; //0.5 corresponds to voxel centre. for(unsigned int ui=0;ui<3;ui++) { if(index[ui] == (binCount[ui]-1)) iPlus[ui]=0; else iPlus[ui]=1; } float c[2][2]; //Tri-linear interpolation //interpolate data values at cube vertices that surround point. We are coming from below the point // so we are simply extending the field on the upper edge by duplicating values as needed float xf = 1-fraction[0]; size_t xLow,xHigh; xLow = index[0]; xHigh = index[0] + iPlus[0]; c[0][0] = getData(xLow,index[1],index[2])*xf + getData(xHigh,index[1],index[2])*fraction[0] ; c[0][1] = getData(xLow,index[1],index[2]+iPlus[2])*xf + getData(xHigh,index[1],index[2]+iPlus[2])*fraction[0] ; c[1][0] = getData(xLow,index[1]+iPlus[1],index[2])*xf + getData(xHigh,index[1]+iPlus[1],index[2])*fraction[0] ; c[1][1] = getData(xLow,index[1]+iPlus[1],index[2]+iPlus[2])*xf + getData(xHigh,index[1]+iPlus[1],index[2]+iPlus[2])*fraction[0] ; float c0,c1; c0 = c[0][0]*(1-fraction[1]) + c[1][0]*fraction[1]; c1 = c[0][1]*(1-fraction[1]) + c[1][1]*fraction[1]; v= c0*(1-fraction[2])+c1*fraction[2]; } template void Voxels::isotropicGaussianSmooth(float stdev,float windowRatio) { //perform in-place smoothing vigra::ConvolutionOptions<3> opt = vigra::ConvolutionOptions<3>().filterWindowSize(windowRatio); vigra::gaussianSmoothMultiArray(vigra::srcMultiArrayRange(voxels), vigra::destMultiArray(voxels),stdev,opt); } template void Voxels::laplaceOfGaussian(float stdev, float windowRatio) { //perform in-place smoothing vigra::ConvolutionOptions<3> opt = vigra::ConvolutionOptions<3>().filterWindowSize(windowRatio); vigra::laplacianOfGaussianMultiArray(vigra::srcMultiArrayRange(voxels), vigra::destMultiArray(voxels),stdev,opt); } template void Voxels::operator/=(const Voxels &v) { ASSERT(v.voxels.size() == voxels.size()); //don't use the built-in /, this // can generate inf values (which is correct) // that we want to avoid. for(size_t ui=0;ui void Voxels::operator/=(const T &v) { ASSERT(v.voxels.size() == voxels.size()); //don't use the built-in /, this // can generate inf values (which is correct) // that we want to avoid. for(size_t ui=0;ui T(0) ) voxels[ui]/=v; else { voxels[ui]=0; } } } template bool Voxels::operator==(const Voxels &v) const { for(size_t ui=0;ui<3;ui++) { if(v.binCount[ui] != binCount[ui]) return false; } return v.voxels == voxels; } //=== #endif 3Depict-0.0.22/src/common/xmlHelper.cpp0000644000175000017500000000677113414250067017212 0ustar pcuserpcuser/* * XmlHelper.cpp : libXML2 wrapper code * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "xmlHelper.h" #include using std::string; //Convert a normal string sequence into an XML escaped sequence std::string escapeXML(const std::string &input) { size_t strLen= input.size(); std::string output; for (size_t ui = 0; ui < strLen; ui++) { char c; c= input[ui]; if (c == '&') output+=("&"); else if (c == '<') output+=("<"); else if (c == '>') output+=(">"); else if (c == '"') output+=("""); else if (c == '\'') output+=("'"); else output+=c; } return output; } //Convert an xml escaped sequence into a normal string sequence //Re-used under GPL v3+ From: //http://svn.lsdcas.engineering.uiowa.edu/repos/lsdcas/trunk/cas2/libcas/xml.cc //accessed 3 Mar 2012 std::string unescapeXML(const std::string &input) { const char* chars = "<>'\"&" ; const char* refs[] = { "<", ">", "'", """, "&", nullptr } ; std::string data=input; for( size_t i = 0 ; refs[i] != nullptr ; i++ ) { std::string::size_type pos = data.find( refs[i] ) ; while( pos != std::string::npos ) { std::stringstream unescaped ; unescaped << data.substr( 0, pos ) << chars[i] << data.substr( pos + strlen( refs[i] ) ) ; data = unescaped.str() ; pos = data.find( refs[i], pos + strlen( refs[i] ) ) ; } } return data ; } template<> unsigned int XMLHelpGetProp(std::string &prop,xmlNodePtr node, string propName) { xmlChar *xmlString; //grab the xml property xmlString = xmlGetProp(node,(const xmlChar *)propName.c_str()); //Check string contents if(!xmlString) return PROP_PARSE_ERR; prop=(char *)xmlString; xmlFree(xmlString); return 0; } template<> bool XMLGetNextElemAttrib(xmlNodePtr &nodePtr, std::string &v, const char *nodeName, const char *attrib) { xmlChar *xmlString; //==== if(XMLHelpFwdToElem(nodePtr,nodeName)) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)attrib); if(!xmlString) return false; v=(char *)xmlString; xmlFree(xmlString); return true; } //Specialisation for string. The stream_cast used by default will fail on empty string template<> bool XMLGetAttrib(xmlNodePtr &nodePtr, std::string &v, const char *attrib) { std::string tmpStr; xmlChar *xmlString; //==== xmlString=xmlGetProp(nodePtr,(const xmlChar *)attrib); if(!xmlString) return false; tmpStr=(char *)xmlString; v=tmpStr; xmlFree(xmlString); return true; } unsigned int XMLHelpNextType(xmlNodePtr &node, int nodeType) { do { node= node->next; if(!node) return 1; } while(node->type != nodeType); return 0; } //returns zero on success, nonzero on fail unsigned int XMLHelpFwdToElem(xmlNodePtr &node, const char *nodeName) { do { node=node->next; }while(node != nullptr && xmlStrcmp(node->name,(const xmlChar *) nodeName)); return (!node); } 3Depict-0.0.22/src/common/mesh.cpp0000644000175000017500000025154313414362722016207 0ustar pcuserpcuser/* * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "mesh.h" #include #include #include #include #include #include using std::deque; using std::make_pair; using std::vector; using std::string; using std::endl; using std::list; using std::cerr; using std::map; using std::pair; enum { MESH_LOAD_UNSPECIFIED_ERROR=1, MESH_LOAD_BAD_NODECOUNT, MESH_LOAD_BAD_ELEMENTCOUNT, MESH_LOAD_IS_INSANE, MESH_LOAD_ENUM_END }; const char *MESH_LOAD_ERRS[] = { "", "Missing error message. This is a bug, please report it", "Node count was different to number of present nodes", "Element count was less than number of present elements", "Mesh loaded, but failed to pass sanity checks" }; const size_t PROGRESS_REDUCE=500; float signVal(unsigned int val) { if (val &1) return 1; else return -1; } //! Returns the shortest distance between a facet and a Point /*! The inputs are the facet points (ABC) and the point P. * distance is shortest using standard plane version * \f$ D = \vec{AB} \cdot \vec{n} \f$ * iff dot products to each combination of \f$ \left( AP,BP,CP \right) \leq 0 \f$ * otherwise closest point is on the boundary of the simplex. * tested by shortest distance to each line segment (E is shortest pt. AB is line segement) * \f$ \vec{E} = \frac{\vec{AB}}{|\vec{AB}|} * ( \vec{PB} \cdot \vec{AB})\f$ */ float distanceToFacet(const Point3D &fA, const Point3D &fB, const Point3D &fC, const Point3D &normal, const Point3D &p); enum { CLOSEST_TYPE_FACE, CLOSEST_TYPE_EDGE, CLOSEST_TYPE_VERTEX }; //! Returns the shortest distance between a line segment and a given point /* The inputs are the ends of the line segment and the point. Uses the formula that * \f$ * D = \abs{\vec{PE}}\f$ * \f[ * \mathrm{~if~} \vec{PA} \cdot \vec{AB} > 0 * \rightarrow \vec{PE} = \vec{A} * \f] * \f[ * \mathrm{~if~} \vec{AB} \cdot \vec{PB} > 0 ~\&~ \vec{PA} \cdot \vec{AB} < 0 * \rightarrow \vec{PB} \cdot \frac{\vec{AB}}{\abs{\vec{AB}}} * \f] * \f[ * \mathrm{~if~} \vec{PB} \cdot \vec{AB} < 0 * \rightarrow \vec{B} * \f] */ float sqrDistanceToSegment(const Point3D &fA, const Point3D &fB, const Point3D &p) { //If the vectors a pointing "together" then use point-line formula if(vectorPointDir(fA,fB,p,p) == POINTDIR_TOGETHER) { Point3D closestPt; Point3D vAB= fB-fA; //Use formula d^2 = |(B-A)(cross)(A-P)|^2/|B-A|^2 return (vAB.crossProd(fA-p)).sqrMag()/(vAB.sqrMag()); } return std::min(fB.sqrDist(p), fA.sqrDist(p)); } //!Find the distance between a point, and a triangular facet -- may be positive or negative // closestType returns 0 for face, 1 for edge, 2 for vertex // closestId is set by CLOSEST_TYPE float sqrDistanceToFacet(const Point3D &fA, const Point3D &fB, const Point3D &fC, const Point3D &normal,const Point3D &p, unsigned int &closestType, unsigned int &closestId) { Point3D pTri[3]; pTri[0]=fA; pTri[1]=fB; pTri[2]=fC; bool insideTri; float baryCentricCoord[3]; for(size_t ui=0; ui<3;ui++) { //Find the midpoint of the triangle on this axis Point3D mid,tmp; mid = (pTri[(ui+1)%3] -pTri[ui])*0.5f + pTri[ui]; //Vector between current "apex" and midpoint of opposite side tmp = (pTri[(ui+2)%3]-mid); baryCentricCoord[ui] = tmp.dotProd(p -mid)/(tmp.mag()); } //we are only inside the triangle if all barycentric coords // say we are. insideTri=true; for(size_t ui=0;ui<3;ui++) { insideTri&= ( (0.0f <=baryCentricCoord[ui]) && (baryCentricCoord[ui] <=1.0f) ); } if(insideTri) { //Point lies above/below facet, and projects normally directly onto it, // use plane formula closestType=CLOSEST_TYPE_FACE; float temp; temp = (p-fA).dotProd(normal); //check that the other points were not better than this! ASSERT(sqrt(fA.sqrDist(p)) >= fabs(temp) - sqrt(std::numeric_limits::epsilon())); ASSERT(sqrt(fB.sqrDist(p)) >= fabs(temp) - sqrt(std::numeric_limits::epsilon())); ASSERT(sqrt(fC.sqrDist(p)) >= fabs(temp) - sqrt(std::numeric_limits::epsilon())); return temp; } //Could be a vertex, or an edge float bestSqrDistVertex=std::numeric_limits::max(); unsigned int bestVertex=(unsigned int)-1; for(unsigned int ui=0;ui<3;ui++) { float fTmp; fTmp = p.sqrDist(pTri[ui]); if(bestSqrDistVertex > fTmp ) { bestVertex=ui; bestSqrDistVertex=fTmp; } } ASSERT(bestVertex != (unsigned int)-1); //if so, we have to check each edge for its closest point //then pick the best float bestSqrDist[3]; bestSqrDist[0] = sqrDistanceToSegment(fA,fB,p); bestSqrDist[1] = sqrDistanceToSegment(fA,fC,p); bestSqrDist[2] = sqrDistanceToSegment(fB,fC,p); unsigned int offset=0; if(bestSqrDist[0] < bestSqrDist[1]) { if(bestSqrDist[0] < bestSqrDist[2]) offset=0; else offset=2; } else { if(bestSqrDist[1] < bestSqrDist[2]) offset=1; else offset=2; } if(bestSqrDist[offset] < bestSqrDistVertex) { closestId = offset; closestType=CLOSEST_TYPE_EDGE; return bestSqrDist[offset]; } closestId = bestVertex; closestType=CLOSEST_TYPE_VERTEX; return bestSqrDistVertex; } size_t findMaxLessThanOrEq(const vector< std::pair > &v, size_t value) { ASSERT(v.size()); size_t curMax=v.begin()->first; size_t curMaxOff=0; for(size_t ui=0;ui curMax && v[ui].first <=value) curMaxOff=ui; } return curMaxOff; } // Recursive definition of determinate using expansion by minors. float Determinant(float **a,int n) { float det = 0; ASSERT( n > 1); //Fundamental 2x2 det. if (n == 2) det = a[0][0] * a[1][1] - a[1][0] * a[0][1]; else { int i,j,j1,j2; //recurisve det det = 0; for (j1=0; j1::epsilon()) ) return -1; // do not deal with this case, the triangle is degenerate n.normalise(); dir = rayEnd - rayStart; // ray direction vector //Check for ray-plane intersection point //-- Point3D rv1,rv2; rv1 = rayStart - tri[0]; rv2 = rayEnd - tri[0]; //If the dot products do not flip, the ray cannot cross infinite plane float dp1 = rv1.dotProd(n); float dp2 = rv2.dotProd(n); if(dp1*dp2 > 0) //(signs are the same --> ray is on one side of plane only) return 0; else if(rv1.dotProd(n) < std::numeric_limits::epsilon() && rv2.dotProd(n) < std::numeric_limits::epsilon()) { //If the ray-ends -> vertex vectors have no component in the normal direction //the ray is coplanar return 2; } //Project the ray onto the plane to create intersection point //Solution is found by parameterising ray and solving for //dot product with normal I=rayStart-dir*rv1.dotProd(n)/dir.dotProd(n); //-- // is I inside T? If so, then the dot product of each edge // with the ray from the edge start to the intersection will always // be in range [0-1]; otherwise there will be at least one that is negative float uu, uv, vv, wu, wv, D; uu = u.dotProd(u); uv = u.dotProd(v); vv = v.dotProd(v); w = I - tri[0]; wu = w.dotProd(u); wv = w.dotProd(v); D = uv * uv - uu * vv; // get and test parametric coords float s, t; s = (uv * wv - vv * wu) / D; if (s < 0.0 || s > 1.0) // I is outside T return 0; t = (uv * wu - uu * wv) / D; if (t < 0.0 || (s + t) > 1.0) // I is outside T return 0; return 1; // I is in T } //---- END This section under specific licence --- //Square distance between a line segment and a point in 3D space float sqrDistanceToSegment(const Point3D &fA, const Point3D &fB, const Point3D &p, unsigned int &closestIdx) { //If the vectors ar pointing "together" then use point-line formula if((p-fA).dotProd(p-fB) < 0) { //Closest point is on the line sgement closestIdx=1; Point3D closestPt; Point3D vAB= fB-fA; //Use formula d^2 = |(B-A)(cross)(A-P)|^2/|B-A|^2 return (vAB.crossProd(fA-p)).sqrMag()/(vAB.sqrMag()); } //Distances to a and b float fADist,fBDist; fADist = fA.sqrDist(p); fBDist = fB.sqrDist(p); if(fADist < fBDist) { closestIdx=0; return fADist; } else { closestIdx=2; return fBDist; } } //Creates a list of pair,vector of point indices that are within a certain // tolerance radius of one another. Output first value in list will be strictly increasing. (i.e. it->first < (it+1)->first, regardless of it position) //FIXME: This algorithm is a poor effort. It just picks a semi-random point, //then nicks everything within the capture radius that was not nicked before. // this will work if the adjacency points are *close*, and well separated, but not otherwise. //TODO: Unify these two overloads! //-- void findNearVertices(float tolerance, const vector &ptVec, vector > > &clusterList) { ASSERT(!clusterList.size()); vector marked; marked.resize(ptVec.size(),false); //Try to find the common points for(size_t ui=0;ui curClustered; //FIXME: replace with KD tree based search, or some other smart structure for(size_t uj=0;uj &ptVec, std::list > > &clusterList) { ASSERT(clusterList.empty()); vector marked; marked.resize(ptVec.size(),false); //Try to find the common points for(size_t ui=0;ui curClustered; //FIXME: replace with KD tree based search, or some other smart structure for(size_t uj=0;uj &faceNorm, vector &edgeNorm, vector &vertexNorm) const { //Compute the face normals for the triangle calculateFaceNormals(faceNorm); //Find the edge adjacency data map,vector > eMap; getTriEdgeAdjacencyMapMk2(eMap); //Compute the edge psuedo normals calculateEdgeNormals(eMap,faceNorm,edgeNorm); //Compute the vertex->triangle adjacency map vector > vMap; getTriVertexAdjacencyMap(vMap); //Obtain the angle weighted normals for each vertex getVertexAngleWeightedNormal(vMap, faceNorm,vertexNorm); } void Mesh::calculateFaceNormals(vector &faceNorm) const { faceNorm.resize(triangles.size()); for(size_t ui=0;ui,std::vector > &adjacencyMap, const vector &faceNorm, vector &edgeNorm) const { ASSERT(faceNorm.size() == triangles.size()); //guessing that there are as many edges as triangles. In an infinite plane sheet // there will be 3 edges per triangle, but each edge shared with another triangle, // so this goes to 1.5 times. However, in a finite mesh, there will be more edges per triangle edgeNorm.reserve(adjacencyMap.size()); map< pair , pair > edgeNormMap; for(const auto & it : adjacencyMap) { map,pair >::iterator itNorm; itNorm=edgeNormMap.find(it.first); //If we don't have the edge yet, make it if(itNorm !=edgeNormMap.end()) { for(unsigned int ui=0; uisecond.second+=faceNorm[it.second[ui]]; itNorm->second.first +=it.second.size(); } else { //we have the edge, simply increment it and sum the vectors pair edge; edge=it.first; pair pN; pN.first = it.second.size(); pN.second=Point3D(0,0,0); for(unsigned int ui=0;uisecond.second*1.0f/(float)itM->second.first; offset++; } #pragma omp parallel for for(unsigned int ui=0;ui &orphans) { #ifdef HAVE_CPP11 ASSERT(std::is_sorted(orphans.begin(),orphans.end())); #endif ASSERT(std::adjacent_find(orphans.begin(),orphans.end()) == orphans.end()) ASSERT(isSane()); vector offsets; offsets.resize(nodes.size()); size_t curOrphan=0; for(size_t ui=0;ui::iterator itJ; for(size_t ui=0;ui newNodes; for(size_t ui=0;ui degenerate // |x1 y1 z1 1| // D0 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x4 y4 z4 1| return fourDeterminant(nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]) < std::numeric_limits::epsilon(); } bool Mesh::pointInTetrahedron(unsigned int tet, const Point3D &p) const { //Compute the following determinants; //if there is a sign change, then // |x1 y1 z1 1| // D0 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x4 y4 z4 1| float f; f = fourDeterminant(nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]); //Ensure that we do not get the zero case. ASSERT(!tetrahedronDegenerate(tet)); bool positive; positive= f>0; // // |x y z 1| // D1 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x4 y4 z4 1| f = fourDeterminant(p, nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]); if(f < 0 && positive) return false; // // |x1 y1 z1 1| // D2 = |x y z 1| // |x3 y3 z3 1| // |x4 y4 z4 1| f = fourDeterminant( nodes[tetrahedra[tet].p[0]], p, nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]); if(f < 0 && positive) return false; // // |x1 y1 z1 1| // D3 = |x2 y2 z2 1| // |x y z 1| // |x4 y4 z4 1| f = fourDeterminant( nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], p, nodes[tetrahedra[tet].p[3]]); if(f < 0 && positive) return false; // // |x1 y1 z1 1| // D4 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x y z 1| f = fourDeterminant( nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], p); if(f < 0 && positive) return false; return true; } //Tell us if the two triangles are indeed the same bool Mesh::sameTriangle(unsigned int ui, unsigned int uj) const { vector t1,t2; t1.resize(3); t2.resize(3); for(unsigned int idx=0;idx<3;idx++) { t1[idx]= triangles[ui].p[idx]; t2[idx]= triangles[uj].p[idx]; } std::sort(t1.begin(),t1.end()); std::sort(t2.begin(),t2.end()); return std::equal(t1.begin(),t1.end(),t2.begin()); } bool Mesh::sameTriangle(const TRIANGLE &t1, const TRIANGLE &t2) { vector ta,tb; ta.resize(3); tb.resize(3); for(unsigned int idx=0;idx<3;idx++) { ta[idx]= t1.p[idx]; tb[idx]= t2.p[idx]; } std::sort(ta.begin(),ta.end()); std::sort(tb.begin(),tb.end()); return std::equal(ta.begin(),ta.end(),tb.begin()); } bool Mesh::isSane(bool output, std::ostream &outStr) const { //Check sanity for(size_t ui=0;ui nodes.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } } } for(size_t ui=0;ui nodes.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } } } for(size_t ui=0;ui nodes.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } } } //Check that we have enough nodes to support each primitive type if(nodes.size() < 4 && tetrahedra.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } if(nodes.size() < 3 && triangles.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } if(nodes.size() < 2 && lines.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } for(size_t ui=0; ui tris,lines; //Lets look for triangles and lines attached to this //(really we just want the triangles) getAttachedComponents(ui,tris,lines); if(tris.size() > 4) { if(output) { //Too many triangles outStr << "INSANE: Tetrahedron " << ui << " has more than 4 attached triangles.." << std::endl; } return false; } if(lines.size() > 6) { if(output) { //Too many lines outStr << "INSANE: Tetrahedron " << ui << " has more than 6 attached lines.." << std::endl; } return false; } } return true; } void Mesh::getDisconnectedTets(vector &tets) const { using std::list; //In a fully connected mesh, every tetrahedron must be //matched to at least one other tetrahedron by a face //By definition, this is true for a zero or singly sized mesh if(tetrahedra.size() <=1) return; //Create a lookup table of vertices -> tetrahedra vector > tetLookup; tetLookup.resize(nodes.size()); for(size_t ui=0; ui connectedMap; for(size_t ui=0; ui::iterator it=connectedMap.begin(); it!=connectedMap.end();++it) { ASSERT(tetLookup[nextVert].size()); if(find(tetLookup[nextVert].begin(),tetLookup[nextVert].end(),(*it)) == tetLookup[nextVert].end()) { it=connectedMap.erase(it); --it; } } } if(!(connectedMap.size() == 2 || connectedMap.size() ==1)) { //this tetrahedron is multiply connected. //(remember, that itself is included in the above test) //Thats screwed up. tets.push_back(ui); } if(connectedMap.size() == 2) faceConnected=true; } if(!faceConnected) { tets.push_back(ui); } } return; } bool Mesh::isTetFullyConnected(unsigned int &badTet) const { using std::list; //In a fully connected mesh, every tetrahedron must be //matched to at least one other tetrahedron by a face //By definition, this is true for a zero or singly sized mesh if(tetrahedra.size() <=1) return true; //Create a lookup table of vertices -> tetrahedra vector > tetLookup; tetLookup.resize(nodes.size()); for(size_t ui=0; ui connectedMap; for(size_t ui=0; ui::iterator it=connectedMap.begin(); it!=connectedMap.end();++it) { ASSERT(tetLookup[nextVert].size()); if(find(tetLookup[nextVert].begin(),tetLookup[nextVert].end(),(*it)) == tetLookup[nextVert].end()) { it=connectedMap.erase(it); --it; } } } if(!(connectedMap.size() == 2 || connectedMap.size() ==1)) { //this tetrahedron is multiply connected. //(remember, that itself is included in the above test) //Thats screwed up. badTet=ui; return false; } if(connectedMap.size() == 2) { faceConnected=true; break; } } if(!faceConnected) { badTet=ui; return false; } } return true; } void Mesh::removeDuplicateTris() { ASSERT(isSane()); using std::list; vector dups; //Create a listing of all the triangles incident to each node vector > vl; vl.resize(nodes.size()); for(unsigned int ui=0;ui::iterator it=vl[ui].begin(); it!=vl[ui].end();++it) { //Examine the triangle that is coincident on this vertex, then //see if the other triangles on this vertex are duplicates for(list::iterator itJ=it; itJ!=vl[ui].end();++itJ) { if(itJ == it) continue; if(sameTriangle(*it,*itJ)) { if(std::find(dups.begin(),dups.end(),*itJ) == dups.end()) dups.push_back(*itJ); } } } } for(unsigned int ui=dups.size();ui--;) { std::swap(triangles[dups[ui]],triangles.back()); triangles.pop_back(); } } void Mesh::mergeDuplicateVertices(float tol) { using std::list; using std::pair; vector thisDup; vector > > dups; //Find the duplicates // placing duplicates into a list of sorted vectors of duplicate indices findNearVertices(tol,nodes,dups); for(size_t ui=0;ui > >::iterator it=dups.begin(); it!=dups.end();++it) { //replace the points vector::iterator itJ; for(size_t ui=0;uisecond.begin(),it->second.end(),points[ui]); if(itJ !=it->second.end()) points[ui]=it->first; } //replace the lines for(size_t ui=0;uisecond.begin(),it->second.end(),lines[ui].p[uj]); if(itJ !=it->second.end()) lines[ui].p[uj]=it->first; } } //replace the triangles for(size_t ui=0;uisecond.begin(),it->second.end(),triangles[ui].p[uj]); if(itJ !=it->second.end()) triangles[ui].p[uj]=it->first; } } //replace the tetrahedra for(size_t ui=0;uisecond.begin(),it->second.end(),tetrahedra[ui].p[uj]); if(itJ !=it->second.end()) tetrahedra[ui].p[uj]=it->first; } } } ASSERT(isSane()); //obtain the set of vertices that have now been orphaned vector toRemove; for(auto & dup : dups) { for(size_t ui=0;ui referenced(nodes.size(),false); for(size_t ui=0;ui orphans; for(size_t ui=0;ui dups; //Create a listing of all the triangles incident to each node vector > vl; vl.resize(nodes.size()); for(unsigned int ui=0;ui::iterator it=vl[ui].begin(); it!=vl[ui].end();++it) { //Examine the triangle that is coincident on this vertex, then //see if the other triangles on this vertex are duplicates for(list::iterator itJ=it; itJ!=vl[ui].end();++itJ) { if(itJ == it) continue; if(sameTriangle(*it,*itJ)) { if(std::find(dups.begin(),dups.end(),*itJ) == dups.end()) dups.push_back(*itJ); } } } } return dups.size(); } unsigned int Mesh::numDupVertices(float tolerance) const { float sqrTol; sqrTol = tolerance*tolerance; unsigned int numDups=0; //TODO: Non brute force approach (k3d-mk2) #pragma omp parallel for reduction(+:numDups) for(size_t ui=0;ui trianglesToKill; unsigned int triKillCount; do { triKillCount=0; std::cerr << "Pass..." << std::endl; trianglesToKill.clear(); #pragma omp parallel for for(size_t ui=0;ui()); for(unsigned int ui=0;ui tetrahedra //and vertices->triangles vector > tetLookup; vector > triLookup; tetLookup.resize(nodes.size()); for(size_t ui=0; ui > triMaps; list connectedMap; std::cerr << "Examining " << tetrahedra.size() << " tetrahedra " << std::endl; //Draw a progress bar unsigned int lastFrac=0; std::cerr << std::endl << "|"; for(unsigned int ui=0; ui<100; ui++) std::cerr << "."; std::cerr << "| 100%" << std::endl << "|."; for(size_t ui=0; ui::iterator it=connectedMap.begin(); it!=connectedMap.end();++it) { ASSERT(tetLookup[nextVert].size()); if(find(tetLookup[nextVert].begin(),tetLookup[nextVert].end(),(*it)) == tetLookup[nextVert].end()) { it=connectedMap.erase(it); --it; } } } //Should either face another tet, or be exposed //note that itself is counted in the connectedMap ASSERT((connectedMap.size() == 2 || connectedMap.size() ==1)); if(connectedMap.size() == 1) { //OK, the only tetrahedron that shares //this face is itself, so it does not share //a face with another tet. //However it could be exposed //or covered by an existing triangle //See if the triangles are attached to this face vector tetFaceNodes; tetFaceNodes.clear(); for(unsigned int uk=0;uk<3;uk++) tetFaceNodes.push_back(tetrahedra[ui].p[faceMap[uj][uk]]); std::sort(tetFaceNodes.begin(),tetFaceNodes.end()); vector attachedTris; //Loop over each vertex on this face, creating a list of incident //triangles to this vertex for(unsigned int uk=0;uk<3;uk++) { size_t vertex; vertex = tetrahedra[ui].p[faceMap[uj][uk]]; for(list::iterator it=triLookup[vertex].begin(); it!=triLookup[vertex].end();++it) { //Push on list of attached triangles, if not prev. //seen if(find(attachedTris.begin(),attachedTris.end(), *it) == attachedTris.end()) attachedTris.push_back(*it); } } //So now we have list of triangles that are incident to //any vertex on this face. now, we need to look through these //to determine if any triangle is incident to this face vector triNodes; triNodes.resize(3); bool triClothedFace; triClothedFace=false; for(unsigned int uk=0;uk lastFrac) { std::cerr << "."; lastFrac++; } } while(lastFrac++ < 100) std::cerr << "."; std::cerr << "|"; ASSERT(triMaps.size() < tetrahedra.size()); //Trimaps now holds the mapping of all the tetrahedra that are exposed //but have no covering triangle. Let us apply a surface to this triangle //using the physical group specified above std::cerr << "Found " << triMaps.size() << " uncovered tetrahedra " << std::endl; vector > curPhys; getCurPhysGroups(curPhys); std::cerr << "DEBUG : Found " << curPhys.size() << " physical groups " << std::endl; for(unsigned int ui=0;ui &ptsX, const std::vector &ptsY, const std::vector &ptsZ) { //Incoming data streams should describe triangles ASSERT(ptsX.size() == ptsY.size() && ptsY.size() == ptsZ.size()); ASSERT(ptsX.size() %3 == 0); clear(); vector ptVec; ptVec.resize(ptsX.size()); #pragma omp parallel for for(size_t ui=0;ui > > clusterList; findNearVertices(MAX_SQR_RAD,ptVec,clusterList); //FIXME: This is totally inefficient. //Now, we have a vector of pts, each group of 3 corresponding to 1 triangle //and we have the mapping for the new triangles vector triangleMapping; triangleMapping.resize(ptVec.size()); #pragma omp parallel for for(size_t ui=0;ui "rally pt" for(auto & it : clusterList) { for(size_t uj=0;uj refCount; refCount.resize(ptVec.size(),0); for(size_t ui=0;uinodeVec (ie the indices of the pts, after dropping unreferenced pts) size_t delta=0; vector numPtsDropped; for(size_t ui=0;ui strVec; tetrahedra.clear(); triangles.clear(); lines.clear(); points.clear(); nodes.clear(); curLine=0; std::ifstream f(meshFile); if(!f) return 1; curLine=1; string line; //Read file header //--- getline(f,line); if(f.fail()) return 1; //Check first line is "$MeshFormat" if(line != "$MeshFormat") return 1; getline(f,line); curLine++; if(f.fail()) return 1; //Second line should be versionNumber file-type data-size splitStrsRef(line.c_str(),' ',strVec); if(strVec.size() != 3) return 1; //Only going to allow version 2.0 && 2.1 && 2.2; can't guarantee other versions.... if(!(strVec[0] == "2.1" || strVec[0] =="2" || strVec[0] == "2.2")) return 1; //file-type should be "0" (for ascii file) //Number of bytes in a double is third arg; but I will skip it if(strVec[1] != "0") return 1; getline(f,line); curLine++; if(f.fail()) return 1; if(line != "$EndMeshFormat") return 1; //-------- //Read the nodes header getline(f,line); curLine++; if(f.fail()) return 1; if(line != "$Nodes") return 1; getline(f,line); curLine++; if(f.fail()) return 1; unsigned int nodeCount; if(stream_cast(nodeCount,line)) return 1; std::cerr << "reading node coords " << std::endl; //Read the node XYZ coords do { getline(f,line); curLine++; if(f.fail()) return 1; if(line == "$EndNodes") break; splitStrsRef(line.c_str(),' ',strVec); if(strVec.size() < 4) return 1; Point3D pt; if(stream_cast(pt[0],strVec[1])) return 1; if(stream_cast(pt[1],strVec[2])) return 1; if(stream_cast(pt[2],strVec[3])) return 1; nodes.push_back(pt); } while(!f.eof()); if(f.eof()) return 1; //Read the elements header getline(f,line); curLine++; if(f.fail()) return 1; if(line != "$Elements") return 1; getline(f,line); curLine++; if(f.fail()) return 1; unsigned int elementCount; if(stream_cast(elementCount,line)) return 1; std::cerr << "Reading Element data" << std::endl; //Read the element data do { getline(f,line); curLine++; if(f.fail()) return 1; if(line == "$EndElements") break; splitStrsRef(line.c_str(),' ',strVec); if(strVec.size() < 3) return 1; unsigned int numTags,elemType; stream_cast(numTags,strVec[2]); stream_cast(elemType,strVec[1]); bool badNode; badNode=false; switch(elemType) { case ELEM_SINGLE_NODE_POINT: { if(strVec.size() - numTags < 4) return 2; unsigned int ptNum; stream_cast(ptNum,strVec[strVec.size() -1]); ptNum--; points.push_back(ptNum); break; } case ELEM_TWO_NODE_LINE: { if(strVec.size()-numTags < 5) return 2; LINE l; if(stream_cast(l.physGroup,strVec[3])) return 1; if(stream_cast(l.p[0],strVec[strVec.size() -2])) return 1; if(stream_cast(l.p[1],strVec[strVec.size() -1])) return 1; if( l.p[0] == l.p[1]) { if(allowBadMeshes) { badNode=true; std::cerr << "WARNING: Bad mesh line element at file line " << curLine << std::endl; } else return 1; } //Convert from 1-index to zero index notation l.p[0]--; l.p[1]--; lines.push_back(l); break; } case ELEM_THREE_NODE_TRIANGLE: { if(strVec.size()-numTags < 6) return 2; TRIANGLE t; if(stream_cast(t.physGroup,strVec[3])) return 1; if(stream_cast(t.p[0],strVec[strVec.size() -3])) return 1; if(stream_cast(t.p[1],strVec[strVec.size() -2])) return 1; if(stream_cast(t.p[2],strVec[strVec.size() -1])) return 1; if( t.p[0] == t.p[1] || t.p[1] == t.p[2] || t.p[2] == t.p[0]) { if(allowBadMeshes) { badNode=true; std::cerr << "WARNING: Bad mesh triangle at line " << curLine << std::endl; } else return 1; } if(!badNode) { //Convert from 1-index to zero index notation t.p[0]--; t.p[1]--; t.p[2]--; triangles.push_back(t); } break; } case ELEM_FOUR_NODE_TETRAHEDRON: { if(strVec.size()-numTags < 7) return 2; TETRAHEDRON t; if(stream_cast(t.physGroup,strVec[3])) return 1; if(stream_cast(t.p[0],strVec[strVec.size() -4])) return 1; if(stream_cast(t.p[1],strVec[strVec.size() -3])) return 1; if(stream_cast(t.p[2],strVec[strVec.size() -2])) return 1; if(stream_cast(t.p[3],strVec[strVec.size() -1])) return 1; for(unsigned int ui=0;ui<4; ui++) { for(unsigned int uj=0;uj<4;uj++) { if(ui == uj) continue; if( t.p[ui] == t.p[uj]) { if(allowBadMeshes) { std::cerr << "WARNING: Bad mesh tetrahedron at line " << curLine << std::endl; badNode=true; } else return 1; } } } if(!badNode) { //Convert from 1-index to zero index notation t.p[0]--; t.p[1]--; t.p[2]--; t.p[3]--; tetrahedra.push_back(t); } break; } default: return 3; } }while(!f.eof()); //Do some final checks - element count can only be under-counted by our class // as there may be some primitives we don't support. However, it should be // never over counted if(!allowBadMeshes) { if(elementCount < triangles.size() + lines.size() + points.size() + tetrahedra.size() ) return MESH_LOAD_BAD_ELEMENTCOUNT; if(nodeCount != nodes.size()) return MESH_LOAD_BAD_NODECOUNT; } if(!isSane()) return MESH_LOAD_IS_INSANE; return 0; } */ unsigned int Mesh::countTriNodes() const { vector touchedNodes; touchedNodes.resize(triangles.size()*3); //Build monolithic list #pragma omp parallel for for(size_t ui=0;ui::iterator it; std::sort(touchedNodes.begin(),touchedNodes.end()); it=std::unique(touchedNodes.begin(),touchedNodes.end()); //TODO: Test me... touchedNodes.resize(it-touchedNodes.begin()); return touchedNodes.size(); } void Mesh::reassignGroups(unsigned int newPhys) { #pragma omp parallel for for(size_t ui=0;ui &refineTets) { //Split the marked tetrahedra into sub-tetrahedra of 4 using a //internal vertex insertion method. //Some strategies are available in the PhD thesis of Wessner, //"Mesh Refinement Techniques for TCAD Tools", Vienna //which is available at httpP://www.iue.tuwien.ac.at/phd/wessner/ for(unsigned int ui=0;ui()); for(unsigned int ui=0;ui > &adj) const { using std::list; adj.resize(triangles.size()); //Create a lookup table of vertices -> triangles vector > triLookup; triLookup.resize(nodes.size()); for(size_t ui=0; ui connectedMap; for(size_t ui=0; ui intersect; intersect=triLookup[v1]; for(auto it=intersect.begin();it!=intersect.end();) { if( find(triLookup[v2].begin(),triLookup[v2].end(),*it) == triLookup[v2].end()) { it=intersect.erase(it); } else ++it; } //OK, so the intersection of the two lookups is the triangles attached to the nodes. for(auto & it : intersect) { //Disallow self adjacency if(it !=ui) adj[ui].push_back(it); } } } } void Mesh::getTriEdgeAdjacencyMapMk2(std::map , std::vector > &eMap) const { eMap.clear(); for(unsigned int ui=0;ui edge; for(unsigned int uj=0;uj<3;uj++) { //Make edge in (small,large) pairing edge=make_pair(triangles[ui].p[uj],triangles[ui].p[(uj+1)%3]); if(edge.first > edge.second) std::swap(edge.first,edge.second); //add edge-triangle linkage, updating map as needed auto it=eMap.find(edge); if( it== eMap.end()) { vector l; l.push_back(ui); eMap[edge] = l; } else it->second.push_back(ui); } } } void Mesh::getTriVertexAdjacencyMap(std::vector > &vMap) const { vMap.clear(); //Create a lookup table of vertices -> triangles vMap.resize(nodes.size()); for(size_t ui=0; ui &physGroupsToSplit) { using std::list; unsigned int origStart=newPhysGroupStart; //Construct the vector > adjacencyMap; vector touchedTris; vector boundaryTris; getTriEdgeAdjacencyMap(adjacencyMap); touchedTris.resize(adjacencyMap.size(),false); //OK, so the plan is to pick a triangle (any triangle) //then to expand this out until we hit an edge, as defined by the //angle between adjacent triangle normals. //once we hit the edge, we then don't cross that vertex. // //this algorithm will FAIL (awh new, bro!) //if triangles have more than one neighbour on each edge. //Once we run out of triangles to try (BFS), we then pick one of the "untouched" //tris, and then work from there. // Step 1: // * Remove any triangles that are not in the physical groups of interest for(size_t ui=0;ui::iterator it=adjacencyMap[ui].begin(); it!=adjacencyMap[ui].end(); ++it) { if(find(physGroupsToSplit.begin(),physGroupsToSplit.end(), triangles[*it].physGroup) == physGroupsToSplit.end()) { it=adjacencyMap[ui].erase(it); --it; } } } } //OK, so now we have an adjacency list of the interesting phys groups. //Step 2: // * search for new triangles to group using an expanding boundary method BoundCube debugBounds,dbgTmp; debugBounds.setInverseLimits(); do { //Find a triangle to use as the "seed" size_t curTri; curTri= find(touchedTris.begin(),touchedTris.end(),false) - touchedTris.begin(); //No more triangles.. all touched. if(curTri == touchedTris.size()) break; //OK, so now we have a "seed" triangle to work with. //create an expanding boundary via adjacency. size_t groupSize=0; list boundary,moreBoundary; boundary.clear(); boundary.push_back(curTri); std::cerr << "Seeded with triangle # " << curTri << std::endl; touchedTris[curTri]=true; // we touched it. triangles[curTri].physGroup=newPhysGroupStart; // we touched it. do { //Expand the boundary using the current boundary triangles //loop over the current boundary for(auto & bIt : boundary) { ASSERT(adjacencyMap[bIt].size()); //Check the adjacency map of the triangles adjacent to a specific boundary element for(auto it=adjacencyMap[bIt].begin();it!=adjacencyMap[bIt].end();++it) { if(!touchedTris[*it] && (normalAngle(bIt,*it) < divisionAngle || fabs(normalAngle(bIt,*it,true)) < divisionAngle) ) { //Alright then, add this new triangle to the potential new boundary //(let us not add straight away, as we would like to expand in a minimum //perimeter to surface area manner moreBoundary.push_back(*it); touchedTris[*it]=true; triangles[*it].physGroup=newPhysGroupStart; dbgTmp.setBounds(nodes[triangles[*it].p[0]], nodes[triangles[*it].p[1]]); dbgTmp.expand(nodes[triangles[*it].p[2]]); debugBounds.expand(dbgTmp); groupSize++; } } } //exchange the new boundary list with the boundary list boundary.swap(moreBoundary); moreBoundary.clear(); } while(!boundary.empty()); //Debug: print bounding box std::cerr << "Group size: "<< groupSize << std::endl; std::cerr << debugBounds << std::endl; //advance the physical group listing newPhysGroupStart++; } while(true); //return the number of divided surfaces return newPhysGroupStart-origStart+1; } void Mesh::getAttachedComponents(size_t tet, vector &tris, vector &l) const { ASSERT(tet &res) const { ASSERT(!res.size()); for(size_t ui=0;ui &searchNodes, std::vector &lineRes, std::vector &triangleRes, std::vector &tetrahedraRes ) const { std::sort(searchNodes.begin(),searchNodes.end()); bool searchFound; ASSERT(lineRes.size() == triangleRes.size() && tetrahedraRes.size() == lineRes.size() && !tetrahedraRes.size()); for(size_t ui=0;ui > &curPhys) const { ComparePairFirst cmp; //TODO: could be more efficient by replacing linear search with //boolean one for(unsigned int ui=0;uip[uj]]; float newVol; newVol=p[0].dotProd(p[1].crossProd(p[2])); ASSERT(newVol > 0.0f); vol+=newVol; } vol*=1.0/6.0; std::cerr << "Signed volume :" << vol << std::endl; return fabs(vol); } void Mesh::relax(size_t iterations, float relaxFactor) { ASSERT(isSane()); using std::pair; vector > adjacencyList; adjacencyList.resize(nodes.size()); //Compute the adjacency list for each vertex //-- for(size_t ui=0;ui > > adjacencyFactors; adjacencyFactors.resize(nodes.size()); for(size_t ui=0;ui &p, vector &meshResults, std::ostream &msgs, bool wantProg) const { // ASSERT(trianglesFullyConnected()); TODO: Implement me //ASSERT(isOrientedCoherently()); ASSERT(!tetrahedra.size()); Point3D centre=Point3D(0,0,0);; //Find the bounding box of the triangle component of the mesh for(size_t ui=0;ui > &vAdjMap, const vector &triNorm,vector &norm) const { ASSERT(vAdjMap.size() == nodes.size()); norm.resize(nodes.size()); for(unsigned int ui=0;ui &faceNorms, const Point3D &p,float &sqrDistance, unsigned int &closestType, unsigned int &closestId) const { //Loop over all the triangles in order to locate the nearest size_t nearTri = (size_t)-1; sqrDistance=std::numeric_limits::max(); for(size_t ui=0;uiB on one // triangle matches that of the other). //for all triangles in the mesh vector seenTri; seenTri.resize(triangles.size(),false); deque triQueue; std::vector > adjacency; getTriEdgeAdjacencyMap(adjacency); for(size_t ui=0;ui *curAdjT; curAdjT= &(adjacency[tri]); for(list::const_iterator it=curAdjT->begin(); it !=curAdjT->end();++it) { if(*it == tri || seenTri[*it]) continue; if(triangles[tri].edgesMismatch(triangles[*it])) return false; seenTri[*it]= true; triQueue.push_back(*it); } } } return true; } void Mesh::orientTriEdgesCoherently() { //Need to check circulation of triangles, (edge A->B on one triangle matches that of the other). //for all triangles in the mesh vector seenTri; seenTri.resize(triangles.size(),false); deque triQueue; std::vector > adjacency; getTriEdgeAdjacencyMap(adjacency); for(size_t ui=0;ui *curAdjT; curAdjT= &(adjacency[tri]); for(list::const_iterator it=curAdjT->begin(); it !=curAdjT->end();++it) { if(*it == tri || seenTri[*it]) continue; if(triangles[tri].edgesMismatch(triangles[*it])) { //Reverse the vertex order on the triangle std::swap(triangles[*it].p[0], triangles[*it].p[1]); } seenTri[*it]= true; triQueue.push_back(*it); } } } //ASSERT(isOrientedCoherently()); } */ bool TRIANGLE::isSane(size_t nMax) const { for(size_t ui=0;ui<3;ui++) { if ( p[ui] == p[(ui+1)%3]) return false; //if nMax supplied, use it if(nMax != (size_t) -1 && p[ui] > nMax ) return false; } return true; } /* bool TRIANGLE::edgesMismatch(const TRIANGLE &other) const { ASSERT(isSane()); ASSERT(other.isSane()); vector commonV; for(size_t ui=0;ui<3;ui++) { for(size_t uj=0;uj<3;uj++) { if ( other.p[uj] == p[ui]) { commonV.push_back(p[ui]); break; } } } ASSERT(commonV.size() <=3); //If either zero or one common vertices, then there is no edge // mismatch if(commonV.size() < 2) return false; else { unsigned int pA[3],pB[3]; for(size_t ui=0;ui<3;ui++) { //If common vertex cannot be found, replace with "-1" if(std::find(commonV.begin(),commonV.end(),p[ui]) == commonV.end()) pA[ui]=-1; else pA[ui]=p[ui]; //If common vertex cannot be found, replace with "-1" if(std::find(commonV.begin(),commonV.end(),other.p[ui]) == commonV.end()) pB[ui]=-1; else pB[ui]=other.p[ui]; } if (commonV.size() == 3) { //If the triangles have all 3 vertices in common, they will match IFF they // have a rotationally invariant sequence that matches (3 matching edges). As permutations // other than vertex sequence rotation will flip the triangle normal // egg : 1-2-3 matches 2-3-1, but not 1-3-2 return !rotateMatch(pA,pB,3); } else { //If the triangles have 2 vs in common, then they have one edge in common. // this will match IFF the circulation (edge ordering) of the two triangles is opposite return !antiRotateMatch(pA,pB,3); } } ASSERT(false); } */ #ifdef DEBUG bool coherencyTests() { //Create a perfects valid mesh of tris //--- Mesh m; m.nodes.emplace_back(Point3D(0,0,0)); m.nodes.emplace_back(Point3D(0,0,1)); m.nodes.emplace_back(Point3D(1,0,0)); m.nodes.emplace_back(Point3D(0,1,0)); TRIANGLE t; t.p[0] = 0; t.p[1] = 1; t.p[2] = 2; m.triangles.push_back(t); t.p[0]=1; t.p[1]=0; t.p[2]=3; m.triangles.push_back(t); t.p[0]=3; t.p[1]=2; t.p[2]=1; m.triangles.push_back(t); //--- //TEST(m.isOrientedCoherently(),"mesh coherency check"); //Flip the shared edge representation for a tri, so we get an inverted // normal on one tri m.triangles[1].p[0]=0; m.triangles[1].p[1]=1; //TEST(!m.isOrientedCoherently(),"check incoherent mesh detection"); //Attempt to reorient the mesh coherently //m.orientTriEdgesCoherently(); //check it worked //TEST(m.isOrientedCoherently(), "Mesh auto-reorient") return true; } Mesh rightAngleMesh() { Mesh m; //Right-angled joined triangles, in XY and YZ plane m.nodes.emplace_back(Point3D(0,0,0)); m.nodes.emplace_back(Point3D(1,0,0)); m.nodes.emplace_back(Point3D(0,1,0)); m.nodes.emplace_back(Point3D(0,0,1)); TRIANGLE t; t.p[0]=0; t.p[1]=1; t.p[2]=2; m.triangles.push_back(t); t.p[0]=0; t.p[1]=3; t.p[2]=1; m.triangles.push_back(t); return m; } bool edgeMaptest() { Mesh m = rightAngleMesh(); vector > eMap; m.getTriEdgeAdjacencyMap(eMap); //Two triangles TEST(eMap.size() ==2, "Triangle count"); for(unsigned int ui=0;ui norms; m.calculateFaceNormals(norms); TEST(norms.size() == 2,"normal count"); for(auto ui=0; ui < norms.size(); ui++) { TEST(EQ_TOL(norms[ui].sqrMag(),1),"Normal magnitude"); } TEST(EQ_TOL(norms[0].dotProd(Point3D(0,0,1)),1),"Normal direction"); TEST(EQ_TOL(norms[1].dotProd(Point3D(0,1,0)),1),"Normal direction"); return true; } bool psuedoNormalTest() { using std::map; Mesh m; m=rightAngleMesh(); vector fNorms; m.calculateFaceNormals(fNorms); map,vector > eMap; m.getTriEdgeAdjacencyMapMk2(eMap); TEST(eMap.size() == 5,"Edge adjacency map tests"); vector eNorms; m.calculateEdgeNormals(eMap,fNorms,eNorms); TEST(eNorms.size() ==5,"Edge normal tetst"); for(unsigned int ui=0;ui > vMap; m.getTriVertexAdjacencyMap(vMap); TEST(vMap.size()==m.nodes.size(),"Vertex adjacency map size (1 per vertex)"); TEST(vMap[0].size()==2,"Vertex adjacency map size (v0)"); TEST(vMap[1].size()==2,"Vertex adjacency map size (v1)"); TEST(vMap[2].size()==1,"Vertex adjacency map size (v2)"); TEST(vMap[3].size()==1,"Vertex adjacency map size (v3)"); vector pNorms; m.getVertexAngleWeightedNormal(vMap, fNorms,pNorms); return true; } bool nearestTriTest() { Mesh m; m=rightAngleMesh(); vector faceNormals; m.calculateFaceNormals(faceNormals); //Test that the exterior test works, // using points (0,0.5,0.4) and (0,0.5,0.6) float distSqr; unsigned int closestType,closestId; TEST(m.getNearestTri(faceNormals,Point3D(0,0.5,0.4), distSqr,closestType,closestId) == 0,"Nearest tri"); TEST(m.getNearestTri(faceNormals,Point3D(0,0.5,0.6), distSqr,closestType,closestId) == 1,"Nearest tri"); return true; } bool meshTests() { TEST(coherencyTests(),"Mesh coherency checks"); TEST(nearestTriTest(),"Mesh edge adjacency test"); TEST(edgeMaptest(),"Mesh nearest tri"); TEST(normalTest(),"Mesh nearest tri"); TEST(psuedoNormalTest(),"Edge Psuedo normal"); return true; } #endif 3Depict-0.0.22/src/common/gsl_helper.h0000644000175000017500000000150613305612110017020 0ustar pcuserpcuser/* * gsl_helper.h - GSL Helper routines * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GSL_HELPER_H #define GSL_HELPER_H #include void gslPrint(const gsl_matrix *m); #endif 3Depict-0.0.22/src/gui/0000755000175000017500000000000013451744166014040 5ustar pcuserpcuser3Depict-0.0.22/src/gui/glPane.h0000644000175000017500000001237213305612110015401 0ustar pcuserpcuser/* * gLPane.h - WxWidgets opengl Pane. * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GLPANE_H #define GLPANE_H #include "gl/scene.h" #include "gl/tr.h" #include #include #include class BasicGLPane : public wxGLCanvas { private: wxGLContext *context; Scene *currentScene; wxStatusBar *parentStatusBar; wxTimer *parentStatusTimer; unsigned int statusDelay; #ifdef __APPLE__ bool requireContextUpdate; #endif //In some implementation of openGL in wx. //calling GL funcs before Paint() will crash program bool paneInitialised; //Is the user engaged in a drag operation? bool dragging; //Where is the start of the mouse drag? wxPoint draggingStart; bool lastMoveShiftDown; //True if an object has been mouse-overed for selection bool selectionMode; //The scene ID value for the currently selected object unsigned int curSelectedObject; //The scene ID value for object currently being "hovered" over unsigned int hoverObject; //!Last mouseflags/keyflags during selection event unsigned int lastMouseFlags,lastKeyFlags; //Test for a object selection. Returns -1 if no selection //or object ID if selection OK. Also sets lastSelected & scene unsigned int selectionTest(const wxPoint &p, bool &shouldRedraw); //Test for a object hover under cursor Returns -1 if no selection //or object ID if selection OK. Also sets last hover and scene unsigned int hoverTest(const wxPoint &p, bool &shouldRedraw); //!Are there updates to the camera Properties due to camera motion? bool haveCameraUpdates; //!Are we currently applying a device in the scene? bool applyingDevice; //Parameters for modifying mouse speed float mouseZoomFactor,mouseMoveFactor; unsigned int lastKeyDoubleTap; wxTimer *keyDoubleTapTimer; //build a TR tile context to allow drawing the image in chunks. // width and height are the output image size. // wantAlpha is used if we want to retrieve the alpha (transpar.) channel TRcontext *generateTileContext(unsigned int width, unsigned int height, unsigned char *buffer, bool wantAlpha=false) const; public: bool displaySupported() const; void setScene(Scene *s) { currentScene=s;} //Enable/Disable the scene interaction for user objects? void setSceneInteractionAllowed(bool enabled=true); //!Must be called before user has a chance to perform interaction void setParentStatus(wxStatusBar *statusBar, wxTimer *timer,unsigned int statDelay) { parentStatusBar=statusBar;parentStatusTimer=timer;statusDelay=statDelay;}; bool hasCameraUpdates() const {return haveCameraUpdates;}; void clearCameraUpdates() {haveCameraUpdates=false;}; BasicGLPane(wxWindow* parent); ~BasicGLPane(); void resized(wxSizeEvent& evt); int getWidth(); int getHeight(); //Panel will not update if a child window for some platforms, using // normal wx reresh code. Force it. // See, eg http://stackoverflow.com/questions/6458451/force-repaint-of-wxpython-window-wxmpl-plot void forceRedraw(); void setMouseMoveFactor(float f) { mouseMoveFactor=f;}; void setMouseZoomFactor(float f) { mouseZoomFactor=f;}; //!Is the window initialised? bool isInited() { return paneInitialised;} //!Set the background colour (openGL clear colour) void setGlClearColour(float r,float g,float b); //!Pull in the colour from the scene void updateClearColour(); //!Render the view using the scene void render(wxPaintEvent& evt); //!Construct a 3D viewport, ready for openGL output. Returns false if initialisation failed bool prepare3DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y); //!Save an image to file, return false on failure bool saveImage(unsigned int width, unsigned int height,const char *filename, bool showProgress=true, bool needPostPaint=true); //!Save an image sequence to files by orbiting the camera bool saveImageSequence(unsigned int width, unsigned int height, unsigned int nFrames, wxString &path, wxString &prefix, wxString &extension); //!Get the background colour void getGlClearColour(float &r,float &g,float &b) { currentScene->getBackgroundColour(r,g,b);} // events void mouseMoved(wxMouseEvent& event); void mouseDown(wxMouseEvent& event); void mouseWheelMoved(wxMouseEvent& event); void mouseReleased(wxMouseEvent& event); void rightClick(wxMouseEvent& event); void mouseLeftWindow(wxMouseEvent& event); void keyPressed(wxKeyEvent& event); void keyReleased(wxKeyEvent& event); void charEvent(wxKeyEvent& event); void OnEraseBackground(wxEraseEvent &); void OnAxisTapTimer(wxTimerEvent &); bool setFullscreen(bool fullscreen); bool setMouseVisible(bool visible); DECLARE_EVENT_TABLE() }; #endif 3Depict-0.0.22/src/gui/glPane.cpp0000644000175000017500000006413713414250067015754 0ustar pcuserpcuser/* * glPane.cpp - OpenGL panel implementation * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "wx/wxcommon.h" #include "common/stringFuncs.h" #include "gl/select.h" #include "glPane.h" // include OpenGL #ifdef __WXMAC__ #include "OpenGL/glu.h" #include "OpenGL/gl.h" #else #include #include #endif #include "common/translation.h" //Unclear why, but windows does not allow GL_BGR, //needs some other define BGR_EXT (NFI), which is 0x80E0 #if defined(WIN32) || defined(WIN64) #define GL_BGR 0x80E0 #endif using std::string; enum { ID_KEYPRESS_TIMER=wxID_ANY+1, }; //Double tap delay (ms), for axis reversal const unsigned int DOUBLE_TAP_DELAY=500; BEGIN_EVENT_TABLE(BasicGLPane, wxGLCanvas) EVT_MOTION(BasicGLPane::mouseMoved) EVT_ERASE_BACKGROUND(BasicGLPane::OnEraseBackground) EVT_LEFT_DOWN(BasicGLPane::mouseDown) EVT_LEFT_UP(BasicGLPane::mouseReleased) EVT_MIDDLE_UP(BasicGLPane::mouseReleased) EVT_MIDDLE_DOWN(BasicGLPane::mouseDown) EVT_RIGHT_UP(BasicGLPane::mouseReleased) EVT_RIGHT_DOWN(BasicGLPane::mouseDown) EVT_LEAVE_WINDOW(BasicGLPane::mouseLeftWindow) EVT_SIZE(BasicGLPane::resized) EVT_KEY_DOWN(BasicGLPane::keyPressed) EVT_KEY_UP(BasicGLPane::keyReleased) EVT_MOUSEWHEEL(BasicGLPane::mouseWheelMoved) EVT_PAINT(BasicGLPane::render) EVT_TIMER(ID_KEYPRESS_TIMER,BasicGLPane::OnAxisTapTimer) END_EVENT_TABLE() //Controls camera pan/translate/pivot speed; Radii per pixel or distance/pixel const float CAMERA_MOVE_RATE=0.05; // Controls zoom speed, in err, zoom units.. Ahem. const float CAMERA_SCROLL_RATE=0.05; //Zoom speed for keyboard const float CAMERA_KEYBOARD_SCROLL_RATE=1; int attribList[] = {WX_GL_RGBA, WX_GL_DEPTH_SIZE, 16, WX_GL_DOUBLEBUFFER, 1, 0,0}; BasicGLPane::BasicGLPane(wxWindow* parent) : wxGLCanvas(parent, wxID_ANY, attribList) { haveCameraUpdates=false; applyingDevice=false; paneInitialised=false; keyDoubleTapTimer=new wxTimer(this,ID_KEYPRESS_TIMER); lastKeyDoubleTap=(unsigned int)-1; context=nullptr; mouseMoveFactor=mouseZoomFactor=1.0f; dragging=false; lastMoveShiftDown=false; selectionMode=false; lastKeyFlags=lastMouseFlags=0; #ifdef __APPLE__ requireContextUpdate=false; #endif } BasicGLPane::~BasicGLPane() { keyDoubleTapTimer->Stop(); delete keyDoubleTapTimer; if(context) delete context; } bool BasicGLPane::displaySupported() const { return IsDisplaySupported(attribList); } void BasicGLPane::setSceneInteractionAllowed(bool enabled) { currentScene->lockInteraction(!enabled); } unsigned int BasicGLPane::selectionTest(const wxPoint &p,bool &shouldRedraw) { if(currentScene->isInteractionLocked()) { shouldRedraw=false; return -1; } //TODO: Refactor. Much of this could be pushed into the scene, //and hence out of this wx panel. //Push on the matrix stack glPushMatrix(); GLint oldViewport[4]; glGetIntegerv(GL_VIEWPORT, oldViewport); //5x5px picking region. Picking is done by modifying the view //to enlarge the selected region. glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPickMatrix(p.x, oldViewport[3]-p.y,5, 5, oldViewport); glMatrixMode(GL_MODELVIEW); int lastSelected = currentScene->getLastSelected(); int selectedObject=currentScene->glSelect(); //If the object selection hasn't changed, we don't need to redraw //if it has changed, we should redraw shouldRedraw = (lastSelected !=selectedObject); //Restore the previous matirx glPopMatrix(); //Restore the viewport int w, h; GetClientSize(&w, &h); glViewport(0, 0, (GLint) w, (GLint) h); return selectedObject; } unsigned int BasicGLPane::hoverTest(const wxPoint &p,bool &shouldRedraw) { if(currentScene->isInteractionLocked()) { shouldRedraw=false; return -1; } //Push on the matrix stack glPushMatrix(); GLint oldViewport[4]; glGetIntegerv(GL_VIEWPORT, oldViewport); //5x5px picking region. Picking is done by modifying the view //to enlarge the selected region. glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPickMatrix(p.x, oldViewport[3]-p.y,5, 5, oldViewport); glMatrixMode(GL_MODELVIEW); unsigned int lastHover = currentScene->getLastHover(); unsigned int hoverObject=currentScene->glSelect(false); //FIXME: Should be able to make this more efficient shouldRedraw = lastHover!=(unsigned int)-1; //Set the scene's hover value currentScene->setLastHover(hoverObject); currentScene->setHoverMode(hoverObject != (unsigned int)-1); //Restore the previous matirx glPopMatrix(); //Restore the viewport int w, h; GetClientSize(&w, &h); glViewport(0, 0, (GLint) w, (GLint) h); return hoverObject; } void BasicGLPane::forceRedraw() { //Force a paint update for the scene wxPaintEvent ptEvent; wxPostEvent(this,ptEvent); #ifdef WIN32 //Hack for windows. Does not redraw otherwise. // Refresh and Update in tandom dont work. Show(false); Show(true); #endif } // some useful events to use void BasicGLPane::mouseMoved(wxMouseEvent& event) { if (applyingDevice) return; enum { CAM_MOVE, //Movement of some kind CAM_TRANSLATE, //translate camera CAM_PIVOT, //Pivot around view and across directions CAM_ROLL //Roll around view direction }; if(selectionMode ) { if(currentScene->isInteractionLocked()) { event.Skip(); return; } wxPoint p=event.GetPosition(); unsigned int mouseFlags=0; unsigned int keyFlags=0; wxMouseState wxm = wxGetMouseState(); if(wxm.CmdDown()) keyFlags|=FLAG_CMD; if(wxm.ShiftDown()) keyFlags|=FLAG_SHIFT; if(wxm.LeftIsDown()) mouseFlags|= SELECT_BUTTON_LEFT; if(wxm.RightIsDown()) mouseFlags|= SELECT_BUTTON_RIGHT; if(wxm.MiddleIsDown()) mouseFlags|= SELECT_BUTTON_MIDDLE; //We can get a mouse move event which reports no buttons before a mouse-up event, //this occurs frequently under windows, but sometimes under GTK if(!mouseFlags) { event.Skip(); return; } int w, h; GetClientSize(&w, &h); currentScene->applyDevice((float)draggingStart.x/(float)w, (float)draggingStart.y/(float)h, p.x/(float)w,p.y/(float)h, keyFlags,mouseFlags, false); lastMouseFlags=mouseFlags; lastKeyFlags=keyFlags; Refresh(); return; } if(!dragging) { wxPoint p=event.GetPosition(); //Do a hover test bool doRedraw=false; hoverTest(p,doRedraw); if(doRedraw) Refresh(); return; } wxPoint draggingCurrent = event.GetPosition(); //left-right and up-down move values float lrMove,udMove; //Movement rate multiplier -- initialise to user value float camMultRate=mouseMoveFactor; if(event.m_shiftDown) { //Commit the current temp cam using the last camera rate //and then restart the motion. if(!lastMoveShiftDown && currentScene->haveTempCam()) currentScene->commitTempCam(); camMultRate*=5.0f; lastMoveShiftDown=true; } else { //Commit the current temp cam using the last camera rate //and then restart the motion. if(lastMoveShiftDown && currentScene->haveTempCam()) currentScene->commitTempCam(); lastMoveShiftDown=false; } lrMove=CAMERA_MOVE_RATE*camMultRate*(draggingCurrent.x - draggingStart.x); udMove=CAMERA_MOVE_RATE*camMultRate*(draggingCurrent.y - draggingStart.y); lrMove*=2.0f*M_PI/180.0; udMove*=2.0f*M_PI/180.0; unsigned int camMode=0; //Decide camera movement mode bool translateMode; translateMode=event.CmdDown(); bool swingMode; #if defined(WIN32) || defined(WIN64) || defined(__APPLE__) swingMode=wxGetKeyState(WXK_ALT); #else swingMode=wxGetKeyState(WXK_TAB); #endif if(translateMode && !swingMode) camMode=CAM_TRANSLATE; else if(swingMode && !translateMode) camMode=CAM_PIVOT; else if(swingMode && translateMode) camMode=CAM_ROLL; else camMode=CAM_MOVE; switch(camMode) { case CAM_TRANSLATE: currentScene->discardTempCam(); currentScene->setTempCam(); currentScene->getTempCam()->translate(lrMove,-udMove); break; case CAM_PIVOT: currentScene->discardTempCam(); currentScene->setTempCam(); currentScene->getTempCam()->pivot(lrMove,udMove); break; case CAM_MOVE: currentScene->setTempCam(); currentScene->getTempCam()->move(lrMove,udMove); break; case CAM_ROLL: currentScene->setTempCam(); currentScene->getTempCam()->roll(atan2(udMove,lrMove)); break; default: ASSERT(false); break; } if(!event.m_leftDown) { dragging=false; currentScene->commitTempCam(); } haveCameraUpdates=true; Refresh(false); } void BasicGLPane::mouseDown(wxMouseEvent& event) { wxPoint p=event.GetPosition(); //Do not re-trigger if dragging or doing a scene update. //This can cause a selection test to occur whilst //a temp cam is activated in the scene, or a binding refresh is underway, //which is currently considered bad if(!dragging && !applyingDevice && !selectionMode && !currentScene->isInteractionLocked()) { //Check to see if the user has clicked an object in the scene bool redraw; selectionTest(p,redraw); //If the selected object is valid, then //we did select an object. Treat this as a selection event if(currentScene->getLastSelected() != (unsigned int)-1) { selectionMode=true; currentScene->setSelectionMode(true); } else { //we aren't setting, it -- it shouldn't be the case ASSERT(selectionMode==false); //Prevent right button from triggering camera drag if(!event.LeftDown()) { event.Skip(); return; } //If not a valid selection, this is a camera drag. dragging=true; } draggingStart = event.GetPosition(); //Set keyboard focus to self, to receive key events SetFocus(); if(redraw) Refresh(); } } void BasicGLPane::mouseWheelMoved(wxMouseEvent& event) { const float SHIFT_MULTIPLIER=5; float cameraMoveRate=-(float)event.GetWheelRotation()/(float)event.GetWheelDelta(); cameraMoveRate*=mouseZoomFactor; if(event.ShiftDown()) cameraMoveRate*=SHIFT_MULTIPLIER; cameraMoveRate*=CAMERA_SCROLL_RATE; //Move by specified delta currentScene->getActiveCam()->forwardsDolly(cameraMoveRate); //if we are using a temporary camera, update that too if(currentScene->haveTempCam()) currentScene->getTempCam()->forwardsDolly(cameraMoveRate); haveCameraUpdates=true; Refresh(); } void BasicGLPane::mouseReleased(wxMouseEvent& event) { if(currentScene->isInteractionLocked()) { event.Skip(); return; } if(selectionMode ) { //If user releases all buttons, then allow the up if(!event.LeftIsDown() && !event.RightIsDown() && !event.MiddleIsDown()) { wxPoint p=event.GetPosition(); int w, h; GetClientSize(&w, &h); applyingDevice=true; currentScene->applyDevice((float)draggingStart.x/(float)w, (float)draggingStart.y/(float)h, p.x/(float)w,p.y/(float)h, lastKeyFlags,lastMouseFlags, true); applyingDevice=false; selectionMode=false; currentScene->setSelectionMode(selectionMode); Refresh(); } event.Skip(); return; } if(currentScene->haveTempCam()) currentScene->commitTempCam(); currentScene->finaliseCam(); haveCameraUpdates=true; dragging=false; Refresh(); } void BasicGLPane::rightClick(wxMouseEvent& event) { } void BasicGLPane::mouseLeftWindow(wxMouseEvent& event) { if(selectionMode) { wxPoint p=event.GetPosition(); int w, h; GetClientSize(&w, &h); applyingDevice=true; currentScene->applyDevice((float)draggingStart.x/(float)w, (float)draggingStart.y/(float)h, p.x/(float)w,p.y/(float)h, lastKeyFlags,lastMouseFlags, true); selectionMode=false; currentScene->setSelectionMode(selectionMode); Refresh(); applyingDevice=false; event.Skip(); return; } if(event.m_leftDown) { if(currentScene->haveTempCam()) { currentScene->commitTempCam(); dragging=false; } } } void BasicGLPane::keyPressed(wxKeyEvent& event) { switch(event.GetKeyCode()) { case WXK_SPACE: { unsigned int visibleDir; //Use modifier keys to alter the direction of visibility //First compute the part of the keymask that does not //reflect the double tap // needs to be control in apple as cmd-space open spotlight unsigned int keyMask; #ifdef __APPLE__ keyMask = (event.RawControlDown() ? 1 : 0); #else keyMask = (event.CmdDown() ? 1 : 0); #endif keyMask |= (event.ShiftDown() ? 2 : 0); //Now determine if we are the same mask as last time bool isKeyDoubleTap=(lastKeyDoubleTap==keyMask); //double tapping allows for selection of reverse direction keyMask |= ( isKeyDoubleTap ? 4 : 0); visibleDir=-1; //Hardwire key combo->Mapping switch(keyMask) { //Space only case 0: visibleDir=CAMERA_DIR_XPLUS; break; //Command down +space case 1: visibleDir=CAMERA_DIR_YPLUS; break; //Shift +space case 2: visibleDir=CAMERA_DIR_ZPLUS; break; //NO CASE 3 //Double+space case 4: visibleDir=CAMERA_DIR_XMINUS; break; //Doublespace+Cmd case 5: visibleDir=CAMERA_DIR_YMINUS; break; //Space+Double+shift case 6: visibleDir=CAMERA_DIR_ZMINUS; break; default: ; } if(visibleDir!=(unsigned int)-1) { if(isKeyDoubleTap) { //It was a double tap. Reset the tapping and stop the timer lastKeyDoubleTap=(unsigned int)-1; keyDoubleTapTimer->Stop(); } else { lastKeyDoubleTap=keyMask & (~(0x04)); keyDoubleTapTimer->Start(DOUBLE_TAP_DELAY,wxTIMER_ONE_SHOT); } currentScene->ensureVisible(visibleDir); parentStatusBar->SetStatusText(TRANS("Use shift/ctrl-space or double tap to alter reset axis")); parentStatusBar->SetBackgroundColour(*wxCYAN) ; parentStatusTimer->Start(statusDelay,wxTIMER_ONE_SHOT); Refresh(); haveCameraUpdates=true; } } break; default: event.Skip(true); } } void BasicGLPane::setGlClearColour(float r, float g, float b) { ASSERT(r >= 0.0f && r <= 1.0f); ASSERT(g >= 0.0f && g <= 1.0f); ASSERT(b >= 0.0f && b <= 1.0f); currentScene->setBackgroundColour(r,g,b); Refresh(); } void BasicGLPane::keyReleased(wxKeyEvent& event) { float cameraMoveRate=CAMERA_KEYBOARD_SCROLL_RATE; if(event.ShiftDown()) cameraMoveRate*=5; bool update=true; switch(event.GetKeyCode()) { case '-': case '_': case WXK_NUMPAD_SUBTRACT: case WXK_SUBTRACT: { //Do a backwards dolly by fixed amount currentScene->getActiveCam()->forwardsDolly(cameraMoveRate); if(currentScene->haveTempCam()) currentScene->getTempCam()->forwardsDolly(cameraMoveRate); break; } case '+': case '=': case WXK_NUMPAD_ADD: case WXK_ADD: case WXK_NUMPAD_EQUAL: { //Reverse direction of motion cameraMoveRate= -cameraMoveRate; //Do a forwards dolly by fixed amount currentScene->getActiveCam()->forwardsDolly(cameraMoveRate); if(currentScene->haveTempCam()) currentScene->getTempCam()->forwardsDolly(cameraMoveRate); break; } default: event.Skip(true); update=false; } if(update) Refresh(); } void BasicGLPane::resized(wxSizeEvent& evt) { prepare3DViewport(0,0,getWidth(),getHeight()); auto dc=new wxClientDC(this); Refresh(); #ifdef __APPLE__ requireContextUpdate=true; #endif delete dc; } bool BasicGLPane::prepare3DViewport(int tlx, int tly, int brx, int bry) { if(!paneInitialised) return false; //Prevent NaN. if(!(bry-tly)) return false; GLint dims[2]; glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims); //Ensure that the openGL function didn't tell us porkies //but double check for the non-debug builds next line ASSERT(dims[0] && dims[1]); //check for exceeding max viewport and we have some space if(dims[0] <(brx-tlx) || dims[1] < bry-tly || (!dims[0] || !dims[1] )) return false; glViewport( tlx, tly, brx-tlx, bry-tly); float aspect = (float)(brx-tlx)/(float)(bry-tly); currentScene->setWinSize(brx-tlx,bry-tly); currentScene->setAspect(aspect); //Set modelview and projection matrices to the identity // matrix { glMatrixMode( GL_PROJECTION ); glLoadIdentity(); } { glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); } return true; } int BasicGLPane::getWidth() { return GetClientSize().x; } int BasicGLPane::getHeight() { return GetClientSize().y; } void BasicGLPane::render( wxPaintEvent& evt ) { //Prevent calls to openGL if pane not visible if (!IsShown()) return; if(!context) { context = new wxGLContext(this); SetCurrent(*context); #ifdef __APPLE__ requireContextUpdate=false; #endif } if(!paneInitialised) { paneInitialised=true; prepare3DViewport(0,0,getWidth(),getHeight()); } //Apple requires a context update on each resize, for some reason // https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_contexts/opengl_contexts.html //and // https://forums.wxwidgets.org/viewtopic.php?f=23&t=41592&p=168346 #ifdef __APPLE__ if(requireContextUpdate) { SetCurrent(*context); prepare3DViewport(0,0,getWidth(),getHeight()); requireContextUpdate=false; } #endif wxPaintDC(this); currentScene->draw(); glFlush(); SwapBuffers(); } void BasicGLPane::OnEraseBackground(wxEraseEvent &evt) { //Do nothing. This is to help eliminate flicker apparently } void BasicGLPane::updateClearColour() { float rClear,gClear,bClear; currentScene->getBackgroundColour(rClear,gClear,bClear); //Can't set the opengl window without a proper context ASSERT(paneInitialised); setGlClearColour(rClear,gClear,bClear); //Let openGL know that we have changed the colour. glClearColor( rClear, gClear, bClear,1.0f); } TRcontext *BasicGLPane::generateTileContext(unsigned int width, unsigned int height, unsigned char *imageBuffer, bool alpha) const { int panelWidth,panelHeight; GetClientSize(&panelWidth,&panelHeight); //Create TR library tile context TRcontext *tr = trNew(); //Tile size trTileSize(tr,panelWidth,panelHeight,0); //Set overall image size trImageSize(tr, width, height); //Set buffer for overall image if(alpha) trImageBuffer(tr, GL_RGBA, GL_UNSIGNED_BYTE, imageBuffer); else trImageBuffer(tr, GL_RGB, GL_UNSIGNED_BYTE, imageBuffer); //Set the row order for the image trRowOrder(tr, TR_BOTTOM_TO_TOP); return tr; } bool BasicGLPane::saveImage(unsigned int width, unsigned int height, const char *filename, bool showProgress, bool needPostPaint) { GLint dims[2]; glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims); //Opengl should not be giving us zero dimensions here. // if it does, just abandon saving the image as a fallback ASSERT(dims[0] && dims[1]); if(!dims[0] || !dims[1]) return false; //create new image auto image = new wxImage(width,height); unsigned char *imageBuffer= (unsigned char*) malloc(3*(width)*height); if(!imageBuffer) return false; glLoadIdentity(); const Camera *cm = currentScene->getActiveCam(); //We cannot seem to draw outside the current viewport. //in a cross platform manner. //fall back to stitching the image together by hand //Initialise tile data TRcontext *tr; //Inform the tiling system about our camera config float aspect=currentScene->getAspect(); { float farPlane; tr=generateTileContext(width,height, imageBuffer); BoundCube bc = currentScene->getBound(); farPlane = 1.5*bc.getMaxDistanceToBox(cm->getOrigin()); if(cm->getProjectionMode() == PROJECTION_MODE_PERSPECTIVE) { if(cm->type() == CAM_LOOKAT) { const CameraLookAt *cl =(const CameraLookAt*) currentScene->getActiveCam(); trPerspective(tr,cl->getFOV()/2.0,currentScene->getAspect(), cl->getNearPlane(),farPlane); } else { //At this time there are no cameras of this type ASSERT(false); } } else { float orthoScale = cm->getOrthoScale(); trOrtho(tr,-orthoScale*aspect,orthoScale*aspect, -orthoScale,orthoScale,0.0f,farPlane); } } //Obtain tile count from the renderer & init progress //-- unsigned int totalTiles; { unsigned int nRow,nCol,nPass; nRow=trGet(tr,TR_ROWS); nCol=trGet(tr,TR_COLUMNS); if(currentScene->hasOverlays()) nPass = 2; else nPass=1; totalTiles=nRow*nCol*nPass; } wxProgressDialog *wxD=nullptr; showProgress=showProgress && ( totalTiles > 1); if(showProgress) { wxD = new wxProgressDialog(TRANS("Image progress"), TRANS("Rendering tiles..."), totalTiles); } //-- //We have to do two passes. First we have to // do a 3D pass, then we have to separately // draw the overlays. // As we have 2 cameras, one for the normal scene // and one for the overlay, we build the images, // then merge the images, rather than trying to composite the entire scene in situ. //PASS 1: //-------------- //HACK: Flip the all but scene's light z coordinate // for some reason, the frustum has an inversion // somewhere in the coordinate system, and I can't find it! // inverting the tile frustum ends up with the depth test // also inverting. const bool FLIP_LIGHT_HACK=true; //x,y,z and w axis. const bool IMPORTANT_AXIS[4]={true,false,true,false}; //opengl light has 4 float oldLightPos[4]; if(FLIP_LIGHT_HACK) { currentScene->getLightPos(oldLightPos); float newLightPos[4]; for(size_t ui=0;ui<4;ui++) { if(IMPORTANT_AXIS[ui]) newLightPos[ui]=oldLightPos[ui]; else newLightPos[ui]=-oldLightPos[ui]; } currentScene->setLightPos(newLightPos); } if(showProgress) wxD->Show(); //Loop through the tiles/ // note that 2D overlays will not be drawn in this pass unsigned int thisTileNum=0; int haveMoreTiles=1; while(haveMoreTiles) { thisTileNum++; //Manually set the camera //-- glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); if(cm->type() == CAM_LOOKAT) ((const CameraLookAt *)cm)->lookAt(); //-- //Start the tile trBeginTile(tr); currentScene->draw(true); glPopMatrix(); //ending the tile copies // data haveMoreTiles=trEndTile(tr); if(showProgress) wxD->Update(thisTileNum); } if(FLIP_LIGHT_HACK) { //re-set light coordinates currentScene->setLightPos(oldLightPos); } trDelete(tr); //Transfer pointer to image, which will perform free-ing of the buffer image->SetData(imageBuffer); //HACK : Tiling function returns upside-down image. Fix in post-process // argument is to set mirror axis such that x axis is unchanged *image=image->Mirror(false); //-------------- //PASS 2 //-------------- if(currentScene->hasOverlays()) { //alllocate RGBA (4-channel) image imageBuffer= (unsigned char*) malloc(4*(width)*height); if(!imageBuffer) return false; tr=generateTileContext(width,height,imageBuffer,true); trOrtho(tr,0.0f,aspect, 0.0f,1.0f,-1.0f,1.0f); haveMoreTiles=1; float rClear,gClear,bClear; currentScene->getBackgroundColour(rClear,gClear,bClear); glClearColor( rClear, gClear, bClear,0.0f); //I am unclear why, but the faces are reversed glDisable(GL_CULL_FACE); while(haveMoreTiles) { thisTileNum++; //Start the tile trBeginTile(tr); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); currentScene->drawOverlays(true); //ending the tile copies // data haveMoreTiles=trEndTile(tr); if(showProgress) wxD->Update(thisTileNum); } glEnable(GL_CULL_FACE); //restore the GL clear colour updateClearColour(); ///unpack the tile buffer into a wx image wxImage imageOverlay(width,height); imageOverlay.InitAlpha(); //FIXME: HACK - using "blue screen" effect //don't use background as mask colour. // use depth buffer or gl alpha unsigned char clear[3]; clear[0] = (unsigned char)rClear*255.0f; clear[1] = (unsigned char)gClear*255.0f; clear[2] = (unsigned char)bClear*255.0f; const unsigned char *mask = clear; copyRGBAtoWXImage(width,height,imageBuffer,imageOverlay,mask); free(imageBuffer); combineWxImage(*image,imageOverlay); //Free the tile buffer trDelete(tr); } //-------------- bool isOK=image->SaveFile(filename,wxBITMAP_TYPE_PNG); if(showProgress) wxD->Destroy(); delete image; if (needPostPaint) { wxPaintEvent event; wxPostEvent(this,event); } return isOK; } void BasicGLPane::OnAxisTapTimer(wxTimerEvent &evt) { lastKeyDoubleTap=(unsigned int)-1; } bool BasicGLPane::saveImageSequence(unsigned int resX, unsigned int resY, unsigned int nFrames, wxString &path,wxString &prefix, wxString &ext) { //OK, lets animate! // ASSERT(!currentScene->haveTempCam()); std::string outFile; wxProgressDialog *wxD = new wxProgressDialog(TRANS("Animation progress"), TRANS("Rendering sequence..."), nFrames,this,wxPD_CAN_ABORT|wxPD_APP_MODAL ); wxD->Show(); std::string tmpStr,tmpStrTwo; stream_cast(tmpStrTwo,nFrames); Camera *origCam=currentScene->getActiveCam()->clone(); for(unsigned int ui=0;uiclone(); modifiedCam->move(angle,0); currentScene->setActiveCam(modifiedCam); //Save the result outFile = string(stlStr(path))+ string("/") + string(stlStr(prefix))+digitStr+ string(".") + string(stlStr(ext)); if(!saveImage(resX,resY,outFile.c_str(),false, false)) { currentScene->setActiveCam(origCam); return false; } //Update the progress bar stream_cast(tmpStr,ui+1); //Tell user which image from the animation we are saving tmpStr = std::string(TRANS("Saving Image ")) + tmpStr + std::string(TRANS(" of ")) + tmpStrTwo + "..."; if(!wxD->Update(ui,tmpStr)) break; Refresh(); } currentScene->setActiveCam(origCam); //Discard the current temp. cam to return the scene back to normal currentScene->discardTempCam(); wxD->Destroy(); wxPaintEvent event; wxPostEvent(this,event); return true; } 3Depict-0.0.22/src/gui/cropPanel.cpp0000644000175000017500000003407013414250067016462 0ustar pcuserpcuser/* * wxCropPanel.cpp - cropping window for user interaction * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "cropPanel.h" #include #include "common/assertion.h" #include //Crop array indices enum { CROP_LEFT, CROP_TOP, CROP_RIGHT, CROP_BOTTOM, CROP_ENUM_END }; BEGIN_EVENT_TABLE(CropPanel, wxPanel) EVT_PAINT(CropPanel::onPaint) EVT_MOTION(CropPanel::mouseMove) EVT_LEFT_DOWN(CropPanel::mouseDown) EVT_LEFT_UP(CropPanel::mouseReleased) EVT_LEAVE_WINDOW(CropPanel::mouseLeftWindow) EVT_LEFT_DCLICK(CropPanel::mouseDoubleLeftClick) EVT_ERASE_BACKGROUND(CropPanel::OnEraseBackground) EVT_SIZE(CropPanel::onResize) END_EVENT_TABLE() CropPanel::CropPanel(wxWindow * parent, wxWindowID id, const wxPoint & pos,const wxSize & size,long style) : wxPanel(parent, id, pos, size, style) { SetBackgroundStyle(wxBG_STYLE_CUSTOM); programmaticEvent=false; crop[0]=crop[1]=crop[2]=crop[3]=0.2; selMode=SELECT_MODE_NONE; dragging=false; linkedPanel=nullptr; linkMode=CROP_LINK_NONE; hasUpdates=false; } void CropPanel::OnEraseBackground(wxEraseEvent &event) { //Intentionally do nothing, to suppress background erase } void CropPanel::mouseMove(wxMouseEvent &event) { int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; //Do our calculations in reduced coordinates (0->1); float xMouse,yMouse; wxPoint mousePos =event.GetPosition(); //FIXME: This linearly distributes the distance across the control // perhaps we want to have a less linear model? //Add a 1px border around control xMouse=(float)(mousePos.x+1)/(float)(w-2); yMouse=(float)(mousePos.y+1)/(float)(h-2); if(!dragging) { unsigned int index; selMode=getBestCropWidget(xMouse,yMouse,index); //Update the currently selected index as needed if(selMode == SELECT_MODE_SIDE || selMode == SELECT_MODE_CORNER) selIndex=index; } else { float origCrop[4]; for(unsigned int ui=0;ui<4;ui++) origCrop[ui]=crop[ui]; switch(selMode) { case SELECT_MODE_NONE: ASSERT(false); // Can't be dragging nothing, can we. break; case SELECT_MODE_SIDE: { // we are dragging one of the side crop walls switch(selIndex) { case 0: crop[selIndex ] =xMouse; break; case 1: crop[selIndex ] = yMouse; break; case 2: crop[selIndex]=1.0-xMouse; break; case 3: crop[selIndex]=1.0-yMouse; break; } break; } case SELECT_MODE_CORNER: { //we are dragging one of the corners switch(selIndex) { case 0: crop[0] =xMouse; crop[1]=yMouse; break; case 1: crop[1]=yMouse; crop[2] =1.0-xMouse; break; case 2: crop[2] =1.0-xMouse; crop[3]=1.0-yMouse; break; case 3: crop[3] =1.0-yMouse; crop[0]=xMouse; break; } break; } case SELECT_MODE_CENTRE: { //OK, we have to move them based upon the original drag //coordinates float delta[2]; delta[0]=xMouse-mouseAtDragStart[0]; delta[1]=yMouse-mouseAtDragStart[1]; //If shift down, only drag in one direction if(event.ShiftDown()) { if(abs(delta[1]) < abs(delta[0])) delta[1]=0; else delta[0]=0; } for(unsigned int ui=0;ui<4;ui++) { float flip; if(ui<2) flip=1.0; else flip=-1; crop[ui]=cropAtDragStart[ui]+delta[ui&1]*flip; } break; } } //Check the result is still valid if(!validCoords()) { //Try to only adjust the invalid coordinates, //to make the motion a little "smoother" for(unsigned int ui=0;ui<4;ui++) { if(crop[ui] > 1.0 || crop[ui] < 0.0) crop[ui]=origCrop[ui]; } //See if our quick fix solved the coord validity if(!validCoords()) { //restore the original coords for(unsigned int ui=0;ui<4;ui++) crop[ui]=origCrop[ui]; } } if(linkedPanel) updateLinked(); hasUpdates=true; } Refresh(); } unsigned int CropPanel::getBestCropWidget(float xMouse, float yMouse,unsigned int &index) const { unsigned int bestSelMode=SELECT_MODE_NONE; int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return bestSelMode; float meanPx = 1.0/(1.0/(w-2) + 1.0/(h-2)); unsigned int minIndex; float minDist=std::numeric_limits::max(); float x,y; //work our way clockwise around the corners //finding the minimum distance for(unsigned int ui=0;ui<4;ui++) { //Check this corner switch(ui) { case 0: //Top left corner x=crop[CROP_LEFT]; y=crop[CROP_TOP]; break; case 1: //Top right corner x=1.0-crop[CROP_RIGHT]; y=crop[CROP_TOP]; break; case 2: //Bottom right corner x=1.0-crop[CROP_RIGHT]; y=1.0-crop[CROP_BOTTOM]; break; case 3: //Bottom left corner x=crop[CROP_LEFT]; y=1.0-crop[CROP_BOTTOM]; break; default: ASSERT(false); } float tmpDist; tmpDist=(xMouse-x)*(xMouse-x) + (yMouse-y)*(yMouse-y); if(tmpDist < minDist) { minIndex=ui; minDist=tmpDist; } } minDist=sqrtf(minDist); bool haveCorner; const float MIN_CUTOFF_DISTANCE= 3; //Do we have a corner minimum? haveCorner= ((int)(minDist*meanPx) < MIN_CUTOFF_DISTANCE); bool haveCentre; float meanX = (float)(crop[0] + (1.0-crop[2]))*0.5; float meanY = (float)(crop[1] + (1.0-crop[3]))*0.5; float centreDist; centreDist=sqrtf((xMouse-meanX)*(xMouse-meanX) + (yMouse-meanY)*(yMouse-meanY)); //Check the centre, which is allowed to trump the corners if(haveCorner) haveCentre=(centreDist< minDist); else haveCentre=(meanPx*centreDist) < MIN_CUTOFF_DISTANCE; unsigned int sideIndex; bool haveSide=false; //OK, well, we are allowed to have a side match, check that. if(fabs(crop[CROP_LEFT] - xMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_LEFT; } //OK, well, we are allowed to have a side match, check that. else if(fabs((1.0-crop[CROP_RIGHT]) - xMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_RIGHT; } else if(fabs(crop[CROP_TOP] - yMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_TOP; } else if(fabs((1.0- crop[CROP_BOTTOM]) - yMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_BOTTOM; } //!Prioritise selection mode if(haveCentre) { bestSelMode=SELECT_MODE_CENTRE; } else if(haveCorner) { bestSelMode=SELECT_MODE_CORNER; index=minIndex; } else if(haveSide) { bestSelMode=SELECT_MODE_SIDE; index=sideIndex; } else { bestSelMode=SELECT_MODE_NONE; } return bestSelMode; } void CropPanel::mouseDoubleLeftClick(wxMouseEvent& event) { //set the snap position using a bitmask int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; unsigned int index; float xMouse,yMouse; wxPoint mousePos =event.GetPosition(); //Add a 1px border around control xMouse=(float)(mousePos.x+1)/(float)(w-2); yMouse=(float)(mousePos.y+1)/(float)(h-2); switch(getBestCropWidget(xMouse,yMouse,index)) { //Just reset the crop values //if we are at the centre or side case SELECT_MODE_NONE: case SELECT_MODE_CENTRE: { for(unsigned int ui=0;ui<4;ui++) crop[ui]=0; break; } case SELECT_MODE_SIDE: { //Ok, lets reset just this side crop[index]=0; break; } case SELECT_MODE_CORNER: { crop[index]=0; crop[(index+1)%4]=0; break; } default: ASSERT(false); } Refresh(); if(linkedPanel) updateLinked(); hasUpdates=true; event.Skip(); } void CropPanel::mouseLeftWindow(wxMouseEvent& event) { if(!dragging) selMode=SELECT_MODE_NONE; } void CropPanel::mouseDown(wxMouseEvent &event) { //set the snap position using a bitmask int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; //Do our calculations in reduced coordinates (0->1); wxPoint mousePos =event.GetPosition(); mouseAtDragStart[0]=(float)(mousePos.x+1)/(float)(w-2); mouseAtDragStart[1]=(float)(mousePos.y+1)/(float)(h-2); ASSERT(validCoords()); if(selMode != SELECT_MODE_NONE) dragging=true; for(unsigned int ui=0;ui<4;ui++) cropAtDragStart[ui] = crop[ui]; } void CropPanel::mouseReleased(wxMouseEvent &event) { dragging=false; selMode=SELECT_MODE_NONE; selIndex=0; Refresh(); } bool CropPanel::validCoords() const { float sum; sum=(crop[CROP_LEFT] + crop[CROP_RIGHT]); //Draw the four crop markers if(sum > 1.00f) return false; sum=(crop[CROP_TOP] + crop[CROP_BOTTOM]); if( sum> 1.00f) return false; for(unsigned int ui=0;ui<4;ui++) { if(crop[ui] < 0.0) return false; } return true; } void CropPanel::onPaint(wxPaintEvent &event) { draw(); } void CropPanel::draw() { ASSERT(validCoords()); auto dc=new wxAutoBufferedPaintDC(this); auto b = new wxBrush; b->SetColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); dc->Clear(); int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) { delete dc; return; } //Drawing coords int lineX[8],lineY[8]; //Draw lines lineX[0]=lineX[1]=(int)(crop[CROP_LEFT]*(float)w); lineX[2]=0; lineX[3]=w; lineX[4]=lineX[5]=(int)((1.0-crop[CROP_RIGHT])*(float)w); lineX[6]=w; lineX[7]=0; lineY[0]=0; lineY[1]=h; lineY[2]=lineY[3]=(int)(crop[CROP_TOP]*(float)h); lineY[4]=0; lineY[5]=h; lineY[6]=lineY[7]=(int)((1.0-crop[CROP_BOTTOM])*(float)h); //Draw greyed out section //-- wxPen *noPen; #if wxCHECK_VERSION(3,1,0) noPen = new wxPen(*wxBLACK,1,wxPENSTYLE_TRANSPARENT); #else noPen = new wxPen(*wxBLACK,1,wxTRANSPARENT); #endif b->SetColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); dc->SetBrush(*b); dc->SetPen(*noPen); dc->DrawRectangle(0,0,lineX[0],h); dc->DrawRectangle(0,0,w,lineY[2]); dc->DrawRectangle(0,lineY[6],w,h-lineY[6]); dc->DrawRectangle(lineX[4],0,w-lineX[4],h); delete noPen; delete b; //-- wxPen *highPen,*normalPen; highPen= new wxPen(*wxBLUE,2,wxSOLID); normalPen= new wxPen(*wxBLACK,2,wxSOLID); dc->SetPen(*normalPen); if(selMode!=SELECT_MODE_SIDE) { dc->SetPen(*normalPen); for(unsigned int ui=0;ui<8;ui+=2) dc->DrawLine(lineX[ui],lineY[ui],lineX[ui+1],lineY[ui+1]); } else { for(unsigned int ui=0;ui<8;ui+=2) { if(selIndex== ui/2) dc->SetPen(*highPen); else dc->SetPen(*normalPen); dc->DrawLine(lineX[ui],lineY[ui],lineX[ui+1],lineY[ui+1]); } dc->SetPen(*normalPen); } if(selMode == SELECT_MODE_CORNER) { //Draw the corner markers float xC,yC; float sizeX,sizeY; sizeX=sizeY=8; switch(selIndex) { case 0: xC=crop[CROP_LEFT]; yC=crop[CROP_TOP]; sizeX=-sizeX; sizeY=-sizeY; break; case 1: xC=1.0-crop[CROP_RIGHT]; yC=crop[CROP_TOP]; sizeY=-sizeY; break; case 2: xC=1.0-crop[CROP_RIGHT]; yC=1.0-crop[CROP_BOTTOM]; break; case 3: sizeX=-sizeX; xC=crop[CROP_LEFT]; yC=1.0-crop[CROP_BOTTOM]; break; default: ASSERT(false); } xC=xC*(float)w; yC=yC*(float)h; //Draw the corner dc->SetPen(*highPen); dc->DrawLine(wxCoord(xC + 2.0f*sizeX), wxCoord(yC+sizeY), wxCoord(xC+sizeX),wxCoord(yC+sizeY)); dc->DrawLine(wxCoord(xC+sizeX), wxCoord(yC+sizeY), wxCoord(xC+sizeX),wxCoord(yC+2.0f*sizeY)); dc->SetPen(*normalPen); } float meanX = (float)w*(crop[0] + (1.0-crop[2]))*0.5; float meanY = (float)h*(crop[1] + (1.0-crop[3]))*0.5; dc->DrawCircle((int)meanX,(int)meanY,1); if(selMode==SELECT_MODE_CENTRE) { dc->SetPen(*highPen); dc->DrawCircle((int)meanX,(int)meanY,4); } delete dc; delete highPen; delete normalPen; } void CropPanel::updateLinked() { ASSERT(linkedPanel); switch(linkMode) { case CROP_LINK_NONE: return; case CROP_LINK_LR: linkedPanel->crop[CROP_LEFT]=crop[CROP_LEFT]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_RIGHT]; break; case CROP_LINK_LR_FLIP: linkedPanel->crop[CROP_BOTTOM]=crop[CROP_LEFT]; linkedPanel->crop[CROP_TOP]=crop[CROP_RIGHT]; break; case CROP_LINK_TB: linkedPanel->crop[CROP_BOTTOM]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_TOP]=crop[CROP_TOP]; break; case CROP_LINK_TB_FLIP: linkedPanel->crop[CROP_LEFT]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_TOP]; break; case CROP_LINK_BOTH: linkedPanel->crop[CROP_LEFT]=crop[CROP_LEFT]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_RIGHT]; linkedPanel->crop[CROP_BOTTOM]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_TOP]=crop[CROP_TOP]; break; case CROP_LINK_BOTH_FLIP: linkedPanel->crop[CROP_BOTTOM]=crop[CROP_LEFT]; linkedPanel->crop[CROP_TOP]=crop[CROP_RIGHT]; linkedPanel->crop[CROP_LEFT]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_TOP]; break; default: ASSERT(false); } linkedPanel->Refresh(); } void CropPanel::link(CropPanel *panel,unsigned int mode) { linkMode=mode; if(linkMode== CROP_LINK_NONE) linkedPanel=nullptr; else { linkedPanel=panel; for(unsigned int ui=0;uicrop[ui]=crop[ui]; } } void CropPanel::getCropValues(float *array) const { array[0]=crop[CROP_LEFT]; array[1]=crop[CROP_RIGHT]; array[2]=crop[CROP_TOP]; array[3]=crop[CROP_BOTTOM]; } void CropPanel::setCropValue(unsigned int index, float v) { ASSERT(index<=CROP_BOTTOM); crop[index]=v; } void CropPanel::makeCropValuesValid() { for(size_t ui=0;ui<4;ui++) { crop[ui]=std::max(crop[ui],0.0f); crop[ui]=std::min(crop[ui],1.0f); } if(crop[CROP_LEFT] + crop[CROP_RIGHT] >1) crop[CROP_LEFT]=crop[CROP_RIGHT]=0.2f; if(crop[CROP_TOP] + crop[CROP_BOTTOM] >1) crop[CROP_TOP]=crop[CROP_BOTTOM]=0.2f; } void CropPanel::onResize(wxSizeEvent &evt) { #ifndef __WXMAC__ wxPaintEvent paintEvt; wxPostEvent(this,paintEvt); #endif } 3Depict-0.0.22/src/gui/glade-skeleton/0000755000175000017500000000000013414242543016725 5ustar pcuserpcuser3Depict-0.0.22/src/gui/glade-skeleton/animateFilterDialog.wxg0000644000175000017500000012230612121141743023356 0ustar pcuserpcuser /*\n * animateFilterDialog - GUI for animate filter\n * Copyright (C) 2012, D. Haley, A Ceguerra \n \n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n \n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n Export Animation Enter parameters for exporting animatio frames wxVERTICAL wxEXPAND 0 Filter view Frame view Enter animation key frames for each filter's property wxHORIZONTAL wxEXPAND 0 wxSPLIT_VERTICAL filterRightPane filterLeftPane wxVERTICAL wxALL|wxEXPAND 3 Select filter ID_FILTER_TREE_CTRL OnFilterTreeCtrlSelChanged wxALL|wxEXPAND 3 ID_PROPERTY_GRID Select property; double click to fill key frames with default values 1 1 1 10 1 1 1 wxGrid.wxGridSelectCells Property Value OnPropGridDClick OnFilterGridCellEditorShow wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALL|wxEXPAND 3 ID_FILTER_GRID_CTRL Key frame table 1 1 1 0 1 1 1 wxGrid.wxGridSelectCells Filter Property Mode Start Frame End Frame OnAnimateDClick wxALL|wxEXPAND 3 wxHORIZONTAL wxALIGN_CENTER_HORIZONTAL 0 REMOVE Remove the selected key frame from the table ID_BUTTON_FRAME_REMOVE OnButtonKeyFrameRemove Viewer for animation parameters for each frame wxHORIZONTAL wxEXPAND 0 wxVERTICAL wxALL|wxEXPAND 4 wxHORIZONTAL wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 3 1 Enter or browse to directory where the animation frames will be exported to wxEXPAND 0 Enter where the animation frames will be exported to ID_TEXTBOX_WORKDIR OnOutputDirText wxLEFT|wxRIGHT 2 OPEN Browse to directory where the animation frames will be exported to ID_BUTTON_WORKDIR OnButtonWorkDir wxBOTTOM|wxEXPAND 5 wxHORIZONTAL 0 20 20 0 1 ID_CHECK_ONLYDATACHANGE OnCheckOutDataChange wxTOP|wxBOTTOM|wxEXPAND 3 1 wxTOP|wxBOTTOM 4 1 wxLEFT|wxTOP 3 1 ID_CHECK_IMAGE_OUT OnCheckImageOutput wxEXPAND 0 wxVERTICAL wxALL|wxEXPAND 3 wxHORIZONTAL wxLEFT|wxALIGN_CENTER_VERTICAL 3 1 Enter the target resolution (width) wxALL|wxEXPAND 4 Enter the target resolution (width) ID_TEXTBOX_IMAGEPREFIX OnImageFilePrefix wxALL|wxEXPAND 3 wxHORIZONTAL wxLEFT|wxALIGN_CENTER_VERTICAL 3 1 Enter the target resolution (width) wxALL|wxEXPAND 4 Enter the target resolution (width) ID_TEXTBOX_IMAGESIZE OnTextImageSize wxALL 4 ID_BUTTON_IMAGE_RES OnBtnResolution wxLEFT|wxBOTTOM 3 ID_CHECK_POINT_OUNT OnCheckPointOutput wxLEFT|wxTOP 3 ID_CHECK_PLOT_OUT OnCheckPlotOutput wxLEFT|wxTOP|wxBOTTOM 3 ID_CHECK_VOXEL_OUT OnCheckVoxelOutput wxALL 3 ID_CHECK_RANGE_OUT OnCheckRangeOutput wxLEFT|wxBOTTOM|wxEXPAND 5 wxHORIZONTAL wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 3 1 wxLEFT|wxRIGHT|wxEXPAND 3 -1 ID_COMBO_RANGE_TYPE ORNL RNG CAMECA RRNG CAMECA ENV OnRangeTypeCombo 0 20 20 wxLEFT|wxRIGHT|wxEXPAND 5 1 wxALL|wxEXPAND 3 wxVERTICAL wxALL|wxEXPAND 3 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 Use the slider or enter the frame to view animation parameters wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 5 Slider to select frame ID_FRAME_SLIDER 1, 1 1 OnFrameSlider wxALIGN_CENTER_VERTICAL 0 Enter frame number ID_FRAME_TEXTBOX OnTextFrame wxEXPAND 0 ID_FILTER_PROPERTY_VALUE_GRID Animation parameters for current frame 1 1 1 0 1 1 1 wxGrid.wxGridSelectCells Filter Property Value wxEXPAND 0 wxHORIZONTAL wxEXPAND 0 1 20 wxALL|wxALIGN_BOTTOM 3 CANCEL Abort animation OnButtonCancel wxALL|wxALIGN_BOTTOM 3 OK Run Animation OnButtonOK 3Depict-0.0.22/src/gui/glade-skeleton/preferencesDialog.wxg0000644000175000017500000007164212270276631023113 0ustar pcuserpcuser Preferences 640, 487 wxVERTICAL wxEXPAND 0 Pref Startup Camera wxHORIZONTAL wxEXPAND 0 wxVERTICAL 0 1 wxEXPAND 0 0 ID_LIST_FILTERS OnListClick 0 20 20 wxEXPAND 0 wxVERTICAL wxEXPAND 0 ID_GRID_PROPERTIES 0 1 1 1 1 1 OnFilterCellClick OnFilterCellChange wxEXPAND 0 wxHORIZONTAL 0 Reset all filter initial values back to program defaults 0 Reset the filter initial values back to program defaults 0 20 20 wxVERTICAL wxALL|wxEXPAND 5 wxVERTICAL 0 0 Set the method of panel layout when starting the program ID_START_COMBO_PANEL Always show Remember Specify OnStartupPanelCombo wxEXPAND 0 wxHORIZONTAL 0 20 20 wxEXPAND 0 wxVERTICAL 0 ID_START_CHECK_CONTROL OnStartupCheckControl 0 ID_START_CHECK_RAWDATA OnStartupCheckRawData 0 ID_START_CHECK_PLOTLIST OnStartupCheckPlotList wxALL|wxEXPAND 5 wxVERTICAL 0 Lets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again. wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALL 5 By default, use an orthographic camera at startup. State files will override this preference. OnCheckPreferOrtho wxEXPAND 0 wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 0 20 20 wxALIGN_CENTER_VERTICAL 0 1 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 Camera translation, orbit and swivel rates. ID_MOUSE_MOVE_SLIDER 1, 100 1 OnMouseMoveSlider wxALIGN_CENTER_VERTICAL 0 1 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 0 20 20 wxALIGN_CENTER_VERTICAL 0 1 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 Camera zooming rate. ID_MOUSE_ZOOM_SLIDER 1, 100 1 OnMouseZoomSlider wxALIGN_CENTER_VERTICAL 0 1 ID_MOUSE_ZOOM_SLIDER wxEXPAND 0 wxHORIZONTAL wxEXPAND 0 20 20 wxTOP 8 OK wxLEFT|wxTOP|wxBOTTOM 8 CANCEL 0 20 10 3Depict-0.0.22/src/gui/glade-skeleton/rangeDialog.wxg0000644000175000017500000005011012270276631021671 0ustar pcuserpcuser enum\n{\n ID_CHECK_SHOW_OVERLAY=wxID_ANY+1,\n ID_SPLIT_LEFTRIGHT,\n ID_GRID_RANGES,\n ID_BTN_RANGE_ADD,\n ID_BTN_RANGE_REMOVE,\n ID_COMBO_OVERLAY_MANAGE_SET,\n ID_COMBO_SIMPLE_OVERLAY,\n ID_LIST_MANAGE_SET_ENTRIES,\n ID_LIST_MANAGE_SET_VALUES,\n ID_LIST_OVERLAY_COMBINED,\n ID_LIST_OVERLAY_COMBINED_CMPNT,\n ID_LIST_OVERLAY_COMBINED_SELECTION,\n ID_LIST_OVERLAY_SIMPLE,\n ID_LIST_OVERLAY_SIMPLE_CMPNT,\n ID_LIST_PLOTS,\n ID_MANAGE_SET_MORE,\n ID_PLOT_AREA,\n ID_TEXT_FILTER_COMBINED,\n ID_TEXT_FILTER_SIMPLE_CMPNT,\n\n}; Range Editor wxHORIZONTAL wxEXPAND 0 wxSPLIT_VERTICAL ID_SPLIT_LEFTRIGHT panelSplitRight panelSplitLeft OnSashVerticalUnsplit wxHORIZONTAL wxEXPAND 0 Plots Ranges Overlay ID_NOTE_TOOL wxVERTICAL wxEXPAND 0 0 ID_LIST_PLOTS OnListPlots wxALL|wxALIGN_RIGHT 5 1 OnCheckSpectrumOnly wxVERTICAL wxALL|wxEXPAND 4 ID_GRID_RANGES 1 1 1 10 1 1 1 wxGrid.wxGridSelectCells A B C OnGridRangesCellChange wxALL|wxEXPAND 4 wxHORIZONTAL 0 20 20 wxALL 4 ADD ID_BTN_RANGE_ADD OnBtnRangeAdd wxALL 4 REMOVE ID_BTN_RANGE_REMOVE OnBtnRangeRemove wxVERTICAL wxEXPAND 0 wxVERTICAL wxALL 5 ID_CHECK_SHOW_OVERLAY OnCheckShowOvelay wxEXPAND 0 wxVERTICAL wxALL|wxEXPAND 2 wxVERTICAL wxEXPAND 0 ID_TEXT_FILTER_SIMPLE_CMPNT OnTextFilterSimple wxEXPAND 0 ID_LIST_OVERLAY_SIMPLE OnListOverlaySimpleDelete wxVERTICAL wxEXPAND 0 ID_PLOT_AREA wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL 4 wxHORIZONTAL 0 20 20 wxALL 4 OK OnBtnOK wxALL 4 CANCEL OnBtnCancel 3Depict-0.0.22/src/gui/glade-skeleton/animateSubDialogs/0000755000175000017500000000000012121141743022312 5ustar pcuserpcuser3Depict-0.0.22/src/gui/glade-skeleton/animateSubDialogs/stringKeyFrameDialog.wxg0000644000175000017500000002622712121141743027124 0ustar pcuserpcuser enum\n{\nID_TEXT_START_FRAME,\nID_RADIO_FROM_FILE,\nID_TEXT_FROM_FILE,\nID_RADIO_FROM_TABLE,\nID_GRID_STRINGS\n}; String Keyframes Frame at which to start string sequence 595, 412 wxVERTICAL wxALL|wxEXPAND 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 wxLEFT|wxALIGN_CENTER_VERTICAL 6 Frame offset for data start ID_TEXT_START_FRAME OnTextStart 0 20 20 wxALL|wxEXPAND 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 ID_RADIO_FROM_FILE OnFileRadio wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 6 File to use as string data source, one value per row ID_TEXT_FROM_FILE OnTextFilename wxLEFT|wxRIGHT 6 OPEN Select file to use as data source wxID_OPEN OnBtnChooseFile wxLEFT 6 Use table below for data source ID_RADIO_FROM_TABLE OnTableRadio wxEXPAND 0 wxHORIZONTAL wxALL|wxEXPAND 5 ID_GRID_STRINGS 1 1 1 0 1 1 1 wxGrid.wxGridSelectCells Frame Value OnGridCellChange OnGridEditorShown wxRIGHT|wxEXPAND 5 wxVERTICAL wxBOTTOM 5 ADD Add new data rows to table wxID_ADD OnBtnAdd 0 REMOVE Remove selected strings from table wxID_REMOVE OnBtnRemove wxEXPAND 0 wxHORIZONTAL 0 20 20 wxALL 5 CANCEL Abort value selection and return to previous window wxID_CANCEL wxALL 5 OK Accept data values wxID_OK 3Depict-0.0.22/src/gui/glade-skeleton/animateSubDialogs/realKeyFrameDialog.wxg0000644000175000017500000004121612121141743026534 0ustar pcuserpcuser enum{\nID_COMBO_TRANSITION,\nID_TEXT_FINAL_VALUE,\nID_TEXT_FRAME_START,\nID_TEXT_INITIAL_VALUE,\n}; Key Frame :Number wxVERTICAL 0 5 20 wxEXPAND 0 wxHORIZONTAL 0 20 10 wxEXPAND 0 wxVERTICAL 0 10 20 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 14 1 wxLEFT|wxALIGN_CENTER_VERTICAL 5 -1 ID_COMBO_TRANSITION Step Ramp OnComboTransition wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextStartFrame wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 12 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextEndFrame 0 10 20 wxLEFT|wxRIGHT|wxEXPAND 5 1 wxEXPAND 0 wxVERTICAL 0 20 20 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_INITIAL_VALUE OnTextInitialValue wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 9 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FINAL_VALUE OnTextFinalValue 0 20 20 0 20 10 wxEXPAND 0 wxHORIZONTAL 0 20 20 wxALL 4 CANCEL OnButtonCancel wxALL 4 OK OnButtonOK 3Depict-0.0.22/src/gui/glade-skeleton/animateSubDialogs/choiceKeyFrameDialog.wxg0000644000175000017500000001241612121141743027043 0ustar pcuserpcuser enum\n{\nID_TEXT_FRAME,\nID_COMBO_CHOICE\n}; Key Frame wxVERTICAL wxALL|wxEXPAND 10 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 20 1 wxLEFT|wxALIGN_CENTER_VERTICAL 5 ID_TEXT_FRAME OnFrameText wxLEFT|wxRIGHT|wxTOP|wxEXPAND 10 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT 5 -1 ID_COMBO_CHOICE OnChoiceCombo wxALL|wxEXPAND 5 wxHORIZONTAL 0 20 20 wxRIGHT 5 CANCEL wxID_CANCEL wxLEFT 5 OK wxID_OK 3Depict-0.0.22/src/gui/glade-skeleton/animateSubDialogs/colourChooserDialog.wxg0000644000175000017500000004616012121141743027016 0ustar pcuserpcuser enum{\nID_COMBO_TRANSITION,\nID_TEXT_FINAL_VALUE,\nID_TEXT_FRAME_START,\nID_TEXT_INITIAL_VALUE,\n}; Key Frame : Colour wxVERTICAL 0 5 20 wxEXPAND 0 wxHORIZONTAL 0 20 10 wxEXPAND 0 wxVERTICAL 0 10 20 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 14 1 wxLEFT|wxALIGN_CENTER_VERTICAL 5 -1 ID_COMBO_TRANSITION Step Ramp OnComboTransition wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextStartFrame wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 12 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextEndFrame 0 10 20 wxLEFT|wxRIGHT|wxEXPAND 5 1 wxEXPAND 0 wxVERTICAL 0 20 20 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL 0 20 20 wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 0 1 wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 3 Colour at the start of the transtition OnBtnStartColour 0 20 20 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL 0 20 20 wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 9 1 wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 3 Colour at end of transition OnBtnEndColour 0 20 20 0 20 20 0 20 10 wxEXPAND 0 wxHORIZONTAL 0 20 20 wxALL 4 CANCEL wxID_CANCEL OnButtonCancel wxALL 4 OK wxID_OK OnButtonOK 3Depict-0.0.22/src/gui/glade-skeleton/mainWindow.wxg0000644000175000017500000030103013305612110021553 0ustar pcuserpcuser //Constant identifiers for binding events in wxwidgets "event table"\n enum {\n \n //File menu\n ID_MAIN_WINDOW= wxID_ANY+1,\n \n ID_FILE_EXIT,\n ID_FILE_OPEN,\n ID_FILE_MERGE,\n ID_FILE_SAVE,\n ID_FILE_SAVEAS,\n ID_FILE_EXPORT_PLOT,\n ID_FILE_EXPORT_IMAGE,\n ID_FILE_EXPORT_IONS,\n ID_FILE_EXPORT_RANGE,\n ID_FILE_EXPORT_ANIMATION,\n ID_FILE_EXPORT_FILTER_ANIMATION,\n ID_FILE_EXPORT_PACKAGE,\n \n //Edit menu\n ID_EDIT_UNDO,\n ID_EDIT_REDO,\n ID_EDIT_RANGE,\n ID_EDIT_PREFERENCES,\n \n //Help menu\n ID_HELP_ABOUT,\n ID_HELP_HELP,\n ID_HELP_CONTACT,\n \n //View menu\n ID_VIEW_BACKGROUND,\n ID_VIEW_CONTROL_PANE,\n ID_VIEW_RAW_DATA_PANE,\n ID_VIEW_SPECTRA,\n ID_VIEW_PLOT_LEGEND,\n ID_VIEW_WORLDAXIS,\n ID_VIEW_FULLSCREEN,\n //Left hand note pane\n ID_NOTEBOOK_CONTROL,\n ID_NOTE_CAMERA,\n ID_NOTE_DATA,\n ID_NOTE_PERFORMANCE,\n ID_NOTE_TOOLS,\n ID_NOTE_VISUALISATION,\n //Lower pane\n ID_PANEL_DATA,\n ID_PANEL_VIEW,\n ID_NOTE_SPECTRA,\n ID_NOTE_RAW,\n ID_GRID_RAW_DATA,\n ID_BUTTON_GRIDCOPY,\n ID_LIST_PLOTS,\n \n //Splitter IDs\n ID_SPLIT_LEFTRIGHT,\n ID_SPLIT_FILTERPROP,\n ID_SPLIT_TOP_BOTTOM,\n ID_SPLIT_SPECTRA,\n ID_RAWDATAPANE_SPLIT,\n ID_CONTROLPANE_SPLIT,\n \n //Camera panel \n ID_COMBO_CAMERA,\n ID_GRID_CAMERA_PROPERTY,\n \n //Filter panel \n ID_COMBO_FILTER,\n ID_COMBO_STASH,\n ID_BTN_STASH_MANAGE,\n ID_CHECK_AUTOUPDATE,\n ID_FILTER_NAMES,\n ID_GRID_FILTER_PROPERTY,\n ID_LIST_FILTER,\n ID_TREE_FILTERS,\n ID_BUTTON_REFRESH,\n ID_BTN_EXPAND,\n ID_BTN_COLLAPSE,\n ID_BTN_FILTERTREE_ERRS,\n \n //Effects panel\n ID_EFFECT_ENABLE,\n ID_EFFECT_CROP_ENABLE,\n ID_EFFECT_CROP_AXISONE_COMBO,\n ID_EFFECT_CROP_PANELONE,\n ID_EFFECT_CROP_PANELTWO,\n ID_EFFECT_CROP_AXISTWO_COMBO,\n ID_EFFECT_CROP_CHECK_COORDS,\n ID_EFFECT_CROP_TEXT_DX,\n ID_EFFECT_CROP_TEXT_DY,\n ID_EFFECT_CROP_TEXT_DZ,\n ID_EFFECT_STEREO_ENABLE,\n ID_EFFECT_STEREO_COMBO,\n ID_EFFECT_STEREO_BASELINE_SLIDER,\n ID_EFFECT_STEREO_LENSFLIP,\n \n //Options panel\n ID_CHECK_ALPHA,\n ID_CHECK_LIGHTING,\n ID_CHECK_LIMIT_POINT_OUT,\n ID_TEXT_LIMIT_POINT_OUT,\n ID_CHECK_CACHING,\n ID_CHECK_WEAKRANDOM,\n ID_SPIN_CACHEPERCENT,\n \n //Misc\n ID_PROGRESS_ABORT,\n ID_STATUS_TIMER,\n ID_PROGRESS_TIMER,\n ID_UPDATE_TIMER,\n ID_AUTOSAVE_TIMER,\n \n \n };\n 3Depict 1 1 ID_FILE_OPEN Open Open state file OnFileOpen ID_FILE_MERGE Merge "Merge other file" OnFileMerge ID_FILE_SAVE Save Save state to file OnFileSave ID_FILE_SAVEAS MenuSaveAs Save current state to new file OnFileSaveAs --- --- ID_FILE_EXPORT_PLOT MenuFileExportPlot Export Current Plot OnFileExportPlot ID_FILE_EXPORT_IMAGE MenuFileExportImage Export Current 3D View OnFileExportImage ID_FILE_EXPORT_IONS MenuFileExportIon Export Ion Data OnFileExportIons ID_FILE_EXPORT_RANGE MenuFileExportRanges Export Range Data OnFileExportRange ID_FILE_EXIT Exit Exit Program OnFileExit ID_MENU_EDIT_UNDO menuEditUndo OnEditUndo ID_MENU_EDIT_REDO menuEditRedo OnEditRedo --- --- ID_EDIT_RANGE menuEditRange OnEditRange --- --- ID_MENU_EDIT_PREFERENCES menuEditPreferences OnEditPreferences ID_VIEW_BACKGROUND, menuViewBackground Change background colour OnViewBackground --- --- ID_VIEW_CONTROL_PANE MenuControlPane Enable or disable the left control pane 1 OnViewControlPane ID_VIEW_RAW_DATA_PANE MenuRawDataPane Enable or disable the raw data pane (bottom of right panel) 1 OnViewRawDataPane ID_VIEW_SPECTRA MenuViewSPectra 1 --- --- ID_HELP_HELP MenuHelp Show help files and documentation OnHelpHelp ID_HELP_CONTACT OnMenuHelpContact Open contact page OnHelpContact --- --- ID_HELP_ABOUT MenuAbout Information about this program OnHelpAbout MainFrame_statusbar wxHORIZONTAL wxEXPAND 0 wxSPLIT_VERTICAL ID_SPLIT_LEFTRIGHT panelView panelLeft wxVERTICAL wxLEFT|wxBOTTOM|wxEXPAND 2 Data Cam Post Tools ID_NOTEBOOK_CONTROL 10, 10 1 ID_NOTE_DATA wxVERTICAL 0 1 wxEXPAND 0 wxHORIZONTAL wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND 3 0 ID_COMBO_SETTINGS OnComboStash OnComboStashText OnComboStashEnter wxALIGN_CENTER 0 ID_BTN_STASH_MANAGE, OnButtonStashDialog wxEXPAND 0 1 0 1 wxEXPAND 0 wxSPLIT_HORIZONTAL filterPropertyPane filterTreePane wxHORIZONTAL wxEXPAND 0 wxVERTICAL wxLEFT|wxRIGHT|wxEXPAND 4 -1 List of available filters ID_FILTER_NAMES Range File Downsampling Mass Spectrum Clipping Compos. Profiles Bounding Box Ion Colour Ion Transform OnFilterNameCombo OnFilterNameComboText OnFilterNameComoEnter wxLEFT|wxBOTTOM|wxEXPAND 3 Tree of data filters ID_TREE_FILTERS OnTreeBeginDrag OnTreeDeleteItem OnTreeEndDrag OnTreeItemTooltip OnTreeKeyDown OnTreeSelectionChange OnTreeSelectionPreChange wxTOP 8 1 wxBOTTOM|wxEXPAND 5 wxEXPAND 0 wxVERTICAL 0 1 Enable/Disable automatic updates of data when filter change takes effect ID_CHECK_AUTOUPDATE 0 10 10 wxALL 2 REFRESH wxEXPAND 0 wxVERTICAL 0 1 wxLEFT|wxEXPAND 4 ID_GRID_FILTER_PROPERTY 1 1 1 3 1 0 1 wxGrid.wxGridSelectCells Property Value OnGridFilterPropertyChange 10, 10 1 ID_NOTE_CAMERA wxVERTICAL 0 1 wxTOP|wxBOTTOM|wxEXPAND 4 wxHORIZONTAL 0 -1 ID_COMBO_CAMERA OnEventComboBox OnEventText OnEventTextEnter wxLEFT|wxRIGHT 2 REMOVE OnButtonRemoveCam wxEXPAND 0 1 wxEXPAND 0 ID_GRID_CAMERA_PROPERTIES Camera data information 1 1 1 4 1 0 1 wxGrid.wxGridSelectRows Property Value 0 wxVERTICAL wxALIGN_CENTER 0 wxHORIZONTAL wxALL|wxALIGN_CENTER 5 Align camera view to this axis ID_BUTTON_ALIGNCAM_XPLUS OnButtonAlignCameraXPlus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_YPLUS OnButtonAlignCameraYPlus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_ZPLUS OnButtonAlignCameraZPlus wxALIGN_CENTER 0 wxHORIZONTAL wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_XMINUS OnButtonAlignCameraXMinus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_YMINUS OnButtonAlignCameraYMinus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_ZMINUS OnButtonAlignCameraZMinus wxALL|wxALIGN_CENTER 4 Resize view to fit 3D data 0 1 wxALIGN_CENTER_HORIZONTAL 0 wxHORIZONTAL wxALL 5 Rotate view in the +ve direction (anti-clockwise) ID_CAM_ROTATE_PLUS wxALL 5 Rotate view cin the -ve direction (clockwise) ID_CAM_ROTATE_ wxALL|wxALIGN_CENTER_HORIZONTAL 6 Step size in degrees for rotation 0, 180 45 wxVERTICAL wxALL 5 Enable/disable visual effects on final 3D output OnCheckPostProcess wxEXPAND 0 Crop Stereo wxVERTICAL wxALL 6 Enable cropping post-process effect ID_EFFECT_CROP_ENABLE OnFxCropCheck wxLEFT 15 OnFxCropCamFrame wxLEFT|wxRIGHT|wxTOP|wxEXPAND 5 wxHORIZONTAL wxEXPAND|wxALIGN_CENTER 0 wxVERTICAL wxRIGHT|wxBOTTOM|wxEXPAND|wxALIGN_CENTER_HORIZONTAL 5 0 ID_EFFECT_CROP_AXISONE_COMBO x-y x-z y-x y-z z-x z-y OnFxCropAxisOne wxRIGHT|wxEXPAND|wxALIGN_CENTER|wxSHAPED 5 ID_EFFECT_CROP_PANELONE_COMBO #54fff4 wxEXPAND|wxALIGN_CENTER 0 wxVERTICAL wxLEFT|wxBOTTOM|wxEXPAND 5 0 ID_EFFECT_CROP_AXISTWO_COMBO x-y x-z y-x y-z z-x z-y OnFxCropAxisTwo wxLEFT|wxEXPAND|wxALIGN_CENTER|wxSHAPED 5 ID_EFFECT_CROP_PANELTWO_COMBO #ff4fe2 wxBOTTOM|wxEXPAND|wxALIGN_CENTER 5 2 0,1,2 3 0,1 2 2 wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 0 1 0 ID_EFFECT_CROP_TEXT_DX wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 0 1 0 ID_EFFECT_CROP_TEXT_DY wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 0 1 0 ID_EFFECT_CROP_TEXT_DZ wxVERTICAL wxLEFT|wxTOP 6 Colour based 3D effect enable/disable OnFxStereoEnable 0 20 20 wxBOTTOM|wxEXPAND 15 wxHORIZONTAL wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT 5 0 Glasses colour mode Red-Blue Red-Green Red-Cyan Half Colour Mixed Colour OnFxStereoCombo 0 1 wxEXPAND 0 wxHORIZONTAL wxLEFT|wxTOP 5 1 wxLEFT|wxRIGHT|wxTOP|wxEXPAND 5 Level of separation between left and right images, which sets 3D depth to visual distortion tradeoff OnFxStereoBaseline wxLEFT 5 Reverse output 3D channels (to negate a flip in 3D lens layout) OnFxStereoLensFlip wxVERTICAL wxTOP 3 1 wxLEFT|wxTOP|wxBOTTOM 5 ID_CHECK_ALPHA, OnCheckAlpha wxLEFT|wxTOP|wxBOTTOM 6 ID_CHECK_LIGHTING OnCheckLighting wxEXPAND 0 1 wxTOP 3 1 wxLEFT|wxTOP|wxBOTTOM 5 ID_CHECK_WEAKRANDOM OnCheckWeakRandom wxLEFT|wxEXPAND 5 wxHORIZONTAL wxRIGHT 3 1 Limit the number of points in the 3D view OnCheckLimitOutput wxLEFT 4 2000000 OnTextLimitOutput OnTextLimitOutputEnter wxLEFT|wxTOP|wxBOTTOM 5 OnCheckCacheEnable wxTOP|wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_RIGHT 5 1 5 0, 100 50 OnCacheRamUsageSpin 3Depict-0.0.22/src/gui/glade-skeleton/errorDialog.wxg0000644000175000017500000001405312121141743021722 0ustar pcuserpcuser Filter Errors 551, 414 wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxLEFT|wxRIGHT|wxTOP|wxEXPAND 6 wxEXPAND 0 wxVERTICAL 0 10 10 wxTOP|wxEXPAND 5 wxHORIZONTAL 0 1 wxALIGN_CENTER_VERTICAL 0 1 wxTOP|wxEXPAND 6 wxHORIZONTAL 0 1 wxALIGN_CENTER_VERTICAL 0 1 0 20 20 wxALL|wxALIGN_RIGHT 5 OK wxID_OK 3Depict-0.0.22/src/gui/glade-skeleton/transferFunctionDialog.wxg0000644000175000017500000004535113305612110024124 0ustar pcuserpcuser Transfer Function wxHORIZONTAL wxEXPAND 0 wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALL|wxEXPAND|wxALIGN_CENTER 5 Intensity of chosen colour or opacity #ffffff 20, 1 wxALL|wxEXPAND|wxALIGN_CENTER 5 Drag nodes to move, double click to add nodes #ffffff wxEXPAND 0 wxHORIZONTAL wxLEFT|wxRIGHT|wxEXPAND 0 20 20 wxALIGN_RIGHT|wxALIGN_BOTTOM 0 1 wxEXPAND 0 wxHORIZONTAL 0 1 wxALL|wxEXPAND|wxALIGN_CENTER 1 Resultant colour scale #ffffff wxEXPAND 0 wxVERTICAL wxEXPAND 0 wxVERTICAL 0 20 20 0 wxHORIZONTAL wxALL|wxALIGN_CENTER 5 1 wxLEFT|wxRIGHT 5 wxVERTICAL 0 1 OnCheckRed 0 1 OnCheckGreen 0 1 OnCheckBlue 0 1 OnCheckOpacity 0 20 20 0 20 20 0 wxHORIZONTAL wxALL|wxALIGN_CENTER 5 Adjust nodes colour OnNodeColourButton wxALL|wxALIGN_RIGHT|wxALIGN_CENTER 5 REMOVE Remove the selected node wxALL|wxEXPAND 2 1 0 1 0 wxHORIZONTAL wxALL|wxALIGN_CENTER 5 OPEN OnButtonLoad wxALL|wxALIGN_CENTER 5 SAVE OnButtonSave wxALL|wxALIGN_BOTTOM 5 wxHORIZONTAL wxALL 5 OK OnOK wxALL 4 CANCEL OnCancel 3Depict-0.0.22/src/gui/glade-skeleton/autosaveDialog.wxg0000644000175000017500000000715112121141743022421 0ustar pcuserpcuser enum\n{\nID_LIST_STATES=wxID_ANY+1,\nID_REMOVE_ALL Restore state? wxVERTICAL wxLEFT|wxRIGHT|wxTOP|wxALIGN_CENTER_HORIZONTAL 6 1 wxALL|wxEXPAND 8 0 wxEXPAND 0 wxHORIZONTAL wxLEFT|wxBOTTOM 8 0 20 20 wxLEFT|wxRIGHT|wxBOTTOM 8 CANCEL wxRIGHT|wxBOTTOM 8 OK 3Depict-0.0.22/src/gui/glade-skeleton/resDialog.wxg0000644000175000017500000002571312121141743021367 0ustar pcuserpcuser enum\n{\n ID_RESET=wxID_ANY+1,\n ID_SPIN_WIDTH,\n ID_SPIN_HEIGHT,\n ID_LOCK_ASPECT\n}; Resolution Selection wxVERTICAL wxEXPAND 0 wxHORIZONTAL 0 20 10 wxLEFT|wxEXPAND 8 wxVERTICAL 0 20 20 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 wxALL|wxALIGN_CENTER_VERTICAL 8 ID_SPIN_WIDTH OnSpinWidth wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 5 ID_SPIN_HEIGHT OnSpinHeight wxALIGN_CENTER_VERTICAL 3 ID_LOCK_ASPECT OnCheckLockAspect 0 20 20 0 10 10 wxEXPAND 0 1 wxALL|wxEXPAND 5 wxEXPAND 0 1 wxTOP|wxBOTTOM|wxEXPAND 5 wxHORIZONTAL wxALL 5 ID_RESET OnBtnRefresh 0 20 20 wxALL 5 OK OnBtnOK wxALL 5 CANCEL OnBtnCancel 3Depict-0.0.22/src/gui/dialogs/0000755000175000017500000000000013451744166015462 5ustar pcuserpcuser3Depict-0.0.22/src/gui/dialogs/autosaveDialog.h0000644000175000017500000000526413305612110020566 0ustar pcuserpcuser/* * autosaveDialog.h - Selection dialog on recovery from autosave files * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Thu Jun 7 12:47:44 2012 #include // begin wxGlade: ::dependencies // end wxGlade #ifndef AUTOSAVEDIALOG_H #define AUTOSAVEDIALOG_H #include // begin wxGlade: ::extracode enum { ID_LIST_STATES = wxID_ANY+1, ID_REMOVE_ALL }; // end wxGlade class AutosaveDialog: public wxDialog { public: // begin wxGlade: AutosaveDialog::ids // end wxGlade AutosaveDialog(wxWindow* parent, int id=wxID_ANY, const wxString& title=wxT(""), const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); private: // begin wxGlade: AutosaveDialog::methods void set_properties(); void do_layout(); // end wxGlade //! the index of the selected item, -1 otherwise size_t selectedItem; //True if the remove all button was // depressed bool haveRemovedItems; protected: // begin wxGlade: AutosaveDialog::attributes wxListBox* listStates; wxButton* btnRemoveAll; wxButton* btnCancel; wxButton* btnOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnListStates(wxCommandEvent &event); // wxGlade: virtual void OnListStatesDClick(wxCommandEvent &event); // wxGlade: virtual void OnRemoveAll(wxCommandEvent &event); // wxGlade: virtual void OnCancel(wxCommandEvent &event); // wxGlade: virtual void OnOK(wxCommandEvent &event); // wxGlade: //Set the items that are to be displayed in the listbox. void setItems(const std::vector &items); //!Get the item that was selected, returning the position of the selected // item in the original vector unsigned int getSelectedItem() const { return selectedItem;}; //Has the user require cited to remove items? bool removedItems() const {return haveRemovedItems;}; }; // wxGlade: end class #endif // AUTOSAVEDIALOG_H 3Depict-0.0.22/src/gui/dialogs/animateFilterDialog.h0000644000175000017500000002233113414250067021527 0ustar pcuserpcuser/* * animateFilterDialog - GUI for animate filter * Copyright (C) 2018, D Haley, A Ceguerra * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ANIMATEFILTERDIALOG_H #define ANIMATEFILTERDIALOG_H #include // begin wxGlade: ::dependencies #include #include #include #include #include // end wxGlade #include "backend/animator.h" #include "backend/viscontrol.h" //for upWxTreeCtrl // begin wxGlade: ::extracode // end wxGlade enum { FILENAME_IMAGE, FILENAME_IONS, FILENAME_RANGE, FILENAME_PLOT, FILENAME_VOXEL }; enum { RANGE_OAKRIDGE, RANGE_AMETEK_RRNG, RANGE_AMETEK_ENV, RANGE_FORMATNAME_END }; class ExportAnimationDialog: public wxDialog { public: // begin wxGlade: ExportAnimationDialog::ids // end wxGlade ExportAnimationDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); ~ExportAnimationDialog(); //!Must be called before displaying dialog, and after setting tree void prepare(); //obtain the desired filename for a particular type of output std::string getFilename(unsigned int frame, unsigned int nameType, unsigned int number=0) const ; //Obtain the desired width of the output image unsigned int getImageWidth() const { return imageWidth;} //Obtain the desired height of the output image unsigned int getImageHeight() const { return imageHeight;}; //Get the number of frames that are in the animation sequence size_t getNumFrames() const { return propertyAnimator.getMaxFrame();} //Return a modified version f the filter tree, applying the changes requested // by the user bool getModifiedTree(size_t frame, FilterTree &t,bool &needUp) const; //Set the tree that we are to work with void setTree(const FilterTree &origTree) { filterTree=&origTree;}; //Does the user want to obtain image output? bool wantsImages() const { return wantImageOutput;} //Does the user want to obtain plot output? bool wantsPlots() const { return wantPlotOutput;} //Does the user want to obtain ion output? bool wantsIons() const { return wantIonOutput;} //Does the user want to obtain range output? bool wantsRanges() const { return wantRangeOutput;} //Does the user want to obtain range output? bool wantsVoxels() const { return wantVoxelOutput;} //Does the user want all data output, or only when the data // changes (needs a refresh) bool wantsOnlyChanges() const { return wantOnlyChanges;} //!Obtain the format the user wants to save ranges in size_t getRangeFormat() const; //! Obtain the current state from the animation (keyframes) // the second element provides the mappings for the property animator to // filter tree path locations void getAnimationState(PropertyAnimator &prop, std::vector > &pathMapping) const ; //!Obtain the current state from the animation void setAnimationState(const PropertyAnimator &prop, const std::vector > &pathMapping); //!Obtain the filter tree path string->animation ID mapping void getPathMapping(std::vector > &mapping, bool allowMissing=false) const; void setDefImSize(unsigned int w, unsigned int h) ; private: //!Tree of filters that can be manipulated const FilterTree *filterTree; //!Mapping from ID of filter to the pointer in the filter tree std::map filterMap; //!Mapping to allow for converting entry of RNG selection combo into // the correct range enum value std::map rangeMap; //!Default height/width desired for output images size_t imageWidth,imageHeight; bool imageSizeOK; PropertyAnimator propertyAnimator; //!Working directory for outputting data std::string workDir; std::string imagePrefix; //!True if any con bool existsConflicts; //!true if the user has selected image output functionality bool wantImageOutput; //!True if the user has requested ion data output bool wantIonOutput; //!True if the user wants plots output bool wantPlotOutput; //!True if the user wants to save voxel data bool wantVoxelOutput; //!True if the user wants to save range data bool wantRangeOutput; //!True if the user only wants to save data if it changes bool wantOnlyChanges; //!Current frame that the user wants to see in the frame view size_t currentFrame; //!Type of rangefile to export size_t rangeExportMode; //viewport aspect ratio for image output float imageAspectRatio; //Used to jump out of wx events that are generated by // the code, rather than the user, eg text events bool programmaticEvent; //UI update function void update(); //Enable/disable the OK button depending upon dialog state void updateOKButton(); //update function for frame view page, grid control void updateFilterViewGrid(); //update function for frame view page, grid contorl void updateFrameViewGrid(); //Updates the slider on the frame view page void updateFrameViewSlider(); // begin wxGlade: ExportAnimationDialog::methods void set_properties(); void do_layout(); // end wxGlade protected: // begin wxGlade: ExportAnimationDialog::attributes wxStaticBox* outputDataSizer_staticbox; wxStaticBox* keyFramesSizer_staticbox; wxStaticBox* filterPropertySizer_staticbox; wxTreeCtrl* filterTreeCtrl; wxPropertyGrid* propertyGrid; wxPanel* filterLeftPane; wxGrid* animationGrid; wxButton* keyFrameRemoveButton; wxPanel* filterRightPane; wxSplitterWindow* splitPaneFilter; wxPanel* filterViewPane; wxStaticText* labelWorkDir; wxTextCtrl* textWorkDir; wxButton* buttonWorkDir; wxCheckBox* checkOutOnlyChanged; wxStaticLine* outputDataSepLine; wxStaticText* labelDataType; wxCheckBox* checkImageOutput; wxStaticText* lblImageName; wxTextCtrl* textImageName; wxStaticText* labelImageSize; wxTextCtrl* textImageSize; wxButton* buttonImageSize; wxCheckBox* checkPoints; wxCheckBox* checkPlotData; wxCheckBox* checkVoxelData; wxCheckBox* checkRangeData; wxStaticText* labelRangeFormat; wxChoice* comboRangeFormat; wxStaticLine* static_line_1; wxStaticText* labelFrame; wxSlider* frameSlider; wxTextCtrl* textFrame; wxGrid* framePropGrid; wxPanel* frameViewPane; wxNotebook* viewNotebook; wxButton* cancelButton; wxButton* okButton; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnFilterTreeCtrlSelChanged(wxTreeEvent &event); // wxGlade: virtual void OnFilterGridCellChanging(wxPropertyGridEvent &event); // wxGlade: virtual void OnFilterGridCellSelected(wxPropertyGridEvent &event); // wxGlade: virtual void OnAnimateGridCellEditorShow(wxGridEvent &event); // wxGlade: virtual void OnFrameGridCellEditorShow(wxGridEvent &event); // wxGlade: virtual void OnButtonKeyFrameRemove(wxCommandEvent &event); // wxGlade: virtual void OnOutputDirText(wxCommandEvent &event); // wxGlade: virtual void OnButtonWorkDir(wxCommandEvent &event); // wxGlade: virtual void OnCheckOutDataChange(wxCommandEvent &event); // wxGlade: virtual void OnCheckImageOutput(wxCommandEvent &event); // wxGlade: virtual void OnImageFilePrefix(wxCommandEvent &event); // wxGlade: virtual void OnBtnResolution(wxCommandEvent &event); // wxGlade: virtual void OnCheckPointOutput(wxCommandEvent &event); // wxGlade: virtual void OnCheckPlotOutput(wxCommandEvent &event); // wxGlade: virtual void OnCheckVoxelOutput(wxCommandEvent &event); // wxGlade: virtual void OnCheckRangeOutput(wxCommandEvent &event); // wxGlade: virtual void OnRangeTypeCombo(wxCommandEvent &event); // wxGlade: virtual void OnFrameViewSlider(wxScrollEvent &event); // wxGlade: virtual void OnTextFrame(wxCommandEvent &event); // wxGlade: virtual void OnButtonCancel(wxCommandEvent &event); // wxGlade: virtual void OnButtonOK(wxCommandEvent &event); // wxGlade: virtual void OnFilterViewUnsplit(wxSplitterEvent &event); // wxGlade: }; // wxGlade: end class #endif // ANIMATEFILTERDIALOG_H 3Depict-0.0.22/src/gui/dialogs/ExportPos.h0000644000175000017500000000744013305612110017560 0ustar pcuserpcuser/* * ExportPos.h - Point data export dialog * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #ifndef EXPORTPOS_H #define EXPORTPOS_H // begin wxGlade: ::dependencies // end wxGlade // begin wxGlade: ::extracode // end wxGlade #include "backend/filtertree.h" class ExportPosDialog: public wxDialog { public: // begin wxGlade: ExportPosDialog::ids // end wxGlade ExportPosDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); ~ExportPosDialog(); private: FilterTree filterTree; std::map filterMap; //!Have we refreshed the filterstream data list? bool haveRefreshed; //!Should we be exporting selected ions (false) or visible ions (true) bool exportVisible; //!List containing filter and ion streams to export std::list > > outputData; //!vector containing currently available filter streams std::vector availableFilterData; //List containing currently selected filter streams std::list selectedFilterData; //!Use selectedFilterData to draw wx widget void updateSelectedList(); // begin wxGlade: ExportPosDialog::methods void set_properties(); void do_layout(); // end wxGlade protected: // begin wxGlade: ExportPosDialog::attributes wxStaticText* lblExport; wxRadioButton* radioVisible; wxRadioButton* radioSelection; wxTreeCtrl* treeData; wxStaticText* lblAvailableData; wxListCtrl* listAvailable; wxButton* btnAddData; wxButton* btnAddNode; wxButton* btnAddAll; wxPanel* panel_2; wxStaticText* label_4; wxListCtrl* listSelected; wxButton* btnSave; wxButton* btnCancel; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnVisibleRadio(wxCommandEvent &event); // wxGlade: virtual void OnSelectedRadio(wxCommandEvent &event); // wxGlade: virtual void OnTreeFiltersSelChanged(wxTreeEvent &event); // wxGlade: virtual void OnBtnAddAll(wxCommandEvent &event); // wxGlade: virtual void OnBtnAddData(wxCommandEvent &event); // wxGlade: virtual void OnBtnAddNode(wxCommandEvent &event); // wxGlade: virtual void OnSave(wxCommandEvent &event); // wxGlade: virtual void OnCancel(wxCommandEvent &event); // wxGlade: virtual void OnListAvailableItemActivate(wxListEvent &event); // wxGlade: virtual void OnListSelectedItemActivate(wxListEvent &event); // wxGlade: virtual void OnListSelectedItemKeyDown(wxListEvent &event); // wxGlade: void initialiseData(FilterTree &f); void enableSelectionControls(bool enabled); void getExportVec(std::vector &v) const; void swapFilterTree(FilterTree &f) { f.swap(filterTree);haveRefreshed=false;} }; // wxGlade: end class #endif // EXPORTPOS_H 3Depict-0.0.22/src/gui/dialogs/ExportRngDialog.cpp0000644000175000017500000002020313414250067021222 0ustar pcuserpcuser/* * ExportRngDialog.cpp - "Range" data export dialog * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ExportRngDialog.h" #include "wx/wxcommon.h" #include "backend/filters/rangeFile.h" #include // begin wxGlade: ::extracode // end wxGlade enum { ID_LIST_ACTIVATE=wxID_ANY+1, }; ExportRngDialog::ExportRngDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { // begin wxGlade: ExportRngDialog::ExportRngDialog lblRanges = new wxStaticText(this, wxID_ANY, TRANS("Range Sources")); listRanges = new wxListCtrl(this, ID_LIST_ACTIVATE, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER); label_3 = new wxStaticText(this, wxID_ANY, TRANS("Details")); gridDetails = new wxGrid(this, wxID_ANY); btnOK = new wxButton(this, wxID_SAVE, wxEmptyString); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); btnOK->SetFocus(); set_properties(); do_layout(); // end wxGlade //Add columns to report listviews listRanges->InsertColumn(0,TRANS("Source Filter")); listRanges->InsertColumn(1,TRANS("Ions")); listRanges->InsertColumn(2,TRANS("Ranges")); } BEGIN_EVENT_TABLE(ExportRngDialog, wxDialog) // begin wxGlade: ExportRngDialog::event_table EVT_LIST_ITEM_ACTIVATED(ID_LIST_ACTIVATE, ExportRngDialog::OnListRangeItemActivate) EVT_BUTTON(wxID_SAVE, ExportRngDialog::OnSave) EVT_BUTTON(wxID_CANCEL, ExportRngDialog::OnCancel) // end wxGlade END_EVENT_TABLE(); void ExportRngDialog::OnListRangeItemActivate(wxListEvent &event) { updateGrid(event.GetIndex()); selectedRange=event.GetIndex(); } void ExportRngDialog::updateGrid(unsigned int index) { const RangeFileFilter *rangeData; rangeData=(RangeFileFilter *)rngFilters[index]; gridDetails->BeginBatch(); if (gridDetails->GetNumberCols()) gridDetails->DeleteCols(0,gridDetails->GetNumberCols()); if (gridDetails->GetNumberRows()) gridDetails->DeleteRows(0,gridDetails->GetNumberRows()); gridDetails->AppendCols(3); gridDetails->SetColLabelValue(0,TRANS("Param")); gridDetails->SetColLabelValue(1,TRANS("Value")); gridDetails->SetColLabelValue(2,TRANS("Value2")); unsigned int nRows; nRows=rangeData->getRange().getNumIons()+rangeData->getRange().getNumRanges() + 4; gridDetails->AppendRows(nRows); gridDetails->SetCellValue(0,0,TRANS("Ion Name")); gridDetails->SetCellValue(0,1,TRANS("Num Ranges")); unsigned int row=1; std::string tmpStr; unsigned int maxNum; maxNum=rangeData->getRange().getNumIons(); //Add ion data, then range data for(unsigned int ui=0;uiSetCellValue(row,0,(rangeData->getRange().getName(ui))); stream_cast(tmpStr,rangeData->getRange().getNumRanges(ui)); gridDetails->SetCellValue(row,1,(tmpStr)); row++; } row++; gridDetails->SetCellValue(row,0,TRANS("Ion")); gridDetails->SetCellValue(row,1,TRANS("Range Start")); gridDetails->SetCellValue(row,2,TRANS("Range end")); row++; maxNum=rangeData->getRange().getNumRanges(); for(unsigned int ui=0;ui rngPair; unsigned int ionID; rngPair=rangeData->getRange().getRange(ui); ionID=rangeData->getRange().getIonID(ui); gridDetails->SetCellValue(row,0, (rangeData->getRange().getName(ionID))); stream_cast(tmpStr,rngPair.first); gridDetails->SetCellValue(row,1,(tmpStr)); stream_cast(tmpStr,rngPair.second); gridDetails->SetCellValue(row,2,(tmpStr)); row++; } gridDetails->EndBatch(); } void ExportRngDialog::OnSave(wxCommandEvent &event) { if(rngFilters.empty()) EndModal(wxID_CANCEL); //create a file chooser for later. wxFileDialog *wxF = new wxFileDialog(this,TRANS("Save pos..."), wxT(""), wxT(""),TRANS("Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV (*.env)|*.env|All Files (*)|*"),wxFD_SAVE); //Show, then check for user cancelling export dialog if(wxF->ShowModal() == wxID_CANCEL) { wxF->Destroy(); return; } std::string dataFile = stlStr(wxF->GetPath()); unsigned int selectedFormat= wxF->GetFilterIndex(); unsigned int rngFormat=RANGE_FORMAT_RRNG; switch(selectedFormat) { case 0: rngFormat=RANGE_FORMAT_RRNG; break; case 1: rngFormat=RANGE_FORMAT_ORNL; break; case 2: rngFormat=RANGE_FORMAT_ENV; break; default: ASSERT(false); } if(((RangeFileFilter *)(rngFilters[selectedRange]))-> getRange().write(dataFile.c_str(),rngFormat)) { std::string errString; errString=TRANS("Unable to save. Check output destination can be written to."); wxMessageDialog *wxD =new wxMessageDialog(this,(errString) ,TRANS("Save error"),wxOK|wxICON_ERROR); wxD->ShowModal(); wxD->Destroy(); return; } EndModal(wxID_OK); } void ExportRngDialog::OnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } // wxGlade: add ExportRngDialog event handlers void ExportRngDialog::addRangeData(std::vector rangeData) { #ifdef DEBUG //This function should only receive rangefile filters for(unsigned int ui=0;uigetType() == FILTER_TYPE_RANGEFILE); #endif rngFilters.resize(rangeData.size()); std::copy(rangeData.begin(),rangeData.end(),rngFilters.begin()); updateRangeList(); if(rangeData.size()) { //Use the first item to populate the grid updateGrid(0); //select the first item listRanges->SetItemState(0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); selectedRange=0; } } void ExportRngDialog::updateRangeList() { listRanges->DeleteAllItems(); for(auto & rngFilter : rngFilters) { const RangeFileFilter *rangeData; rangeData=(RangeFileFilter *)rngFilter; std::string tmpStr; long itemIndex; itemIndex=listRanges->InsertItem(0, (rangeData->getUserString())); unsigned int nIons,nRngs; nIons = rangeData->getRange().getNumIons(); nRngs = rangeData->getRange().getNumRanges(); stream_cast(tmpStr,nIons); listRanges->SetItem(itemIndex, 1, (tmpStr)); stream_cast(tmpStr,nRngs); listRanges->SetItem(itemIndex, 2, (tmpStr)); } } void ExportRngDialog::set_properties() { // begin wxGlade: ExportRngDialog::set_properties SetTitle(TRANS("Export Range")); gridDetails->CreateGrid(0, 0); gridDetails->SetRowLabelSize(0); gridDetails->SetColLabelSize(0); listRanges->SetToolTip(TRANS("List of rangefiles in filter tree")); gridDetails->EnableEditing(false); gridDetails->SetToolTip(TRANS("Detailed view of selected range")); // end wxGlade } void ExportRngDialog::do_layout() { // begin wxGlade: ExportRngDialog::do_layout wxBoxSizer* sizer_2 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_3 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_14 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_15 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_16 = new wxBoxSizer(wxVERTICAL); sizer_16->Add(lblRanges, 0, wxLEFT|wxTOP, 5); sizer_16->Add(listRanges, 1, wxALL|wxEXPAND, 5); sizer_14->Add(sizer_16, 1, wxEXPAND, 0); sizer_14->Add(10, 20, 0, 0, 0); sizer_15->Add(label_3, 0, wxLEFT|wxTOP, 5); sizer_15->Add(gridDetails, 1, wxALL|wxEXPAND, 5); sizer_14->Add(sizer_15, 1, wxEXPAND, 0); sizer_2->Add(sizer_14, 1, wxEXPAND, 0); sizer_3->Add(20, 20, 1, 0, 0); sizer_3->Add(btnOK, 0, wxALL, 5); sizer_3->Add(btnCancel, 0, wxALL, 5); sizer_2->Add(sizer_3, 0, wxEXPAND, 0); SetSizer(sizer_2); sizer_2->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.22/src/gui/dialogs/rangeEditDialog.cpp0000644000175000017500000011351113414250067021201 0ustar pcuserpcuser/* * rangeEditDialog.h - Point data export dialog * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "rangeEditDialog.h" #include "wx/wxcommon.h" #include "wx/wxcomponents.h" #include "common/translation.h" #include "backend/filters/rangeFile.h" #include #include using std::pair; using std::vector; using std::map; using std::set; using std::string; // begin wxGlade: ::extracode enum { ID_CHECK_SHOW_OVERLAY=wxID_ANY+1, ID_SPLIT_LEFTRIGHT, ID_GRID_IONS, ID_GRID_RANGES, ID_BTN_RANGE_ADD, ID_BTN_RANGE_REMOVE, ID_LIST_OVERLAY, ID_LIST_PLOTS, ID_MANAGE_SET_MORE, ID_TEXT_FILTER_CMPNT, ID_PLOT_AREA, }; // end wxGlade enum { ION_COL_PLOT=0, ION_COL_SHORTNAME, ION_COL_LONGNAME, ION_COL_COLOUR, ION_COL_ENUM_END }; enum { RNG_COL_PLOT=0, RNG_COL_PARENT_ION, RNG_COL_START, RNG_COL_END, RNG_COL_ENUM_END }; enum { GRID_FOCUS_NONE, GRID_FOCUS_IONS, GRID_FOCUS_RANGES }; //Rangefile filter -> range file mapping typedef typedef map RFMAP ; PendingRange::PendingRange(RangeFile *rng) { validStart=false; validEnd=false; validParent=false; rngPtr=rng; } void PendingRange::commit() { ASSERT(isFinished()); rngPtr->addRange(start,end,parentId); } float PendingRange::getStart() const { if(validStart) return start; else return 0.0f; } float PendingRange::getEnd() const { if(validEnd) return end; else return 1.0f; } std::string PendingRange::getIonName() const { if(!validParent) return ""; ASSERT(parentId < rngPtr->getNumIons()); return rngPtr->getName(parentId); } bool PendingRange::isFinished() const { if(!validEnd || !validStart) return false; if(!validParent) return false; if( end <=start) return false; return true; } PendingIon::PendingIon(RangeFile *rng) { rngPtr=rng; validColour=validShortName=validLongName=false; colour.red=colour.green=colour.blue=0.5f; } void PendingIon::setShortName(const std::string &n) { shortName=n; validShortName = (rngPtr->getIonID(shortName.c_str()) == (unsigned int)-1); } void PendingIon::setLongName(const std::string &n) { longName=n; validLongName = (rngPtr->getIonID(shortName.c_str(),false) == (unsigned int)-1); } void PendingIon::setColour(const RGBf &c) { colour=c; validColour=true; } RGBf PendingIon::getColour() const { return colour; } std::string PendingIon::getShortName() const { if(validShortName) return shortName; else return string(""); } std::string PendingIon::getLongName() const { if(validLongName) return longName; else return string(""); } bool PendingIon::isFinished() const { //Check to see if we have valid user data if (! (validShortName && validLongName && validColour)) return false; //Disallow existing ion names if(rngPtr->getIonID(longName.c_str(),false) != (unsigned int)-1 || rngPtr->getIonID(shortName.c_str()) != (unsigned int) -1) return false; return true; } void PendingIon::commit() const { rngPtr->addIon(shortName,longName,colour); } RangeEditorDialog::RangeEditorDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX) { // begin wxGlade: RangeEditorDialog::RangeEditorDialog splitVertical = new wxSplitterWindow(this, ID_SPLIT_LEFTRIGHT, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_BORDER); panelSplitRight = new wxPanel(splitVertical, wxID_ANY); panelSplitLeft = new wxPanel(splitVertical, wxID_ANY); notebookLeft = new wxNotebook(panelSplitLeft, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_LEFT); noteLeftOverlay = new wxPanel(notebookLeft, wxID_ANY); noteLeftRanges = new wxPanel(notebookLeft, wxID_ANY); noteLeftPlots = new wxPanel(notebookLeft, wxID_ANY); listPlots = new wxListBox(noteLeftPlots, ID_LIST_PLOTS, wxDefaultPosition, wxDefaultSize, 0,(const wxString*) NULL); gridIons= new wxGrid(noteLeftRanges, ID_GRID_IONS); gridRanges = new wxGrid(noteLeftRanges, ID_GRID_RANGES); btnRangeIonAdd = new wxButton(noteLeftRanges,wxID_ADD, wxEmptyString); btnRangeIonRemove = new wxButton(noteLeftRanges, wxID_REMOVE, wxEmptyString); checkShowOverlay = new wxCheckBox(noteLeftOverlay, ID_CHECK_SHOW_OVERLAY, TRANS("Show Overlays")); textOverlayCmpnt = new wxTextCtrl(noteLeftOverlay, ID_TEXT_FILTER_CMPNT, wxEmptyString, wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER); listOverlay = new wxCheckListBox(noteLeftOverlay, ID_LIST_OVERLAY, wxDefaultPosition, wxDefaultSize, 0); plotPanel = new MathGLPane(panelSplitRight, ID_PLOT_AREA); btnOK = new wxButton(panelSplitRight, wxID_OK, wxEmptyString); btnCancel = new wxButton(panelSplitRight, wxID_CANCEL, wxEmptyString); set_properties(); do_layout(); // end wxGlade std::string fileLoc = locateDataFile("naturalAbundance.xml"); if(!fileLoc.empty()) abundanceData.open(fileLoc.c_str()); UpdateHandler h = (UpdateHandler)&RangeEditorDialog::onPlotUpdate; plotPanel->registerUpdateHandler(this,h); plotPanel->enableRegionSelfUpdate(true); lastFocused=GRID_FOCUS_NONE; currentRange=nullptr; checkShowOverlay->SetValue(true); haveSetTextFocus=false; textOverlayCmpnt->SetValue(TRANS("e.g. H2O")); textOverlayCmpnt->Bind(wxEVT_SET_FOCUS, &RangeEditorDialog::OnTextOverlaySetFocus, this); } RangeEditorDialog::~RangeEditorDialog() { textOverlayCmpnt->Unbind(wxEVT_SET_FOCUS, &RangeEditorDialog::OnTextOverlaySetFocus, this); } BEGIN_EVENT_TABLE(RangeEditorDialog, wxDialog) // begin wxGlade: RangeEditorDialog::event_table EVT_LISTBOX(ID_LIST_PLOTS, RangeEditorDialog::OnListPlots) // EVT_LIST_ITEM_SELECTED(ID_LIST_OVERLAY, RangeEditorDialog::OnListOverlaySelected) EVT_LIST_KEY_DOWN(ID_LIST_OVERLAY, RangeEditorDialog::OnListOverlayKeyDown) EVT_TEXT(ID_TEXT_FILTER_CMPNT,RangeEditorDialog::OnTextOverlay) EVT_TEXT(ID_TEXT_FILTER_CMPNT,RangeEditorDialog::OnTextOverlay) EVT_TEXT_ENTER(ID_TEXT_FILTER_CMPNT,RangeEditorDialog::OnTextOverlayEnter) EVT_CHECKBOX(ID_CHECK_SHOW_OVERLAY, RangeEditorDialog::OnCheckShowOverlay) EVT_GRID_CMD_CELL_CHANGED(ID_GRID_RANGES, RangeEditorDialog::OnGridRangesCellChange) EVT_GRID_CMD_CELL_CHANGED(ID_GRID_IONS, RangeEditorDialog::OnGridIonsCellChange) EVT_GRID_CMD_CELL_LEFT_CLICK(ID_GRID_RANGES,RangeEditorDialog::OnGridRangeClick) EVT_GRID_CMD_CELL_LEFT_CLICK(ID_GRID_IONS,RangeEditorDialog::OnGridIonClick) EVT_GRID_CMD_EDITOR_SHOWN(ID_GRID_RANGES,RangeEditorDialog::OnGridRangesEditorShown) EVT_GRID_CMD_EDITOR_SHOWN(ID_GRID_IONS,RangeEditorDialog::OnGridIonsEditorShown) EVT_BUTTON(wxID_ADD, RangeEditorDialog::OnBtnRangeIonAdd) EVT_BUTTON(wxID_REMOVE, RangeEditorDialog::OnBtnRangeIonRemove) EVT_CHECKLISTBOX(ID_LIST_OVERLAY, RangeEditorDialog::OnListOverlayCheck) EVT_BUTTON(wxID_OK, RangeEditorDialog::OnBtnOK) EVT_BUTTON(wxID_CANCEL, RangeEditorDialog::OnBtnCancel) EVT_SPLITTER_DCLICK(ID_SPLIT_LEFTRIGHT, RangeEditorDialog::OnSashVerticalDClick) // end wxGlade END_EVENT_TABLE(); void RangeEditorDialog::getModifiedRanges(map &modRanges) const { //modRanges.reserve(modifiedRanges.size()); for(const auto & modifiedRange : modifiedRanges) { const RangeFile *r = &(modifiedRange.first->getRange()); modRanges[r]=&(modifiedRange.second); } } void RangeEditorDialog::onPlotUpdate() { #ifdef DEBUG size_t lastEditedRegion,lastEditedPlot; plotPanel->getLastEdited(lastEditedPlot,lastEditedRegion); ASSERT(lastEditedRegion!=(unsigned int) -1); ASSERT(lastEditedPlot != (unsigned int)-1); #endif generateRangeEntries(); generateIonEntries(); setRangeReady(); } void RangeEditorDialog::setPlotWrapper(const PlotWrapper &p) { plotWrap = p; plotWrap.setEnableHighlightOverlap(); //Find all unique ranges //-- vector > > regions; plotWrap.getRegions(regions,false); std::set ranges; for(auto & region : regions) { //Region data is actually empty. if(region.second.empty()) { //ignore this plot ignoreList.insert(region.first); continue; } const Filter *parentFilt; parentFilt = region.second[0].getParentAsFilter(); if(parentFilt->getType() != FILTER_TYPE_RANGEFILE) { //ignore this plot ignoreList.insert(region.first); continue; } //Remember that we need to (shortly) create a new rangefile for this ranges.insert((const RangeFileFilter *)parentFilt); //Create a mapping between the plot and its owned rangefile plotToRangeFileMap[region.first]=(const RangeFileFilter*)parentFilt; } //-- //create a copy of the range file that are the to-be-modified ranges for(auto range : ranges) { modifiedRanges[range]=(range->getRange()); modifiedRanges[range].setEnforceConsistent(false); } //Now, change the behaviour of region updating for the plot wrapper // to update our new rangefile objects plotWrap.switchOutRegionParent(modifiedRanges); //Set the plot panel to use the appropriate plot wrapper plotPanel->setPlotWrapper(&plotWrap,false); //Generate the list entries generateListEntries(); setCurrentRange(); //Find all the plots in the wrapper, and add them to the list generateIonEntries(); generateRangeEntries(); //Hack to ensure we select something at startup // only if there is nothing selected, and the plot list has items if(currentRange && !plotPanel->getNumVisible() && listPlots->GetCount() > 0) { { ASSERT(listPlots->GetSelection() !=wxNOT_FOUND); unsigned int plotID; plotID=listToPlotIDs[listPlots->GetSelection()]; plotWrap.setVisible(plotID); plotPanel->Refresh(); } } } void RangeEditorDialog::setCurrentRange(size_t forceSelected) { //IF we have no plots, // we cannot have any current range if(!listPlots->GetCount()) { currentRange=nullptr; return; } //Get the currently selected plot unsigned int curPlotID; if(forceSelected == (size_t) -1) { ASSERT(listPlots->GetCount()); int selectedItem=listPlots->GetSelection(); if(selectedItem== wxNOT_FOUND ) { currentRange=nullptr; return; } curPlotID=listToPlotIDs[selectedItem]; } else { curPlotID=listToPlotIDs[forceSelected]; } //If we don't have a new range for this plot, alter // the parent of any regions in the plot if(plotNewRanges.find(curPlotID) == plotNewRanges.end()) { ASSERT(plotToRangeFileMap.find(curPlotID) != plotToRangeFileMap.end()); currentRange=&(modifiedRanges[plotToRangeFileMap[curPlotID]]); } else { //Either create a new, or set the old Rangefile to assign to this plot currentRange=&(plotNewRanges[curPlotID]); } } void RangeEditorDialog::generatePlotRegions() { RegionGroup r; if(!currentRange) return; //Go through each entry in the current range, and create a // region in the plot that corresponds to it for(size_t ui=0;uigetNumRanges();ui++) { PlotRegion p(PlotRegion::ACCESS_MODE_RANGEFILE,currentRange); RGBf col; //set region colour col = currentRange->getColour(currentRange->getIonID((unsigned int)ui)); p.r = col.red; p.g = col.green; p.b = col.blue; p.id = ui; p.bounds.clear(); p.bounds.push_back(currentRange->getRange(ui)); r.regions.push_back(p); } ASSERT(listPlots->GetSelection() != -1); //Send the current range data to the current plot unsigned int plotID; plotID = listToPlotIDs[listPlots->GetSelection()]; //reassign new region group plotWrap.setRegionGroup(plotID,r); //Update plot plotPanel->Refresh(); } void RangeEditorDialog::generateListEntries() { programmaticEvent=true; vector plotIDs; plotWrap.getPlotIDs(plotIDs); listPlots->Freeze(); listPlots->Clear(); //Add the plots that the user can get for(unsigned int id : plotIDs) { unsigned int plotID; plotID = id; std::string title; title=plotWrap.getTitle(plotID); //Only use plots from spectra if(plotWrap.getParentType(plotID) != FILTER_TYPE_SPECTRUMPLOT || ignoreList.find(plotID) != ignoreList.end()) continue; //Append the plot to the list in the user interface, // with the plot Id embedded in the element int idx; idx=listPlots->Append((title)); listToPlotIDs[idx]=id; } //If there is only one spectrum, select it if(listPlots->GetCount() >= 1 ) listPlots->SetSelection(0); listPlots->Thaw(); programmaticEvent=false; } void RangeEditorDialog::generateOverlayList(const vector &overlays) { //Build the list of enabled overlays listOverlay->Clear(); for(size_t ui=0;uiInsert((overlays[ui].title),ui); listOverlay->Check(ui,overlays[ui].enabled); } } void RangeEditorDialog::generateIonEntries(size_t rowVisibleHint) { programmaticEvent=true; //Withhold drawing updates until we are done. gridIons->Freeze(); int viewStartX,viewStartY; gridIons->GetViewStart(&viewStartX,&viewStartY); //Reset the ion grid //-- if(gridIons->GetNumberCols()) gridIons->DeleteCols(0,gridIons->GetNumberCols()); if(gridIons->GetNumberRows()) gridIons->DeleteRows(0,gridIons->GetNumberRows()); gridIons->AppendCols(4); gridIons->SetColLabelValue(ION_COL_PLOT,TRANS("Plot")); gridIons->SetColLabelValue(ION_COL_SHORTNAME,TRANS("Short Name")); gridIons->SetColLabelValue(ION_COL_LONGNAME,TRANS("Long Name")); gridIons->SetColLabelValue(ION_COL_COLOUR,TRANS("Colour")); //-- gridIonIds.clear(); //Get the currently selected plot int curPlot=listPlots->GetSelection(); //If no plot slected, abort update if(curPlot == (unsigned int) wxNOT_FOUND || !currentRange) { gridIons->Thaw(); programmaticEvent=false; return; } std::string title; title=plotWrap.getTitle(curPlot); //Colour to use for incomplete ions/ranges wxColour incomplColour; //A light blue colour incomplColour.Set(162,162,255); size_t curIonRow=0; //Fill in the ion grid gridIons->AppendRows(currentRange->getNumIons()); for(size_t uj=0;ujgetNumIons();uj++) { //Set the ionID from the row gridIonIds[uj]=curIonRow; gridIons->SetCellValue(curIonRow, ION_COL_PLOT,(title)); gridIons->SetCellValue(curIonRow, ION_COL_SHORTNAME,(currentRange->getName(uj))); gridIons->SetCellValue(curIonRow, ION_COL_LONGNAME,(currentRange->getName(uj,false))); //set the colour wxGridCellAttr *attr = gridIons->GetOrCreateCellAttr(curIonRow,ION_COL_COLOUR); RGBf col=currentRange->getColour(uj); unsigned char r,g,b,a; r=col.red*255.0f; g=col.green*255.0f; b=col.blue*255.0f; a=255; attr->SetBackgroundColour(wxColour(r,g,b,a)); attr->DecRef(); curIonRow++; } //Add the incomplete ions incompleteIonOffset=currentRange->getNumIons(); gridIons->AppendRows(incompleteIons.size()); for(auto & incompleteIon : incompleteIons) { gridIons->SetCellValue(curIonRow, ION_COL_PLOT,(title)); gridIons->SetCellValue(curIonRow, ION_COL_SHORTNAME,(incompleteIon.getShortName())); gridIons->SetCellValue(curIonRow, ION_COL_LONGNAME,(incompleteIon.getLongName())); //set the colour wxGridCellAttr *attr = gridIons->GetOrCreateCellAttr(curIonRow,ION_COL_COLOUR); RGBf col=incompleteIon.getColour(); unsigned char r,g,b,a; r=col.red*255.0f; g=col.green*255.0f; b=col.blue*255.0f; a=255; attr->SetBackgroundColour(wxColour(r,g,b,a)); attr->DecRef(); for(size_t uj=0;ujSetCellBackgroundColour(curIonRow,uj,incomplColour); } curIonRow++; } gridIons->Scroll(viewStartX,viewStartY); if(rowVisibleHint!=(size_t)-1) { ASSERT(rowVisibleHint < gridIons->GetNumberRows()); gridIons->MakeCellVisible(rowVisibleHint,0); } gridIons->Thaw(); programmaticEvent=false; } void RangeEditorDialog::generateRangeEntries(size_t rowVisibleHint) { programmaticEvent=true; gridRanges->Freeze(); int viewStartX,viewStartY; gridRanges->GetViewStart(&viewStartX,&viewStartY); vector > > regions; plotWrap.getRegions(regions); //OK, so we have each plot and the regions it contains //lets filter that down to the regions we can actually see //Reset the range grid //--- if(gridRanges->GetNumberCols()) gridRanges->DeleteCols(0,gridRanges->GetNumberCols()); if(gridRanges->GetNumberRows()) gridRanges->DeleteRows(0,gridRanges->GetNumberRows()); gridRanges->AppendCols(4); gridRanges->SetColLabelValue(0,TRANS("Plot")); gridRanges->SetColLabelValue(1,TRANS("Ion")); gridRanges->SetColLabelValue(2,TRANS("Start")); gridRanges->SetColLabelValue(3,TRANS("End")); //--- gridRangeIds.clear(); //Get the currently selected plot int curPlot=listPlots->GetSelection(); //If no plot slected, abort update if(curPlot == (unsigned int) wxNOT_FOUND || !currentRange) { gridRanges->Thaw(); return; } //Colour to use for incomplete ions/ranges wxColour incomplColour; //A light blue colour incomplColour.Set(162,162,255); std::string title; title=plotWrap.getTitle(curPlot); //Fill in the range grid size_t curRangeRow=0; gridRanges->AppendRows(currentRange->getNumRanges()); for(size_t ui=0;uigetNumRanges();ui++) { gridRangeIds[ui]=curRangeRow; pair rangeBound; rangeBound=currentRange->getRange(ui); std::string ionName; ionName=currentRange->getName(currentRange->getIonID((unsigned int)ui)); gridRanges->SetCellValue(curRangeRow,RNG_COL_PLOT,(title)); gridRanges->SetCellValue(curRangeRow,RNG_COL_PARENT_ION,(ionName)); std::string tmpStr; stream_cast(tmpStr,rangeBound.first); gridRanges->SetCellValue(curRangeRow,RNG_COL_START,(tmpStr)); stream_cast(tmpStr,rangeBound.second); gridRanges->SetCellValue(curRangeRow,RNG_COL_END,(tmpStr)); curRangeRow++; } //Add the pending rows gridRanges->AppendRows(incompleteRanges.size()); incompleteRangeOffset=currentRange->getNumRanges(); for(size_t ui=0;uiSetCellValue(curRangeRow,RNG_COL_PLOT,(title)); gridRanges->SetCellValue(curRangeRow,RNG_COL_PARENT_ION,(ionName)); std::string tmpStr; stream_cast(tmpStr,incompleteRanges[ui].getStart()); gridRanges->SetCellValue(curRangeRow,RNG_COL_START,(tmpStr)); stream_cast(tmpStr,incompleteRanges[ui].getEnd()); gridRanges->SetCellValue(curRangeRow,RNG_COL_END,(tmpStr)); for(size_t uj=0;ujSetCellBackgroundColour(curRangeRow,uj,incomplColour); curRangeRow++; } gridRanges->Scroll(viewStartX,viewStartY); if(rowVisibleHint!=(size_t)-1) { ASSERT(rowVisibleHint < gridRanges->GetNumberRows()); gridRanges->MakeCellVisible(rowVisibleHint,0); } gridRanges->Thaw(); programmaticEvent=false; } void RangeEditorDialog::OnListPlots(wxCommandEvent &event) { if(programmaticEvent) return; setCurrentRange(event.GetSelection()); plotWrap.hideAll(); //Set the plot visibility for each plot for(unsigned int ui=0;uiGetCount(); ui++) { unsigned int plotID; plotID = listToPlotIDs[ui]; //Set the plot visibility to match selection plotWrap.setVisible(plotID,listPlots->IsSelected(ui)); } plotPanel->Refresh(); } void RangeEditorDialog::setRangeReady() { bool isReady=true; for(RFMAP::const_iterator it=modifiedRanges.begin(); it!=modifiedRanges.end(); ++it) { if(!it->second.isSelfConsistent() ) { isReady=false; break; } } btnOK->Enable(isReady); } void RangeEditorDialog::OnGridRangesEditorShown(wxGridEvent &event) { event.Skip(); wxLogDebug(wxT("Event handler (RangeEditorDialog::OnGridRangesEditorShown) not implemented yet")); //notify the user that he hasn't implemented the event handler yet } void RangeEditorDialog::OnGridIonsEditorShown(wxGridEvent &event) { if(event.GetRow() < incompleteIonOffset) { //We are editing a regular ion, not an incomplete ion size_t ionId=gridIonIds[event.GetRow()]; ASSERT(ionId < currentRange->getNumIons()); switch(event.GetCol()) { case ION_COL_PLOT: //Can't edit this column event.Veto(); break; case ION_COL_COLOUR: { //Pop up a dialog asking for colour input RGBf rgbf=currentRange->getColour(ionId); wxColourData d; d.SetColour(wxColour((unsigned char)(rgbf.red*255), (unsigned char)(rgbf.green*255), (unsigned char)(rgbf.blue*255), (unsigned char)(255))); auto colDg=new wxColourDialog(this,&d); //Check to see if user actually put in a colour if( colDg->ShowModal() != wxID_OK) { event.Veto(); delete colDg; return; } //Update the colour data in the range wxColour c; c=colDg->GetColourData().GetColour(); rgbf.red=c.Red()/255.0f; rgbf.green=c.Green()/255.0f; rgbf.blue=c.Blue()/255.0f; currentRange->setColour(ionId,rgbf); //Change the colour in the grid wxGridCellAttr *attr = gridIons->GetOrCreateCellAttr( event.GetRow(),ION_COL_COLOUR); attr->SetBackgroundColour(c); delete colDg; //We have to veto the edit event so that the user // doesn't get a text box to type into event.Veto(); //We need to update the plot regions, as they // will have changed colour generatePlotRegions(); break; } case ION_COL_SHORTNAME: case ION_COL_LONGNAME: { //Nothing to do until edit is complete break; } default: ASSERT(false); } } else { size_t delta=event.GetRow() - incompleteIonOffset; switch(event.GetCol()) { case ION_COL_LONGNAME: case ION_COL_SHORTNAME: event.Skip(); break; case ION_COL_PLOT: event.Veto(); break; case ION_COL_COLOUR: { RGBf rgbf=incompleteIons[delta].getColour(); wxColourData d; d.SetColour(wxColour((unsigned char)(rgbf.red*255), (unsigned char)(rgbf.green*255), (unsigned char)(rgbf.blue*255), (unsigned char)(255))); auto colDg=new wxColourDialog(this,&d); if( colDg->ShowModal() != wxID_OK) { delete colDg; return; } wxColour c; //Change the colour c=colDg->GetColourData().GetColour(); rgbf.red=c.Red()/255.0f; rgbf.green=c.Green()/255.0f; rgbf.blue=c.Blue()/255.0f; incompleteIons[delta].setColour(rgbf); delete colDg; //Check to see if the incomplete ion is now done // if so, commit it to the rangefile if(incompleteIons[delta].isFinished()) { incompleteIons[delta].commit(); std::swap(incompleteIons[delta],incompleteIons.back()); incompleteIons.pop_back(); generateIonEntries(); } else { unsigned char r,g,b,a; r=rgbf.red*255.0f; g=rgbf.green*255.0f; b=rgbf.blue*255.0f; a=255; gridIons->SetCellBackgroundColour(event.GetRow(), ION_COL_COLOUR,wxColour(r,g,b,a)); } event.Veto(); break; } default: ASSERT(false); } } setRangeReady(); } void RangeEditorDialog::OnGridRangesCellChange(wxGridEvent &event) { if(programmaticEvent) return; programmaticEvent=true; std::string newContent; newContent=stlStr(gridRanges->GetCellValue(event.GetRow(),event.GetCol())); if(event.GetRow() >= incompleteRangeOffset) { //Process an incomplete range in the grid size_t delta=event.GetRow() - incompleteRangeOffset; RangeFile &r = *(incompleteRanges[delta].getRangePtr()); switch(event.GetCol()) { case RNG_COL_PLOT: break; case RNG_COL_PARENT_ION: { //Check to see if we have the ion name already unsigned int newID = r.getIonID(newContent); if( newID== (unsigned int)-1) { event.Veto(); programmaticEvent=false; return; } incompleteRanges[delta].setParentId(newID); break; } case RNG_COL_START: { float tmp; if(stream_cast(tmp,newContent)) { event.Veto(); programmaticEvent=false; return; } incompleteRanges[delta].setStart(tmp); break; } case RNG_COL_END: { float tmp; if(stream_cast(tmp,newContent)) { event.Veto(); programmaticEvent=false; return; } incompleteRanges[delta].setEnd(tmp); break; } default: { ASSERT(false); } } //if the range is complete, add it if(incompleteRanges[delta].isFinished()) { incompleteRanges[delta].commit(); std::swap(incompleteRanges[delta],incompleteRanges.back()); incompleteRanges.pop_back(); } generateRangeEntries(); //Re-generate the plot regions, as they have been changed now generatePlotRegions(); programmaticEvent=false; return; } //We have a pre-existing range that is being modified //Find out which range was latered size_t rangeId; rangeId=gridRangeIds[event.GetRow()]; switch(event.GetCol()) { case RNG_COL_PLOT: break; case RNG_COL_PARENT_ION: { unsigned int newID = currentRange->getIonID(newContent); if( newID== (unsigned int)-1) { event.Veto(); programmaticEvent=false; return; } currentRange->setIonID(rangeId,newID); break; } case RNG_COL_START: { float f; if(stream_cast(f,newContent)) { event.Veto(); programmaticEvent=false; return; } //Disallow inversion of range start/end if(f >=currentRange->getRange(rangeId).second) { event.Veto(); programmaticEvent=false; return; } currentRange->setRangeStart(rangeId,f); break; } case RNG_COL_END: { float f; if(stream_cast(f,newContent)) { event.Veto(); programmaticEvent=false; return; } //Disallow inversion of range start/end if(f <=currentRange->getRange(rangeId).first) { event.Veto(); programmaticEvent=false; return; } currentRange->setRangeEnd(rangeId,f); break; } default: ASSERT(false); } //Re-generate the altered plot regions generatePlotRegions(); programmaticEvent=false; setRangeReady(); } void RangeEditorDialog::OnGridIonsCellChange(wxGridEvent &event) { if(programmaticEvent) return; std::string newContent; newContent=stlStr(gridIons->GetCellValue(event.GetRow(),event.GetCol())); if(event.GetRow()>= incompleteIonOffset) { size_t delta=event.GetRow() - incompleteIonOffset; PendingIon &p = incompleteIons[delta]; switch(event.GetCol()) { case ION_COL_PLOT: //Can't edit this column event.Veto(); break; case ION_COL_COLOUR: //Already handled break; case ION_COL_SHORTNAME: { //Check to see if the name already exists, if it does, then veto the event if(p.getRangePtr()->getIonID(newContent.c_str()) == (unsigned int) - 1) p.setShortName(newContent); else event.Veto(); break; } case ION_COL_LONGNAME: { //Check to see if the name already exists, if it does, then veto the event if(p.getRangePtr()->getIonID(newContent.c_str(),false) == (unsigned int) - 1) p.setLongName(newContent); else event.Veto(); break; } default: ASSERT(false); } //if the range is complete, add it if(incompleteIons[delta].isFinished()) { incompleteIons[delta].commit(); std::swap(incompleteIons[delta],incompleteIons.back()); incompleteIons.pop_back(); generateIonEntries(); } return; } //Find out which ion was latered size_t ionId; ionId=gridIonIds[event.GetRow()]; switch(event.GetCol()) { case ION_COL_COLOUR: //already handled on cell editor shown- do nothing break; case ION_COL_SHORTNAME: currentRange->setIonShortName(ionId,newContent); break; case ION_COL_LONGNAME: currentRange->setIonLongName(ionId,newContent); break; case ION_COL_PLOT: //veto event.Veto(); break; default: ASSERT(false); } setRangeReady(); } void RangeEditorDialog::OnGridRangeClick(wxGridEvent &cmd) { lastFocused=GRID_FOCUS_RANGES; cmd.Skip(); } void RangeEditorDialog::OnGridIonClick(wxGridEvent &cmd) { lastFocused=GRID_FOCUS_IONS; cmd.Skip(); } void RangeEditorDialog::OnBtnRangeIonAdd(wxCommandEvent &event) { //If there are no grids then the user cannot focus them, // so in this case, give the user the option of selecting what action to take if(lastFocused == GRID_FOCUS_NONE || !gridRanges->GetNumberRows() || !gridIons->GetNumberRows()) { wxArrayString wxStrs; wxStrs.Add(("Ion")); wxStrs.Add(("Range")); wxSingleChoiceDialog *wxD = new wxSingleChoiceDialog(this, TRANS("Range or ion?"), TRANS("Select type to add"),wxStrs,(void **)NULL,wxDEFAULT_DIALOG_STYLE|wxOK|wxCENTRE); wxD->ShowModal(); if(wxD->GetSelection() == 0) lastFocused=GRID_FOCUS_IONS; else lastFocused=GRID_FOCUS_RANGES; } //Update either the range or ion grid with a new pending item. ASSERT(currentRange); switch(lastFocused) { case GRID_FOCUS_RANGES: { incompleteRanges.emplace_back(PendingRange(currentRange)); size_t visibleRowHint=gridRanges->GetNumberRows(); generateRangeEntries(visibleRowHint); break; } case GRID_FOCUS_IONS: { incompleteIons.emplace_back(PendingIon(currentRange)); size_t visibleRowHint=gridIons->GetNumberRows(); generateIonEntries(visibleRowHint); break; } default: ASSERT(false); } setRangeReady(); } void RangeEditorDialog::OnBtnRangeIonRemove(wxCommandEvent &event) { switch(lastFocused) { case GRID_FOCUS_RANGES: { size_t row=gridRanges->GetGridCursorRow(); //TODO: Better selection handling // - grids are notoriously bad at selection in wx if(!gridRanges->GetNumberRows() || row == wxNOT_FOUND) break; if(row < incompleteRangeOffset) { //Find the mapping between the range, then kill it size_t rangeId = gridRangeIds[row]; //Kill the range currentRange->eraseRange(rangeId); } else { size_t delta=row - incompleteRangeOffset; //Remove the pending range std::swap(incompleteRanges[delta], incompleteRanges.back()); incompleteRanges.pop_back(); } //relayout the grid generateRangeEntries(); //Update plot generatePlotRegions(); break; } case GRID_FOCUS_IONS: { size_t row=gridIons->GetGridCursorRow(); //TODO: Better selection handling // - grids are notoriously bad at selection in wx if(!gridIons->GetNumberRows() || row == wxNOT_FOUND) break; if(row < incompleteIonOffset) { //Find the mapping between the range, then kill it size_t ionId = gridIonIds[row]; //Kill the ion, and any of its ranges currentRange->eraseIon(ionId); } else { size_t delta=row - incompleteIonOffset; //Remove the pending range std::swap(incompleteIons[delta], incompleteIons.back()); incompleteIons.pop_back(); } //relayout the grids, then update plot generateIonEntries(); generateRangeEntries(); generatePlotRegions(); break; } case GRID_FOCUS_NONE: { break; } default: ASSERT(false); } setRangeReady(); } void RangeEditorDialog::OnCheckShowOverlay(wxCommandEvent &event) { plotWrap.overlays.setEnabled(event.IsChecked()); plotPanel->Refresh(); } void RangeEditorDialog::OnBtnOK(wxCommandEvent &event) { EndModal(wxID_OK); } void RangeEditorDialog::OnBtnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } void RangeEditorDialog::OnListOverlayCheck(wxCommandEvent &event) { long index=event.GetInt(); bool isChecked; isChecked=listOverlay->IsChecked(index); plotWrap.overlays.setEnabled(index,isChecked); plotPanel->Refresh(); } void RangeEditorDialog::OnListOverlayKeyDown(wxListEvent &event) { //Check for delete key if(event.GetKeyCode() != WXK_DELETE) return; long index=event.GetIndex(); plotWrap.overlays.erase(index); generateOverlayList(plotWrap.overlays.getOverlays()); plotPanel->Refresh(); } void RangeEditorDialog::OnSashVerticalDClick(wxSplitterEvent &event) { event.Veto(); } void RangeEditorDialog::OnTextOverlay(wxCommandEvent &event) { std::string compoundString; compoundString=stlStr(textOverlayCmpnt->GetValue()); vector > ionFragments; if(RangeFile::decomposeIonNames(compoundString,ionFragments)) { textOverlayCmpnt->SetDefaultStyle(wxTextAttr(*wxBLUE)); } else { textOverlayCmpnt->SetDefaultStyle(wxTextAttr(wxNullColour)); } } void RangeEditorDialog::OnTextOverlaySetFocus(wxFocusEvent &event) { if(!haveSetTextFocus) { haveSetTextFocus=true; textOverlayCmpnt->SetValue(wxT("")); } else event.Skip(); } void RangeEditorDialog::OnTextOverlayEnter(wxCommandEvent &event) { //Obtain the user input for the text control std::string compoundString; compoundString = stlStr(textOverlayCmpnt->GetValue()); //break the users' input into vector > ionFragments; if(!RangeFile::decomposeIonNames(compoundString,ionFragments)) return; //Check to see if each component has a matching symbol for all elements //---- bool symbolsFound; vector indicies; vector symbols; //Get the indices for each gragment symbols.resize(ionFragments.size()); for(size_t ui=0;uiSetBackgroundColour(wxColour(*wxCYAN)); return; } textOverlayCmpnt->SetBackgroundColour(wxNullColour); //---- //Get the intensity distribution //---- vector fragmentCount; size_t totalFragments=0; fragmentCount.resize(ionFragments.size()); for(size_t ui=0;ui MAX_FRAGMENT_COUNT) { textOverlayCmpnt->SetBackgroundColour(wxColour(*wxCYAN)); return; } //Number of times to "fold" the intensity distribution const size_t MAX_FOLD_VALUE=3; OVERLAY_DATA overlay; overlay.title=compoundString; overlay.enabled=true; for(size_t ui=0;ui > massDist; abundanceData.generateIsotopeDist(indicies,fragmentCount,massDist,ui+1); for(size_t uj=0;ujRefresh(); } // wxGlade: add RangeEditorDialog event handlers void RangeEditorDialog::set_properties() { // begin wxGlade: RangeEditorDialog::set_properties SetTitle(TRANS("Range Editor")); gridRanges->CreateGrid(0, 3); gridIons->CreateGrid(0, 3); checkShowOverlay->SetToolTip(TRANS("Enable or disable all overlays")); listOverlay->SetToolTip(TRANS("Entered overlays, use delete to remove")); listPlots->SetToolTip(TRANS("Available plots for ranging")); textOverlayCmpnt->SetToolTip(TRANS("Enter species to display as overlay, e.g. SiO2")); gridRanges->SetToolTip(TRANS("Editable ranges")); gridIons->SetToolTip(TRANS("Editable ions")); // end wxGlade } void RangeEditorDialog::do_layout() { // begin wxGlade: RangeEditorDialog::do_layout wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerBottom = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerNote = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerOverlayPane = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerOverlay = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerOverlayContainer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerOverlayLeft = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerRanges = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerRangeBottom = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerPlotList = new wxBoxSizer(wxVERTICAL); sizerPlotList->Add(listPlots, 1, wxEXPAND, 0); noteLeftPlots->SetSizer(sizerPlotList); sizerRanges->Add(gridIons, 1, wxALL|wxEXPAND, 4); sizerRanges->Add(gridRanges, 1, wxALL|wxEXPAND, 4); sizerRangeBottom->Add(20, 20, 1, 0, 0); sizerRangeBottom->Add(btnRangeIonAdd, 0, wxALL, 4); sizerRangeBottom->Add(btnRangeIonRemove, 0, wxALL, 4); sizerRanges->Add(sizerRangeBottom, 0, wxALL|wxEXPAND, 4); noteLeftRanges->SetSizer(sizerRanges); sizerOverlay->Add(checkShowOverlay, 0, wxALL, 5); sizerOverlayLeft->Add(textOverlayCmpnt, 0, wxEXPAND, 0); sizerOverlayContainer->Add(sizerOverlayLeft, 0, wxALL|wxEXPAND, 2); sizerOverlayContainer->Add(listOverlay, 1, wxEXPAND, 0); sizerOverlay->Add(sizerOverlayContainer, 1, wxEXPAND, 0); sizerOverlayPane->Add(sizerOverlay, 1, wxEXPAND, 0); noteLeftOverlay->SetSizer(sizerOverlayPane); notebookLeft->AddPage(noteLeftPlots, TRANS("Plots")); notebookLeft->AddPage(noteLeftRanges, TRANS("Ranges")); notebookLeft->AddPage(noteLeftOverlay, TRANS("Overlay")); sizerNote->Add(notebookLeft, 1, wxEXPAND, 0); panelSplitLeft->SetSizer(sizerNote); sizerRight->Add(plotPanel, 1, wxEXPAND, 0); sizerBottom->Add(20, 20, 1, 0, 0); sizerBottom->Add(btnOK, 0, wxALL, 4); sizerBottom->Add(btnCancel, 0, wxALL, 4); sizerRight->Add(sizerBottom, 0, wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 4); panelSplitRight->SetSizer(sizerRight); splitVertical->SplitVertically(panelSplitLeft, panelSplitRight); topSizer->Add(splitVertical, 1, wxEXPAND, 0); SetSizer(topSizer); topSizer->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.22/src/gui/dialogs/autosaveDialog.cpp0000644000175000017500000001057013331600075021123 0ustar pcuserpcuser/* * autosaveDialog.cpp - Selection of autosaves for hard program restarts * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Thu Jun 7 12:47:44 2012 #include "autosaveDialog.h" #include "wx/wxcommon.h" #include "common/translation.h" // begin wxGlade: ::extracode // end wxGlade AutosaveDialog::AutosaveDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { selectedItem=(size_t)-1; haveRemovedItems=false; // begin wxGlade: AutosaveDialog::AutosaveDialog const wxString *listStates_choices = NULL; listStates = new wxListBox(this, ID_LIST_STATES, wxDefaultPosition, wxDefaultSize, 0, listStates_choices, wxLB_SINGLE|wxLB_NEEDED_SB); btnRemoveAll = new wxButton(this, ID_REMOVE_ALL, TRANS("Remove &All")); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); btnOK = new wxButton(this, wxID_OK, wxEmptyString); btnOK->Enable(false); set_properties(); do_layout(); // end wxGlade //Force setting focus on the list control, because otherwise, pressing ESCAPE doesn't work for the user listStates->SetFocus(); } BEGIN_EVENT_TABLE(AutosaveDialog, wxDialog) // begin wxGlade: AutosaveDialog::event_table EVT_LISTBOX_DCLICK(ID_LIST_STATES, AutosaveDialog::OnListStatesDClick) EVT_LISTBOX(ID_LIST_STATES, AutosaveDialog::OnListStates) EVT_BUTTON(ID_REMOVE_ALL, AutosaveDialog::OnRemoveAll) EVT_BUTTON(wxID_CANCEL, AutosaveDialog::OnCancel) EVT_BUTTON(wxID_OK, AutosaveDialog::OnOK) // end wxGlade END_EVENT_TABLE(); void AutosaveDialog::OnListStates(wxCommandEvent &event) { //Get the first selected item selectedItem= listStates->GetSelection(); //Enable the OK button if and only if there is a valid // selection btnOK->Enable(selectedItem != (unsigned int)-1); } void AutosaveDialog::OnListStatesDClick(wxCommandEvent &event) { EndModal(wxID_OK); } void AutosaveDialog::OnRemoveAll(wxCommandEvent &event) { selectedItem=(unsigned int)-1; btnOK->Enable(false); haveRemovedItems=true; btnRemoveAll->Enable(false); listStates->Clear(); listStates->Enable(false); //Force setting focus now on the cancel button , //because otherwise, pressing ESCAPE doesn't work // on the list control btnCancel->SetFocus(); } void AutosaveDialog::OnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } void AutosaveDialog::OnOK(wxCommandEvent &event) { //Require an item to be selected ASSERT(selectedItem != (unsigned int)-1) EndModal(wxID_OK); } // wxGlade: add AutosaveDialog event handlers void AutosaveDialog::setItems( const std::vector &newItems) { for(size_t ui=0;uiInsert((newItems[ui]),ui); } void AutosaveDialog::set_properties() { // begin wxGlade: AutosaveDialog::set_properties SetTitle(TRANS("Restore state?")); // end wxGlade } void AutosaveDialog::do_layout() { // begin wxGlade: AutosaveDialog::do_layout wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_2 = new wxBoxSizer(wxHORIZONTAL); wxStaticText* labelHeader = new wxStaticText(this, wxID_ANY, TRANS("Multiple autosave states were found; would you like to restore one?"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE); sizer_1->Add(labelHeader, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 8); sizer_1->Add(listStates, 1, wxALL|wxEXPAND, 8); sizer_2->Add(btnRemoveAll, 0, wxLEFT|wxBOTTOM, 8); sizer_2->Add(20, 20, 1, 0, 0); sizer_2->Add(btnCancel, 0, wxLEFT|wxRIGHT|wxBOTTOM, 8); sizer_2->Add(btnOK, 0, wxRIGHT|wxBOTTOM, 8); sizer_1->Add(sizer_2, 0, wxEXPAND, 0); SetSizer(sizer_1); sizer_1->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.22/src/gui/dialogs/StashDialog.h0000644000175000017500000000473513305612110020023 0ustar pcuserpcuser/* * stashdialog.h - "Stash" filter storage edit dialog header * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef STASHDIALOG_H #define STASHDIALOG_H #include #include #include #include // end wxGlade #include "./backend/filtertree.h" class VisController; // begin wxGlade: ::extracode #include // end wxGlade class StashDialog: public wxDialog { public: // begin wxGlade: StashDialog::ids // end wxGlade StashDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); void setVisController(VisController *s); private: FilterTree curTree; std::vector > filterTreeMapping; UniqueIDHandler uniqueIds; // begin wxGlade: StashDialog::methods void set_properties(); void do_layout(); void updateList(); void updateGrid(); void updateTree(); bool getStashIdFromList(unsigned int &stashId); // end wxGlade VisController *visControl; protected: // begin wxGlade: StashDialog::attributes wxStaticText* label_5; wxListCtrl* listStashes; wxButton* btnRemove; wxStaticText* label_6; wxTreeCtrl* treeFilters; wxStaticText* label_7; wxPropertyGrid* gridProperties; wxButton* btnOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnListKeyDown(wxListEvent &event); // wxGlade: virtual void OnListSelected(wxListEvent &event); // wxGlade: virtual void OnTreeSelChange(wxTreeEvent &event); // wxGlade: virtual void OnGridEditor(wxPropertyGridEvent &event); virtual void OnBtnRemove(wxCommandEvent &event); void ready(); }; // wxGlade: end class #endif // STASHDIALOG_H 3Depict-0.0.22/src/gui/dialogs/filterErrorDialog.cpp0000644000175000017500000000665113331600075021600 0ustar pcuserpcuser/* * filterErrorDialog.cpp - Dialog for displaying error notices computed from filter tree * Copyright (C) 2018, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.3 on Sun Jun 24 00:03:00 2012 #include "filterErrorDialog.h" #include "wx/wxcommon.h" #include "common/translation.h" //Art for buttons #include // begin wxGlade: ::extracode // end wxGlade using std::string; FilterErrorDialog::FilterErrorDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { // begin wxGlade: FilterErrorDialog::FilterErrorDialog textErrorMessage = new wxTextCtrl(this, wxID_ANY, wxEmptyString,wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE|wxTE_READONLY); bitmapError = new wxStaticBitmap(this, wxID_ANY, wxArtProvider::GetBitmap(wxART_ERROR)); labelError = new wxStaticText(this, wxID_ANY, TRANS("Error")); bitmapWarning = new wxStaticBitmap(this, wxID_ANY,wxArtProvider::GetBitmap(wxART_WARNING)); labelWarning = new wxStaticText(this, wxID_ANY, TRANS("Warning")); btnOK = new wxButton(this, wxID_OK, wxEmptyString); SetTitle(TRANS("Filter Errors")); set_properties(); do_layout(); // end wxGlade } void FilterErrorDialog::set_properties() { // begin wxGlade: FilterErrorDialog::set_properties SetTitle(TRANS("Filter Errors")); SetSize(wxSize(551, 414)); // end wxGlade } void FilterErrorDialog::SetText(const std::vector &text) { std::string bigMessage; for(unsigned int ui=0;uiClear(); textErrorMessage->AppendText((bigMessage)); } void FilterErrorDialog::do_layout() { // begin wxGlade: FilterErrorDialog::do_layout wxBoxSizer* sizerMain = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerKey = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerWarn = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerError = new wxBoxSizer(wxHORIZONTAL); sizerTop->Add(textErrorMessage, 4, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 6); sizerKey->Add(10, 10, 0, 0, 0); sizerError->Add(bitmapError, 0, 0, 0); sizerError->Add(labelError, 0, wxALIGN_CENTER_VERTICAL, 0); sizerKey->Add(sizerError, 0, wxTOP|wxEXPAND, 5); sizerWarn->Add(bitmapWarning, 0, 0, 0); sizerWarn->Add(labelWarning, 0, wxALIGN_CENTER_VERTICAL, 0); sizerKey->Add(sizerWarn, 0, wxTOP|wxEXPAND, 6); sizerKey->Add(20, 20, 0, 0, 0); sizerTop->Add(sizerKey, 1, wxEXPAND, 0); sizerMain->Add(sizerTop, 1, wxEXPAND, 0); sizerMain->Add(btnOK, 0, wxALL|wxALIGN_RIGHT, 5); SetSizer(sizerMain); Layout(); // end wxGlade } 3Depict-0.0.22/src/gui/dialogs/transferFuncDialog.cpp0000644000175000017500000011507113414250067021742 0ustar pcuserpcuser/* * transferFuncDialog.cpp - Transfer function editor dialog * Copyright (C) 2018, D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "transferFuncDialog.h" #include #include #include #include #include #include "common/stringFuncs.h" #ifndef ASSERT #define ASSERT(f) {assert((f));} #endif // begin wxGlade: ::extracode // end wxGlade #include #include using std::vector; using std::pair; using std::make_pair; using namespace std; enum { ID_CHECK_BLUE_OR_VALUE=wxID_ANY+1, ID_CHECK_GREEN_OR_SAT, ID_CHECK_OPACITY, ID_CHECK_RED_OR_HUE, ID_NODE_COLOUR_BUTTON, ID_SAVE_BUTTON, ID_LOAD_BUTTON }; enum { DRAG_MODE_NONE, DRAG_MODE_SINGLE_NODE, DRAG_MODE_NODE_GROUP, }; enum { NODE_TYPE_SINGLE, NODE_TYPE_SET, }; //Gradient panel directions enum { GRADIENT_HORIZ, GRADIENT_VERT }; //Search distance when looking for vertical lines, in window fraction const float GROUP_MATCH_TOLERANCE=0.01; //Radius (in px) that circles should be drawn around nodes const unsigned int NODE_CIRC_RADIUS=4.0f; BEGIN_EVENT_TABLE(wxGradientStopPanel, wxPanel) EVT_PAINT(wxGradientStopPanel::onPaint) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxMultiLineGraphPanel, wxPanel) EVT_PAINT(wxMultiLineGraphPanel::onPaint) EVT_MOTION(wxMultiLineGraphPanel::mouseMove) EVT_LEFT_DOWN(wxMultiLineGraphPanel::mouseDown) EVT_LEFT_UP(wxMultiLineGraphPanel::mouseReleased) END_EVENT_TABLE() wxGradientStopPanel::wxGradientStopPanel(wxWindow *p, wxWindowID wid) : wxPanel(p,wid) { direction=GRADIENT_HORIZ; } void wxGradientStopPanel::setStops(std::vector > &newStops) { stops.swap(newStops); } void wxGradientStopPanel::clearStops() { stops.clear(); } //This routine has serious speed problems. Drawing is very juddery void wxGradientStopPanel::onPaint(wxPaintEvent &evt) { wxPaintDC dc(this); if(!stops.size()) { dc.Clear(); return; } int nx,ny; GetClientSize(&nx,&ny); // Dont use wxGraphicsContext, as it uses cairo and reportedly ends up being unusably slow. //TODO: Use raw memory access as it is probably way faster than wx. // owing to no bounds checking wxImage im(nx,ny); if(!im.IsOk()) { dc.Clear(); return; } //Find out if we need to draw the chequer bool drawChequer=stops.empty(); for(auto & stop : stops) { if(fabs(stop.second.a() - 1.0f) > std::numeric_limits::epsilon()) { drawChequer=true; break; } } //For each X column, fill with same colour unsigned int lStop=0; unsigned int rStop=1; ColourRGBAf lCol,rCol; float fracL,fracR;; lCol=stops[0].second; rCol=stops[1].second; //Draw lower checkerboard, if any points have non-unit opacity if(drawChequer) { //This seems... inefficient? const unsigned int CHEQUER_SIZE=6; for(int ui=0;ui stops[rStop].first) { rStop++; lStop++; lCol=rCol; rCol=stops[rStop].second; } fracL=stops[lStop].first; fracR=stops[rStop].first; //Compute the alpha blend value float blendFrac; if(fracR != fracL) blendFrac = (frac-fracL)/(fracR-fracL); else blendFrac=0.5; //Get colour components float r,g,b,a; r = blendFrac*rCol.r()+(1-blendFrac)*lCol.r(); g = blendFrac*rCol.g()+(1-blendFrac)*lCol.g(); b = blendFrac*rCol.b()+(1-blendFrac)*lCol.b(); a = blendFrac*rCol.a()+(1-blendFrac)*lCol.a(); //Pre-scale for wx r*=255; g*=255; b*=255; //Working down each row, blend the gradient with the // existing pixel data for(unsigned int uj=0;uj<(unsigned int)ny; uj++) { //Compute the final pixel value im.SetRGB(ui,uj,r*a + (1-a)*im.GetRed(ui,uj) , g*a + (1-a)*im.GetGreen(ui,uj), b*a + (1-a)*im.GetBlue(ui,uj)); } } } else { //vertical for(unsigned int ui=0;ui<(unsigned int)ny; ui++) { //Absolute fraction float frac; frac=(float)ui/(float)ny; //Update left and right stops and colours // as needed if( frac > stops[rStop].first) { rStop++; lStop++; lCol=rCol; rCol=stops[rStop].second; } fracL=stops[lStop].first; fracR=stops[rStop].first; float blendFrac; if(fracR != fracL) blendFrac = (frac-fracL)/(fracR-fracL); else blendFrac=0.5; //Get colour components float r,g,b,a; r = blendFrac*rCol.r()+(1-blendFrac)*lCol.r(); g = blendFrac*rCol.g()+(1-blendFrac)*lCol.g(); b = blendFrac*rCol.b()+(1-blendFrac)*lCol.b(); a = blendFrac*rCol.a()+(1-blendFrac)*lCol.a(); r*=255; g*=255; b*=255; //Working down each row, blend the gradient with the // existing pixel data for(unsigned int uj=0;uj<(unsigned int)nx; uj++) { //Compute the final pixel value im.SetRGB(uj,(ny-1)-ui,r*a + (1-a)*im.GetRed(uj,(ny-1)-ui) , g*a + (1-a)*im.GetGreen(uj,(ny-1)-ui), b*a + (1-a)*im.GetBlue(uj,(ny-1)-ui)); } } } //Whew,we've done it! Now blit the final bitmap onto the DC wxBitmap bmp(im); dc.DrawBitmap(bmp,0,0); } bool MultiLineGraph::isSelfConsistent() const { if(lineYData.empty()) return false; if(lineColour.size() !=lineYData.size()) return false; //All y data points should be the same size as the x data for(const auto & data : lineYData) { if(data.size() != xData.size()) return false; } if(boundMin.first >= boundMax.first || boundMin.second >=boundMax.second) return false; return true; } void MultiLineGraph::toWindowFraction(float graphX, float graphY, float &wx,float &wy) const { //x/y bounding dimensions in graph coordinates float xWidth, yWidth; xWidth = boundMax.first - boundMin.first; yWidth = boundMax.second - boundMin.second; wx = graphX - boundMin.first/xWidth; wy = graphY - boundMin.second/yWidth; wy=1.0-wy; //Drawing coords are flipped (y-down) ASSERT(isSelfConsistent()); } void MultiLineGraph::toGraph(float wX, float wY, float &gx,float &gy) const { //x/y bounding dimensions in graph coordinates float xWidth, yWidth; xWidth = boundMax.first - boundMin.first; yWidth = boundMax.second - boundMin.second; //Convert from fractional to graph gx=wX*xWidth+boundMin.first; gy=(1.0-wY)*yWidth+boundMin.second; ASSERT(isSelfConsistent()); } void MultiLineGraph::setActiveNode(unsigned int set, unsigned int n) { selectedNode.first=set; selectedNode.second=n; } void MultiLineGraph::clearActiveNode() { selectedNode.first=selectedNode.second =(unsigned int)-1; } void MultiLineGraph::draw(wxDC &dc) { //If no data, or not self consistent, abort if(xData.size() < 2 || !isSelfConsistent()) return; //Draw the lines between each point int nx,ny; wxWindow *w=nullptr; w=dc.GetWindow(); if(!w) return; w->GetClientSize(&nx,&ny); //If we can't see the window don't draw if(!nx || !ny) return; wxPen pen; //Draw vertical bars for each set for(unsigned int ui=0;ui &xd, const std::vector > &yd, const std::vector &colour) { //Set X Data xData=xd; //Set Y Data lineYData=yd; //Resize visiblity mask, making lines visible visibilityMask.resize(lineYData.size()); std::fill(visibilityMask.begin(),visibilityMask.end(),true); //reset selected node selectedNode=make_pair((unsigned int)-1,(unsigned int)-1); lineColour=colour; ASSERT(isSelfConsistent()); } float MultiLineGraph::getXValue(unsigned int node) const { ASSERT(isSelfConsistent()); ASSERT(node < xData.size()); return xData[node]; } void MultiLineGraph::setNodeByFraction(unsigned int set, unsigned int node, float fx, float fy) { ASSERT(node < xData.size()); ASSERT(lineYData.size() && node< lineYData[0].size()); float gx,gy; toGraph(fx,fy,gx,gy); gy=std::max(boundMin.second,gy); gy=std::min(boundMax.second,gy); lineYData[set][node]=gy; ASSERT(isSelfConsistent()); } unsigned int MultiLineGraph::projectToNearestLine(float gx, float gy, float &projY) const { unsigned int greaterOrEqIdx=0; //Find the X coordinates that bounds the line for(unsigned int ui=0;ui=gx) { greaterOrEqIdx=ui; break; } } //find the two adjacent points unsigned int lx,rx; if(greaterOrEqIdx== 0) { lx=0; rx=1; } else { lx=greaterOrEqIdx-1; rx=greaterOrEqIdx; } //Interpolation fraction float frac =(gx - xData[lx])/ (xData[rx] - xData[lx]); //Loop through the differing traces // then find the intersection at our actual // X position. unsigned int minIdx=(unsigned int)-1; float curMinDelta=std::numeric_limits::max(); float bestY=0; for(unsigned int ui=0;ui delta) { curMinDelta = delta; minIdx=ui; bestY=newY; } } projY=bestY; return minIdx; } bool MultiLineGraph::spliceNewNodes(float gx) { //Find the splice coordinate unsigned int greaterOrEqIdx=0; //Find the X coordinates that bounds the line for(unsigned int ui=0;ui=gx) { greaterOrEqIdx=ui; break; } } //Can't insert node at position 0 // as we have to interpolate if(greaterOrEqIdx == 0) return false; //TODO: Refactor into insertion routine //Extend vector by 1 to make way for our new point //Shuffle X data up a little xData.resize(xData.size()+1); for(unsigned int ui=xData.size(); ui--!=greaterOrEqIdx;) xData[ui]=xData[ui-1]; //Shuffle Y data up a little for(unsigned int uj=0;uj &mask) { ASSERT(mask.size() == lineYData.size()); visibilityMask=mask; } void MultiLineGraph::getVisibilityMask(vector &mask) const { mask=visibilityMask; } void MultiLineGraph::removeSelectedNode() { unsigned int node = selectedNode.second; if(selectedNode.second == (unsigned int)-1) return; ASSERT(xData.size()); //Disallow deletion of edge nodes if(!(node && node < xData.size()-1)) return; for(unsigned int ui=node;ui1); float xMouse,yMouse; //Add a 1px border around control xMouse=(float)(mousePos.x+1)/(float)(w-2); yMouse=(float)(mousePos.y+1)/(float)(h-2); switch(dragMode) { case DRAG_MODE_NONE: { //Perform refresh if required if(mouseHover[0] != xMouse|| mouseHover[1] !=yMouse) { Refresh(); } break; } case DRAG_MODE_SINGLE_NODE: case DRAG_MODE_NODE_GROUP: { //Perform refresh if required if(mouseHover[0] !=xMouse) Refresh(); break; } } //Set node hover coordinates mouseHover[0]=xMouse; mouseHover[1]=yMouse; } void wxMultiLineGraphPanel::mouseLeftClick(wxMouseEvent &event) { int w,h; GetClientSize(&w,&h); wxPoint mousePos =event.GetPosition(); float xMouse,yMouse; xMouse=(float)(mousePos.x+1)/(float)(w-2); yMouse=(float)(mousePos.y+1)/(float)(h-2); //Check to see if we are close to any lines float gX,gY; graph.toGraph(xMouse,yMouse,gX,gY); //Find the distance tolerance in window coordinates // we have to do it in window coords, as a circle in window coords is elliptical in // graph coords, which will be surprising to interaction const float MAX_DISTANCE_FRACTION=0.030; //Find the nearest line unsigned int set; float projY; set=graph.projectToNearestLine(gX,gY,projY); //if no line, abort if(set == (unsigned int)-1) return; float dummyX,winYProj; graph.toWindowFraction(0,projY,dummyX,winYProj); if( fabs(winYProj- yMouse) < MAX_DISTANCE_FRACTION) { graph.spliceNewNodes(gX); Refresh(); } else { //Do nothing } } TransferEditorDialog::TransferEditorDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, style) { // begin wxGlade: TransferEditorDialog::TransferEditorDialog leftColourBar = new wxGradientStopPanel(this, wxID_ANY); leftColourBar->setDirection(GRADIENT_VERT); graphPanel = new wxMultiLineGraphPanel(this, wxID_ANY); textLabelMax = new wxStaticText(this, wxID_ANY, _("Max"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); labelMin = new wxStaticText(this, wxID_ANY, _("Min")); bottomColourBar = new wxGradientStopPanel(this, wxID_ANY); labelTraces = new wxStaticText(this, wxID_ANY, _("Traces")); checkRed_or_Hue = new wxCheckBox(this, ID_CHECK_RED_OR_HUE, _("Red")); checkGreen_or_Sat = new wxCheckBox(this, ID_CHECK_GREEN_OR_SAT, _("Green")); checkBlue_or_value = new wxCheckBox(this, ID_CHECK_BLUE_OR_VALUE, _("Blue")); checkOpacity = new wxCheckBox(this, ID_CHECK_OPACITY, _("Opacity")); colourPickButton = new wxButton(this, ID_NODE_COLOUR_BUTTON, _("Colour")); nodeRemoveButton = new wxButton(this, wxID_REMOVE, wxEmptyString); static_line_1 = new wxStaticLine(this, wxID_ANY); lblFunction = new wxStaticText(this, wxID_ANY, _("Transfer Function")); buttonLoad = new wxButton(this, wxID_OPEN, wxEmptyString); buttonSave = new wxButton(this, wxID_SAVE, wxEmptyString); buttonOK = new wxButton(this, wxID_OK, wxEmptyString); buttonCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); graphPanel->setHorizGradientPanel(bottomColourBar); graphPanel->setVertGradientPanel(leftColourBar); graphPanel->setColourPickButton(colourPickButton); colourPickButton->Enable(false); set_properties(); do_layout(); // end wxGlade initDefault(); completeOK=false; } void TransferEditorDialog::initDefault() { vector xData; vector > yData; vector colData; xData.push_back(0); xData.push_back(1); yData.resize(4); for(unsigned int ui=0;uigraph.setBounds(0,0,1,1); graphPanel->graph.setData(xData,yData,colData); graphPanel->update(); } void TransferEditorDialog::set_properties() { // begin wxGlade: TransferEditorDialog::set_properties SetTitle(_("Transfer Function Editor")); leftColourBar->SetMinSize(wxSize(20, 1)); leftColourBar->SetBackgroundColour(wxColour(255, 255, 255)); leftColourBar->SetToolTip(_("Colour chosen by moving selected node up-down")); graphPanel->SetBackgroundColour(wxColour(255, 255, 255)); graphPanel->SetToolTip(_("Drag nodes to move, click to add nodes")); bottomColourBar->SetBackgroundColour(wxColour(255, 255, 255)); bottomColourBar->SetToolTip(_("Final colour scale")); checkRed_or_Hue->SetValue(1); checkGreen_or_Sat->SetValue(1); checkBlue_or_value->SetValue(1); checkOpacity->SetValue(1); colourPickButton->SetToolTip(_("Adjust node group's colour")); nodeRemoveButton->SetToolTip(_("Remove the selected node")); // end wxGlade } void TransferEditorDialog::do_layout() { // begin wxGlade: TransferFunctionDialog::do_layout wxBoxSizer* topLevelSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* rightSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* exitButtonSizer = new wxBoxSizer(wxHORIZONTAL); wxStaticBoxSizer* nodeControlSizer = new wxStaticBoxSizer(new wxStaticBox(this, wxID_ANY, _("Node Properties")), wxVERTICAL); wxBoxSizer* sizer_2 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_1 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* checkLabelSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* checkSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* leftSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* bottomBarSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* spacerBarSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* graphHorizSizer = new wxBoxSizer(wxHORIZONTAL); graphHorizSizer->Add(leftColourBar, 0, wxALIGN_CENTER|wxALL|wxEXPAND, 5); graphHorizSizer->Add(graphPanel, 1, wxALIGN_CENTER|wxALL|wxEXPAND, 5); leftSizer->Add(graphHorizSizer, 15, wxEXPAND, 0); spacerBarSizer->Add(20, 20, 1, wxEXPAND|wxLEFT|wxRIGHT, 0); spacerBarSizer->Add(textLabelMax, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT, 0); leftSizer->Add(spacerBarSizer, 0, wxEXPAND, 0); bottomBarSizer->Add(labelMin, 0, 0, 0); bottomBarSizer->Add(bottomColourBar, 1, wxALIGN_CENTER|wxALL|wxEXPAND, 1); leftSizer->Add(bottomBarSizer, 0, wxEXPAND, 0); topLevelSizer->Add(leftSizer, 10, wxEXPAND, 0); nodeControlSizer->Add(20, 20, 1, 0, 0); checkLabelSizer->Add(labelTraces, 1, wxALIGN_CENTER|wxALL, 5); checkSizer->Add(checkRed_or_Hue, 0, 0, 0); checkSizer->Add(checkGreen_or_Sat, 0, 0, 0); checkSizer->Add(checkBlue_or_value, 0, 0, 0); checkSizer->Add(checkOpacity, 0, 0, 0); checkLabelSizer->Add(checkSizer, 1, wxLEFT|wxRIGHT, 5); checkLabelSizer->Add(20, 20, 1, 0, 0); nodeControlSizer->Add(checkLabelSizer, 1, 0, 0); nodeControlSizer->Add(20, 20, 1, 0, 0); sizer_1->Add(colourPickButton, 0, wxALIGN_CENTER|wxALL, 5); sizer_1->Add(nodeRemoveButton, 0, wxALIGN_CENTER|wxALIGN_RIGHT|wxALL, 5); nodeControlSizer->Add(sizer_1, 1, 0, 0); nodeControlSizer->Add(static_line_1, 0, wxALL|wxEXPAND, 2); nodeControlSizer->Add(lblFunction, 0, 0, 0); sizer_2->Add(buttonLoad, 0, wxALIGN_CENTER|wxALL, 5); sizer_2->Add(buttonSave, 0, wxALIGN_CENTER|wxALL, 5); nodeControlSizer->Add(sizer_2, 1, 0, 0); rightSizer->Add(nodeControlSizer, 15, wxEXPAND, 0); exitButtonSizer->Add(buttonOK, 0, wxALL, 5); exitButtonSizer->Add(buttonCancel, 0, wxALL, 4); rightSizer->Add(exitButtonSizer, 1, wxALIGN_BOTTOM|wxALL, 5); topLevelSizer->Add(rightSizer, 0, wxEXPAND, 0); SetSizer(topLevelSizer); topLevelSizer->Fit(this); SetMinSize(wxSize(600,200)); Layout(); // end wxGlade } wxMultiLineGraphPanel::wxMultiLineGraphPanel(wxWindow* parent, wxWindowID id) :wxPanel(parent,id) { dragMode=DRAG_MODE_NONE; curSet=curNode=-1; graphTieX[0]=graphTieY[0] = graphTieX[1]=graphTieY[1]=-1; mouseHover[0]=mouseHover[1]=-1; horizGradientPanel=0; vertGradientPanel=0; } void wxMultiLineGraphPanel::mouseDown(wxMouseEvent &event) { int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; if(!graph.numXPts()) return; //Do our calculations in reduced coordinates (0->1); float xMouse,yMouse; wxPoint mousePos =event.GetPosition(); //Add a 1px border around control xMouse=(float)(mousePos.x+1)/(float)(w-2); yMouse=(float)(mousePos.y+1)/(float)(h-2); switch(dragMode) { case DRAG_MODE_NONE: { unsigned int index,lineIndex; index=graph.getNodeIndex(xMouse,yMouse,lineIndex); if(index != (unsigned int) -1) { //Change the selection mode dragMode=DRAG_MODE_SINGLE_NODE; curNode=index; curSet=lineIndex; graph.setActiveNode(curSet,curNode); //Set tie points, so we can draw lines during // user drag //-- graph.getAdjacentNodeCoords(curSet,curNode, graphTieX,graphTieY); for(unsigned int ui=0;ui<2;ui++) { if(graphTieX[ui] >=0 && graphTieY[ui] >=0) { float fx,fy; graph.toWindowFraction(graphTieX[ui],graphTieY[ui], fx,fy); graphTieX[ui]=fx*w; graphTieY[ui]=fy*h; } } update(); } else { //Check for grabbing a vertical line //Try to see if we have a valid set index index=graph.getGroupIndex(xMouse,GROUP_MATCH_TOLERANCE); if(index !=(unsigned int)-1) { dragMode=DRAG_MODE_NODE_GROUP; curNode=index; } } break; } case DRAG_MODE_SINGLE_NODE: //Do nothing break; default: // ASSERT(false); ; } Refresh(); } unsigned int MultiLineGraph::getNodeIndex(float fracX, float fracY, unsigned int &lineIndex) const { lineIndex=(unsigned int)-1; if(!xData.size()) return (unsigned int)-1; //Node search radius in Window Fraction const float SEARCH_RADIUS_SQR=0.05f*0.05f; unsigned int minIndex[2]={(unsigned int)-1,(unsigned int) -1}; float minSqrRadius=SEARCH_RADIUS_SQR; //First perform a 2D search for nodes //----- for(unsigned int ui=0;ui